OpenSSL을 사용하여 PKCS # 12 인증서를 PEM으로 변환


212

Windows 7의 OpenSSL x64 를 Google Code의 openssl-for-windows에서 다운로드했습니다 . 나는 실행하려고합니다 :

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" 

하지만 오류가 발생합니다.

unable to load private key

OpenSSL을 사용하여 PKCS # 12 저장소에서 PEM의 인증서를 어떻게 추출합니까?


@ jww 나는이 질문이 3 세 이상되어 주제를 벗어난 깃발을 알리는 데 약간 늦었다 고 생각합니다.
Dean MacGregor

사람들이 그 주제를 벗어난 것을 알기위한 형식 일뿐입니다. 사람들은 동일한 주제를 벗어난 질문을하고이 질문을 인용합니다. 사람들이 주제를 벗어난 것으로 알려지지 않은 경우 계속해서 스택 오버플로를 묻습니다.
jww

2
@jww 귀하가 링크 한 메타 질문에 대해 가장 많이 투표 된 답변은 "DevOps 질문은 스택 오버플로에서 허용되어야합니다"라고 말합니다. (나를 위해, 나는 프로그래밍되지 않은, 내가 쉽게 내가 원한다면 프로그램에서 답을 통합 할 수 있지만) 대답은 내 요구를 충족 때문에, 찬성 투표 것이다
dcorking

답변:


536

시험:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys
openssl pkcs12 -in path.p12 -out newfile.key.pem -nocerts -nodes

그 후 당신은 :

  • newfile.crt.pem의 인증서
  • newfile.key.pem의 개인 키

인증서와 키를 같은 파일에 넣으려면 다음을 사용하십시오.

openssl pkcs12 -in path.p12 -out newfile.pem

명령 행에서 직접 PKCS # 12 암호를 입력해야하는 경우 (예 : 스크립트) -passin pass:${PASSWORD}다음을 추가하십시오 .

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys -passin 'pass:P@s5w0rD'

2
개인 키와 인증서가 동일한 * .pem 파일에 저장 될 수 있습니까?
Ramis

18
네, 다음과 같습니다 :openssl pkcs12 -in path.p12 -out newfile.pem
Gee-Bee

2
비밀번호 가져 오기 요청. 그게 뭐야?
Saurabh Chandra Patel

4
@SaurabhChandraPatel 당신은 인증서의 암호를 알아야합니다. 이것은 잊혀진 암호를 복구하는 수단이 아닙니다
Dean MacGregor

2
-nodes를 생략하면 개인 키가 추출되지 않습니다.
Meixner

22

비밀번호 만 입력하면됩니다. 다음 구문을 사용하여 동일한 명령 줄에서 수행 할 수 있습니다.

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password]

그러면 출력 파일에서 개인 키를 암호화하기위한 비밀번호를 묻는 메시지가 표시됩니다. 개인 키를 암호화되지 않은 (일반 텍스트) 내보내려면 위의 줄에 "노드"옵션을 포함하십시오.

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password] -nodes

추가 정보 : http://www.openssl.org/docs/apps/pkcs12.html


16

파이썬을 사용할 수 있다면 pyopenssl모듈 이 있으면 더 쉽습니다 . 여기있어:

from OpenSSL import crypto

# May require "" for empty password depending on version

with open("push.p12", "rb") as file:
    p12 = crypto.load_pkcs12(file.read(), "my_passphrase")

# PEM formatted private key
print crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey())

# PEM formatted certificate
print crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate())

사용 file하지 않고 사용하여 파일을 열 이유가 open있습니까? 나는 나중에 그것을 사용할 것이므로 이해하고 싶습니다 (
opensh

아뇨, 차이가 없습니다. 당신은 할 수 있습니다 open("push.p12", 'rb').read().
KVISH

2
파이썬 3을 사용한다면 아마도 파일에 내용을 쓰고 싶을 것입니다 : with open("push.pem", "wb") as fobj: fobj.write(crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate()))인증서를 작성 with open("push.key", "wb") as fobj: fobj.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey()))하고 키 를 작성하십시오 .
Adam Parkin

위의 예제를 실행했을 때 파이썬 3.7을 사용하고는, 나는 다음과 같은 얻을 : "형식 오류 길이가 1 인 바이트 여야 CTYPE '문자'에 대한 초기화를하지 STR은"내 암호가 뭔가 잘못인가
getaglow

단일 명령을 실행하는 것보다 파일을 작성하고, 코드를 입력하고, 저장하고, 실행하는 것이 "더 쉬운"이유는 무엇입니까?
Torben Gundtofte-Bruun

3

PFX 파일이 있고 NGINX 용 KEY 파일을 만들어야했기 때문에 다음과 같이했습니다.

openssl pkcs12 -in file.pfx -out file.key -nocerts -nodes

그런 다음 KEY 파일을 편집하고까지 모든 내용을 제거해야했습니다 -----BEGIN PRIVATE KEY-----. 그 후 NGINX는 KEY 파일을 수락했습니다.


0

비밀번호가없는 PEM 파일이 필요한 경우이 솔루션을 사용할 수 있습니다 .

개인 키와 인증서를 복사하여 동일한 파일에 붙여넣고 .pem으로 저장하십시오.

파일은 다음과 같습니다.

-----BEGIN PRIVATE KEY-----
............................
............................
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
...........................
...........................
-----END CERTIFICATE-----

이것이 HTTPS 용 Cisco 장치에 인증서를 업로드하는 유일한 방법입니다.

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