ssh-keygen 개인 키와 libressl의 차이점은 무엇입니까?

ssh-keygen 개인 키와 libressl의 차이점은 무엇입니까?

curve 를 사용하여 libressl 3.0을 사용하여 개인 키를 생성했습니다 secp521r1.

openssl genpkey -aes128 -algorithm EC -pkeyopt ec_paramgen_curve:secp521r1 -pkeyopt ec_param_enc:named_curve

내가 아는 한 이 곡선은 ssh-keygen이 ssh-keygen -t ecdsa -b 521개인 키를 암호화하기 위해 aes128을 사용한다는 것을 알고 있는 문서에서 ssh-keygen이 사용하는 것과 동일합니다.

libressl 개인 키의 크기는 534이고 ssh-keygen 개인 키의 크기는 입니다 736.

내 질문은: ssh-keygen이 키 크기를 늘리는 추가 작업을 수행하는 방법은 무엇입니까?

또한: 둘 다 교환 가능합니까? 한 곳에서 생성된 개인 키를 다른 곳으로 변환할 수 있나요?

답변1

TLDR: 개인키 파일에는 다양한 형식이 있습니다

그리고 그것은 부분적으로 귀하가 제공하지 않은 OpenSSH 버전에 따라 다릅니다.

역사적으로 오랫동안 사용되지 않는 프로토콜 버전 1(및 키 유형 'rsa1')을 제외하고 OpenSSH는 OpenSSL(libcrypto 부분)을 사용하여 개인 키(또는 사실상 키 쌍)를 파일에 저장하는 것을 포함하여 대부분의 암호화 작업을 수행했습니다. 그만큼SSLeay/OpenSSL에서 정의한 '전통적인' 또는 '레거시' 형식. OpenSSL은 또한 (다소) 더 안전한 '새로운'(1998년 이후!) PKCS8 형식을 지원합니다. 따라서 OpenSSL에서 "ECDSA"(보다 정확하게는 X9.62 ECDSA 및 X9.63 ECDH를 모두 포함하는 X9 스타일 Weierstrass EC)에 대해 지원되는 4가지 PEM 형식이 있습니다.생성하다단 2개만(libcrypto를 사용하여) 모두 읽을 수 있습니다. ssh-keygen암호화할 때OpenSSL 형식파일의 경우 최신 버전에서는 AES-128-CBC를 사용하지만 항상 그런 것은 아닙니다.

2014-01년 릴리스 6.5부터OpenSSH에 자체 '새로운' 파일 형식이 추가되었습니다., 부분적으로는 OpenSSL 레거시 형식(암호화 시)보다 더 나은 보안을 제공하고 부분적으로는 당시 OpenSSL이 전혀 지원하지 않았던 새로운 알고리즘 Ed25519를 지원하기 위한 것입니다. ed25519(또는 rsa1) 이외의 키 유형에 대해 새 형식을 요청할 수 있는 ssh-keygen옵션이 있었으며 -o지난 몇 년 동안 이 옵션을 참조하고 일반적으로 권장하는 많은 Stack Q 및 A를 찾을 수 있습니다. '새' 형식 파일은 기본적으로 AES256-CBC로 암호화되며 로 재정의될 수 있지만 -Z ciphername매뉴얼 페이지는 이들 중 하나에 대해 업데이트되지 않은 것으로 보입니다. 2018-08년 릴리스 7.8부터 OpenSSH는 이제 모든 키 유형에 대해 기본적으로 '새' 형식을 사용하지만 -m pemed25519 이외의 항목에 대해 OpenSSL 형식을 요청하는 데 사용할 수 있습니다 . 시스템을 확인하면 man ssh-keygen(Windows가 아닌 경우) 이러한 사례 중 하나(아마도 후자)가 설명되어 있을 것입니다.

