SSH-PK 인증에서 나중에 사용하기 위해 PKCS12 파일에서 공개 / 개인 키 추출


194

PKCS#12SSH-Public-Key-Authentication에서 나중에 사용하기 위해 파일 에서 공개 및 개인 키를 추출하고 싶습니다 .

지금 .ssh/authorized_key은 클라이언트 측 어딘가에 ssh-keygen을 통해 키를 생성 하고 있습니다.

앞으로 PKCS#12컨테이너 의 키를 사용하고 싶기 때문에 먼저 공개 키를 추출한 PKCS#12다음 .ssh/authorized_keys파일에 넣습니다 . 이 작업을 통해 얻을 수있는 기회가 openssl있습니까? 키가 PKCS#12ssh-public-key 인증과 호환됩니까?

답변:


284

다음 명령을 사용하여 PKCS # 12 컨테이너에서 공개 / 개인 키를 추출 할 수 있습니다.

  • PKCS # 1 개인 키

    openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
    
  • 증명서 :

    openssl pkcs12 -in yourP12File.pfx -clcerts -nokeys -out publicCert.pem
    

7
명령은 작동하지만 개인 키는 PKCS1 형식으로 내보내지고 PKCS8이 필요합니다. 이것을 얻기 위해 누락 된 옵션이 있습니까? 예를 들어, '----- ----- RSA PRIVATE KEY BEGIN'수출하지만 난 '----- 개인 키를 BEGIN -----'필요
edthethird

4
그렇게하기 위해 시도 할 수 있습니다openssl rsa -in privateKey.pem -out private.pem
Francois

28
@edthethird : PKCS8를 얻으려면, -nodes 플래그 추가
크리스토퍼 K.

7
비밀번호없이 내보내려면을 추가하십시오 -passout pass:. 매개 변수는 pass : mypassword 형식이어야합니다. stackoverflow.com/a/27497899/206277
nidheeshdas

2
@ChristopherK. 감사! 그것은 저에게 좋은 것이 었습니다. -nodes키를 올바르게 추가 함
TecHunter

85

이것은 약간의 형식 변환으로 가능합니다.

openssh 형식으로 개인 키를 추출하려면 다음을 사용할 수 있습니다.

openssl pkcs12 -in pkcs12.pfx -nocerts -nodes | openssl rsa > id_rsa

개인 키를 공개 키로 변환하려면

openssl rsa -in id_rsa -pubout | ssh-keygen -f /dev/stdin -i -m PKCS8

openssh 형식으로 공개 키를 추출하려면 다음을 사용할 수 있습니다.

openssl pkcs12 -in pkcs12.pfx -clcerts -nokeys | openssl x509 -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8

2
감사합니다! 첫 번째 줄은 내가 필요한 줄이었습니다. 암호화되지 않은 키만으로 대부분의 CDN 자동화 시스템을 통해 설치할 수 있습니다.
BTC

1
@PhilipRego 공개 키와 개인 키가 혼동되었다고 생각합니다. RSA 공개 키는 'e'공개 지수와 'n'계수의 두 값으로, 키의 개인 부분과 나란히 저장됩니다.
ryanc

17

OpenSSH는 기본적으로 PKCS # 12 파일을 사용할 수 없습니다. 다른 사람들이 제안했듯이 OpenSSL에서 OpenSSH로 이동하는 PEM 형식의 개인 키를 추출해야합니다. 여기에 언급 된 다른 솔루션은 효과가 없습니다. “사전 패키지 된”유틸리티 (OpenSSL 0.9.8y, OpenSSH 6.2p2)와 함께 OS X 10.9 Mavericks (현재 10.9.3)을 사용합니다.

먼저 OpenSSH에서 직접 사용할 PEM 형식의 개인 키를 추출하십시오.

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa > ~/.ssh/id_rsa

암호로 개인 키를 암호화하는 것이 좋습니다.

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa -passout 'pass:Passw0rd!' > ~/.ssh/id_rsa

