ssh-keygen 공개 키를 openssl PEM_read_bio_RSA_PUBKEY () 함수가 사용하는 형식으로 변환하는 방법은 무엇입니까?


49

openssl PEM_read_bio_RSA_PUBKEY()함수가 사용할 수 있는 공개 키를 생성하는 데 문제 가 있습니다. 계속 오류가 발생합니다.

분명히 ssh-keygen <>.pubSSH 파일 형식이거나 SubjectPublicKeyInfo구조 일 수 있으므로 키 파일 에서 ASCII 문자열을 사용할 수는 없습니다 .

핵심 gen 코드는 다음과 같습니다. ssh-keygen -t rsa -b 1024 -C "Test Key"

웹에서 PHP로 공개 키의 내용을 base64 PEM ASCII 문자열 형식으로 변환하는 변환기를 찾았습니다. 그러나이 기능은 여전히 ​​좋아하지 않습니다.

Openssl 설명서에는 다음이 명시되어 있습니다.

  1. “EVP_PKEY 구조를 사용하여 공개 키를 처리하는 RSA_PUBKEY () 함수”
  2. “RSA_PUBKEY 함수는 RSA 구조를 사용하여 RSA 공개 키를 처리합니다”

OpenSSL 기능이 사용하는 형식으로 OpenSSH 공개 키를 가져 오려면 어떻게합니까?


이것을 알아 냈습니다 : openssl 도구를 다음과 같이 사용하십시오 :
PeteP

개인 키 생성 : openssl genrsa -out test.priv.key 2048; 동일한 형식 (? PEM)에서 출력 공개 키 : OpenSSL을 RSA -in test.priv.key -pubout -out test.pub.key
PeteP

답변:


56

승인!

그래서 나는 "쉽게, 나는 이것을 얻었다"라는 생각에 들어갔다. 내가 생각했던 것보다 훨씬 더 많은 것이 있다는 것이 밝혀졌습니다.

따라서 첫 번째 문제는 OpenSSL (man 3 pem) 매뉴얼 페이지에 따르면 RSA 키가 PKCS # 1 형식 일 것으로 예상한다는 것입니다. 분명히 이것은 ssh-keygen이 작동하는 것이 아닙니다. 두 가지 옵션이 있습니다 (검색 중).

OpenSSH v. 5.6 이상 (노트북에없는 경우)이있는 경우 다음을 실행할 수 있습니다.

ssh-keygen -f key.pub -e -m pem

더 긴 방법은 SSH 키를 다양한 구성 요소로 분리하는 것입니다 ( 블로그 항목 은 OpenSSH가 "독점적"이라고 비난했습니다. "독특하다"고 선호합니다). 그리고 ASN1 라이브러리를 사용하십시오. 사물을 교환합니다.

다행스럽게도 누군가가 코드를 작성했습니다.

https://gist.github.com/1024558


9
ssh-keygen방법은 Linux에서는 작동하지만 Mac OS X에서는 작동하지 않는 것 같습니다.
lid

3
뚜껑, SSH 버전에 대한 답변의 메모를 참조하십시오. OS X은 최신 버전의 OpenSSH를 제공하지 않습니다. 명령을 실행하십시오 ssh -V.
Brian Redbeard

3
에서 작동하지 않습니다 OpenSSH_6.2p2. 에서 작동 OpenSSH_6.6p1합니다.
Old Pro

-m나를 위해 작동하지 않습니다 ... 해결 방법은 무엇입니까?
pstanton

2
Mac에서 작동합니다!
그렉 혼비

18

SSH 개인 키가 있다고 가정하면 다음 id_rsa과 같이 공개 키를 추출 할 수 있습니다.

openssl rsa -in id_rsa -pubout -out id_rsa.pub.pem

OP가 공개 키 변환에 대해 물었 으므로이 질문에 대답하지는 못했지만 어쨌든 도움이 될 것이라고 생각했습니다.

또한이 명령의 결과로 PEM 공개 키 형식이 생성되며 이는 일반적으로 OpenSSL이 기대하는 것입니다. 반면에 Brian의 대답은 RSAPublicKey 형식의 파일을 생성하는데, OpenSSL에서 예상되는 일반적인 형식이 아닙니다 (이후 버전에서는 -RSAPublicKey_in플래그 를 통해 파일을 읽을 수 있음 ). 변환하려면 다음을 수행하십시오.

openssl rsa -RSAPublicKey_in -in id_rsa.rsapub.pem -pubout -out id_rsa.pub.pem

감사합니다. 개인 키의 -pubout은 나를 위해 속였습니다.
Shaun Dewberry

openssl rsa -in id_rsa.pem -pubout -out id_rsa.pub.pem또한 작동합니다 (즉, 입력은 pem 형식 개인 키입니다). 좋은 대답입니다.
Johnny Wong

1
업데이트 : Brian의 대답은 -m pkcs8OpenSSH 사람들이 잘못된 이름을 사용 하더라도 X.509 'PUBKEY'를 생성 하는 것으로 수정되었습니다 . 또한 생성자 -o가 더 나은 보안을 위해 '새 형식' 을 지정한 경우 2014-01의 OpenSSH 6.5 이후이 방법은 작동하지 않으며 2018-08의 7.8 이후 '새 형식'이 이제 기본값입니다.
dave_thompson_085

11

원하는 형식이 ssh-keygen호출 PKCS8됩니다. 따라서 다음 명령은 원하는 출력을 생성합니다.

ssh-keygen -f key.pub -e -m pkcs8

로부터 ssh-keygen매뉴얼 페이지

-m key_format
         Specify a key format for the -i (import) or -e (export) conversion 
         options.  The supported key formats are: 
         ``RFC4716'' (RFC 4716/SSH2 public or private key), 
         ``PKCS8'' (PEM PKCS8 public key) or 
         ``PEM'' (PEM public key).  
         The default conversion format is ``RFC4716''.

이것은 실제로 Linux와 macOS 모두에서 작동합니다.
Jay Taylor

OpenSSL을하려면 openssl RSA -in 키 개인 키와 공개 키를 생성 동등한를 추출하는 -pubout -out key.pub.openssl.pkcs8
Mohannd

6

아래의 Amal Chaudhuri의 방법과 유사하게 이것이 나를 위해 일한 것입니다. SFTP 클라이언트 (Cyberduck)에 대해 생성 한 ssh 공개 키에서 pem 파일을 만들어야했습니다.

openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem

이것은 실제로 작동하지 않는 것 같습니다.
outside2344

5
이것은 공개 키 OP가 요청한 것이 아니라 개인 RSA 키에만 적용됩니다. 오답입니다.
Devy

3
실제로 id_rsa이미 올바른 형식으로되어 있으며 직접 확인할 수 있으며 결과 id_rsa.pem는 100 % 동일합니다.
Miro Kropacek

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.