글 작성자: 모두의 근삼이

PKCS#12
PKCS#12(Public Key Cryptography Standards #12)형식은 각종 키, 인증서가 모두 포함될 수 있는 형태이다. 해당 형식을 사용하면, 바이너리 형태로 저장되며, 이 파일을 PFX 파일이라고도 한다.


  • openssl 툴이 설치되어 있어야 함
  • pfx파일에 CA인증서는 포함되어 있지 않을 수 있음
  • 인증서 파일이 암호화 되어 있을 경우, 암호키를 입력해 주어야 함
  • 사용 예시에서 확장자를 포함한 파일이름은 본인 설정에 맞게 자유롭게

추출

- 인증서 추출

openssl pkcs12 -in <filename.pfx> -clcerts -nokeys -out <clientcert.crt> --password pass:<password>

- 개인키 추출

openssl pkcs12 -in <filename.pfx> -nocerts -nodes -out <clientcert.key> --password pass:<password>

- CA인증서 추출

openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain -out <cacerts.crt> --password pass:<password>

- 사용 예시

openssl pkcs12 -in my.pfx -nocerts -nodes -out my.key --password pass:a1234
openssl pkcs12 -in my.pfx -clcerts -nokeys -out my.crt --password pass:a1234
openssl pkcs12 -in my.pfx -cacerts -nokeys -chain -out ca_my.pem --password pass:a1234

주의사항

추출된 파일을 바로 시스템에 적용하여 사용하면 형식이 맞지 않아서 에러가 날 수 있으니, 적절하게 필요한 부분만 떼서 사용해야 한다.

- 추출 직후의 파일 포맷

아래 예시에 사용된 예시는 임의 변경한 사용 불가능한 인증서이니, 괜히 헛수고 하지 않길 바란다.

Bag Attributes
    Microsoft Local Key set: <No Values>
    localKeyID: 01 00 00 00
    friendlyName: le-e9a1231-7f1c-1234-b123-f1233da2
    Microsoft CSP Name: Microsoft RSA SChannel Cryptographic Provider
Key Attributes
    X509v3 Key Usage: 10
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDKntycKiujZNnY
5BgQ/ZEdec4uxFQ0lLK7CxHo1gHJLvqm660cuFZVJBtP6BPSHtAczqYGAiWQOESt
hnIjURqPxSFrMgUahK06+f2bCjIE844FP49NxMHh88VJMnwLz9RhvI5sOsXuG68q
Gj9DnB+3wuxNuIo44UhVthcGO4QmgBWAEuHCiq4b2Q14rLkcQM11r3xkQFzq08Z+
qPvYDs01BM537uU/RCoDhZMt5V6FHiBsZMy6bT+jDzhSKRVxSdoibwPo9WOAVvzx
KdmmxI58TuY8Tf6AUH7FCzd2GTl6T2rqTa9ZE9RGGUq3PTpX3xJ6HZgpXHCODJHp
81jn0aDdAgMBAAECggEACHHpmPqq+fLsn30WQbMH1tYqUUmuhsiB0IjsFKvCxEtY
eBePjghi1Mad+s0d8l6FZwX35n01apblyeO2IyGwvThGpcyeaNYJ0FD2EH2yywEJ
tM9K3j9qo0vBN8VKZUWiwPYWa41hjYSK3vLcGynJKqQNrEmaPTeqh6QAvqpBXkda
YMV0XsccZg0iVbiq7jP9lDhZMt5V6FHZjfnDza/eQlqIXFiYFVnJSOeCOe930A4I
xC0UPVKVwPL2Ux1ngDtiKYHA++DKKy9VgEVCjeCOA8197ce4rgkLyidECstyG0qC
ahhdNjBlvk8DiZuH5srUxECzEUi4w5dlWBhqyfcTIwKBgQDe98MXq1e/mM3sdpTz
XnRSjTPANuCaC9xGtkh6S+vQqB39duruk/n1lYom+dNIqmagP7MOgHoD7nbtfLHJ
3BqNCnT+qGzxwSxMcFwab7Yexgedj1efEaWsQrmMh6IdDCLPEfimaplk2PGSZwwd
quncv0DB6Yg3nQK2mjKaVY2dpwKBgQDoo2mwq5vKFf7csuXl/mFUgm1zPd2maXaA
4Hr0yEoqx/cylE2KnQ5x3TvSboFC3iLbCPAhYRidyhLZ0cK//4gKqsACvTI3t3OG
hhMSAUwFff+Eub3E0JXAWvNpmh39wuM0peJKiBPREJTHfBgKaqDO6OIOJ9snPufv
gmKEtZyF2wKBgCvAemvel21lUqMf8cJ/uluokYsaOaCAy0yk4Dv/QdrD4n6mIxuF
tfrWyTE0vJz5swGm/j/OPiMfW/7mBQ0TP7KFZsfBzP7zZPnq4mfdm+MWANCOHCd+
kv/mZ/qHcuw4QWxYnm4pZMhBqmagP+f3zcQfU1m5tZ0UFkA2qc9XEl7pAoGAIlyA
r+epCyBUlKSX8HCyT5k0MWFh68KIDmEZyC4NRmRizsW47lBkYc0bmOlZjlbhLxkS
3ttIl4XRYvromRNVNL4jvkPTtwcRuTz0dCRc5jLGGwSUUw28EL1eVqq840514MDf
u8J9qtOYJh7eLiuxtN4RBaY9aH6SI35OrutkQyECgYEAkCLH4lsbwWCnI4sip+Rj
AeACACMEUHvl4XRYvromRNVNL4jvkPTtwcRuTz0d1k2GwSUUw28EL1/+a2J1S7gr
8jKRIG3X0QuGq/f1lwrZZPSVEYTsTN3fe9/YhDMeC+/VRhIar58QB6JTYlxWyP7o
AiNfeiGazzMTMmO79XaTuHI=
-----END PRIVATE KEY-----