(OpenSSL이 지원하는 PFX 형식이라고도 하는 PKCS12도 있습니다.~할 수 있다개인 키에 사용되지만 일반적으로 개인 키(또는 여러 개)를 해당 키에 대한 하나 이상의 X.509 인증서와 결합하는 데만 사용됩니다. 이는 상황이 다르며 SSH에는 적용되지 않습니다. X.509 인증서를 사용하지 않습니다. 다른 프로그램이나 시스템은 다른 형식을 사용합니다. '상업용'/Tectia SSH에는 자체 형식이 있고 PuTTY에는 자체 형식 PPK = PuTTY 개인 키가 있습니다. 기타 등등, 율 브린너(Yul Brynner). 이들 모두는 의미상 동일하며 적절한 도구가 제공되면 상호 변환될 수 있습니다.)

OpenSSH에서 사용되는 모든 개인 키 형식은 다음과 같습니다.PEM 스타일; 이진 데이터는 다음 형식의 헤더 및 트레일러 줄이 포함된 base64로 텍스트로 인코딩됩니다.

-----BEGIN (something)-----
(sometimes some headers here)
(data encoded in base64, broken into lines of 64 characters)
-----END (something)-----

대시-BEGIN 줄만 보면 어떤 형식을 사용하고 있는지 알 수 있습니다. 거의 교차된 내용 보기https://security.stackexchange.com/questions/39279/stronger-encryption-for-ssh-keys또는 더 짧게https://security.stackexchange.com/questions/129724/how-to-check-if-an-ssh-private-key-has-passphrase-or-not그리고https://security.stackexchange.com/questions/200935/how-do-i-determine-if-an-existing-ssh-private-key-is-secure(내 거).

차이점들:ecdsa-p521 키의 736자 크기가 OpenSSH 새 형식과 일치합니다.암호화되지 않은-- 당신은확신하는암호를 줬어? -- 그리고 534는 LibreSSL이 포크될 때 IIRC인 OpenSSL 1.0.2에서 생성된 PKCS8 암호화 형식과 일치합니다. (OpenSSL 1.1.0 up은 PBKDF2에서 HMAC-SHA256을 사용하도록 PKCS8 암호화를 변경하므로 파일이 약간 더 커집니다. OpenSSL 1.1.0 up은 또한 param_enc=named를 기본값으로 지정하므로 더 이상 지정할 필요가 없습니다.) OpenSSH new 형식은 뚜렷한 이유 없이 공개 키 값(ECDSA의 경우 X9.62 형식의 곡선 점)을 저장하기 때문에 PKCS8-enc 형식보다 큽니다.두 배-- 공개 키에 대해 지정된 파일 섹션에 한 번, 그리고다시privatekey에 대해 지정된 섹션에 있습니다. 또한 OpenSSH 형식은 대부분의 메타데이터를 텍스트 문자열로 갖고 모든 길이 필드는 4바이트인 반면, PKCS8(OpenSSL 레거시 형식과 유사)은 가변 길이 필드가 대부분 1바이트인 ASN.1을 사용하고 메타데이터는 대부분 바이너리입니다. 사용된 알고리즘은 'OID'입니다.)

또한: 둘 다 교환 가능합니까? 한 곳에서 생성된 개인 키를 다른 곳으로 변환할 수 있나요?

예, 아니오. 언급한 바와 같이 OpenSSL을 사용하는 OpenSSH는 PKCS8을 읽을 수 있지만 쓸 수는 없으므로 ssh-keygennull 변경을 수행하여 OpenSSH-new로 변환할 수 있습니다. 즉, 비밀번호를 기존 값으로 '변경'합니다. 6.5에서 7.7까지 지정해야 하며 -o7.8 이상에서는 이것이 기본값입니다. 다른 방향으로 가면 OpenSSL 레거시로 변환할 수 있지만 PKCS8로 직접 변환할 수는 없습니다. 이를 수행하려면 명시적으로 또는 1.0.0 이상(지금쯤이면 모든 사람, 확실히 모두 LibreSSL이어야 함)에서 ssh-keygen사용해야 합니다 . (전자는 기본적으로 암호화되고 후자는 암호화되지 않지만 둘 다 재정의할 수 있습니다.)opensslpkcs8 -topk8pkey

관련 정보