분명히 명령 줄에 일반 텍스트 암호를 작성하는 것도 안전하지 않으므로 기록에서 마지막 명령을 삭제하거나 도착하지 않는지 확인해야합니다. 다른 껍질에는 다른 방법이 있습니다. Bash와 다른 많은 쉘에서 히스토리에 저장되지 않도록 명령에 공백을 붙일 수 있습니다. Bash의 히스토리에서 명령을 삭제하는 방법도 있습니다.

history -d $(history | tail -n 2 | awk 'NR == 1 { print $1 }')

또는 다른 방법으로 개인 키 암호를 OpenSSL에 전달할 수 있습니다. 암호 구문 인수에 대해서는 OpenSSL 설명서를 참조하십시오 .

그런 다음 authorized_keys 파일에 추가 할 수있는 OpenSSH 공개 키를 작성하십시오.

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

무엇을 | openssl rsa위한 것입니까?
Snekse

1
@Snekse는 출력에 개인 키 만 있는지 확인합니다. 제 경우에는 ~/.ssh/id_rsa`| openssl rsa`. IDS 파일을 사용하는 OpenSSH 및 기타 유틸리티가 그 균열을 처리 할 수 ​​있다고 생각합니다 (시도하지 않았습니다). 특히 보안과 관련된 경우 필요한 데이터 만 제공하고 더 이상 아무것도 제공하지 않는 데 사용됩니다.
frzng

1
이 답변을 통해 터미널에서 PEM 형식 개인 키에 액세스 할 수 있었으며 복사 / 붙여 넣을 수있었습니다. openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts
BillyRayCyrus

7

해결책 1 :

jks에서 P12 추출

keytool -importkeystore -srckeystore MyRootCA.jks -destkeystore MyRootCA.p12 -deststoretype PKCS12

P12에서 PEM 추출 및 crt 파일에서 파일 및 pem 편집

openssl pkcs12 -in MyRootCA.p12 -clcerts -nokeys -out MyRootCA.crt

JKS에서 키 추출

openssl pkcs12 -in MyRootCA.p12 -nocerts -out encryptedPrivateKey.pem
openssl rsa -in encryptedPrivateKey.pem -out decryptedPrivateKey.key

해결책 2 :

PEM 및 encryptedPrivateKey를 txt 파일로 추출하십시오```

openssl pkcs12 -in MyRootCA.p12 -out keys_out.txt

개인 키 해독

openssl rsa -in encryptedPrivateKey.key [-outform PEM] -out decryptedPrivateKey.key

1
질문에 대답 할 때 명령이 무엇인지 강조하는 데 도움이됩니다. 명령 전후에 3 개의 따옴표를 추가하여`echo hello ''가됩니다 echo hello.
PatS

2

업데이트 : 내 대답은 잘 단지 가난한 중복이었다에 질문을 설명한 것으로 나타났습니다 //unix.stackexchange.com / ... : HTTPS 에 의해 BryKKan

여기에서 추출한 내용이 있습니다.

openssl pkcs12 -in <filename.pfx> -nocerts -nodes | sed -ne '/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p' > <clientcert.key>

openssl pkcs12 -in <filename.pfx> -clcerts -nokeys | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <clientcert.cer>

openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <cacerts.cer>

3
설명을 추가하면이 답변이 더 유용합니다.
mx0

0

내가 아는 한 PKCS # 12는 인증서 / 공개 / 개인 키 저장소 일뿐입니다. PKCS # 12 파일에서 공개 키를 추출한 경우 OpenSSH는 PEM 형식 으로 추출 된 키를 사용할 수 있어야 합니다. ssh-public-key 인증에 사용하려면 해당 개인 키 ( PEM ) 도 필요하다는 것을 이미 알고있을 것입니다 .


0

허용 된 답변은 올바른 명령입니다 .PEM password ( "Enter PEM pass phrase:")를 비워 두면 키를 추출 할 때 전체 키가 추출되지 않지만 추출 만 localKeyID추출됩니다. 완전한 키를 얻으려면 다음 명령을 실행하는 PEM 비밀번호를 지정해야합니다.

비밀번호 가져 오기와 관련하여 실제 비밀번호를 지정하거나이 비밀번호를 "Enter Import Password:"비워 둘 수 있습니다.

openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem

1
그것은 대답이 아니라 받아 들여진 대답에 대한 주석이어야합니다.
Styx
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.