- 필요한 부분

-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDKntycKiujZNnY
5BgQ/ZEdec4uxFQ0lLK7CxHo1gHJLvqm660cuFZVJBtP6BPSHtAczqYGAiWQOESt
hnIjURqPxSFrMgUahK06+f2bCjIE844FP49NxMHh88VJMnwLz9RhvI5sOsXuG68q
Gj9DnB+3wuxNuIo44UhVthcGO4QmgBWAEuHCiq4b2Q14rLkcQM11r3xkQFzq08Z+
qPvYDs01BM537uU/RCoDhZMt5V6FHiBsZMy6bT+jDzhSKRVxSdoibwPo9WOAVvzx
KdmmxI58TuY8Tf6AUH7FCzd2GTl6T2rqTa9ZE9RGGUq3PTpX3xJ6HZgpXHCODJHp
81jn0aDdAgMBAAECggEACHHpmPqq+fLsn30WQbMH1tYqUUmuhsiB0IjsFKvCxEtY
eBePjghi1Mad+s0d8l6FZwX35n01apblyeO2IyGwvThGpcyeaNYJ0FD2EH2yywEJ
tM9K3j9qo0vBN8VKZUWiwPYWa41hjYSK3vLcGynJKqQNrEmaPTeqh6QAvqpBXkda
YMV0XsccZg0iVbiq7jP9lDhZMt5V6FHZjfnDza/eQlqIXFiYFVnJSOeCOe930A4I
xC0UPVKVwPL2Ux1ngDtiKYHA++DKKy9VgEVCjeCOA8197ce4rgkLyidECstyG0qC
ahhdNjBlvk8DiZuH5srUxECzEUi4w5dlWBhqyfcTIwKBgQDe98MXq1e/mM3sdpTz
XnRSjTPANuCaC9xGtkh6S+vQqB39duruk/n1lYom+dNIqmagP7MOgHoD7nbtfLHJ
3BqNCnT+qGzxwSxMcFwab7Yexgedj1efEaWsQrmMh6IdDCLPEfimaplk2PGSZwwd
quncv0DB6Yg3nQK2mjKaVY2dpwKBgQDoo2mwq5vKFf7csuXl/mFUgm1zPd2maXaA
4Hr0yEoqx/cylE2KnQ5x3TvSboFC3iLbCPAhYRidyhLZ0cK//4gKqsACvTI3t3OG
hhMSAUwFff+Eub3E0JXAWvNpmh39wuM0peJKiBPREJTHfBgKaqDO6OIOJ9snPufv
gmKEtZyF2wKBgCvAemvel21lUqMf8cJ/uluokYsaOaCAy0yk4Dv/QdrD4n6mIxuF
tfrWyTE0vJz5swGm/j/OPiMfW/7mBQ0TP7KFZsfBzP7zZPnq4mfdm+MWANCOHCd+
kv/mZ/qHcuw4QWxYnm4pZMhBqmagP+f3zcQfU1m5tZ0UFkA2qc9XEl7pAoGAIlyA
r+epCyBUlKSX8HCyT5k0MWFh68KIDmEZyC4NRmRizsW47lBkYc0bmOlZjlbhLxkS
3ttIl4XRYvromRNVNL4jvkPTtwcRuTz0dCRc5jLGGwSUUw28EL1eVqq840514MDf
u8J9qtOYJh7eLiuxtN4RBaY9aH6SI35OrutkQyECgYEAkCLH4lsbwWCnI4sip+Rj
AeACACMEUHvl4XRYvromRNVNL4jvkPTtwcRuTz0d1k2GwSUUw28EL1/+a2J1S7gr
8jKRIG3X0QuGq/f1lwrZZPSVEYTsTN3fe9/YhDMeC+/VRhIar58QB6JTYlxWyP7o
AiNfeiGazzMTMmO79XaTuHI=
-----END PRIVATE KEY-----

끝.

반응형