성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
[정성태] 만드실 수 있습니다. 단지, Unity 엔진 내의 스크립트와 W...
[공진영] 안녕하세요 좋은글 감사합니다. 현재 제가 wpf로 관제 모...
[정성태] The Windows Registry Adventure #1: ...
[정성태] systemd for Developers I ; https:/...
[정성태] 엄밀히 object 타입의 인스턴스가 다른 타입으로 형변환 가능...
[정성태] 아래의 글에서 나오는 "Windows Application Pa...
[정성태] The history of calling conventions,...
[정성태] Secure and Deploy .NET Windows Form...
[정성태] Get Started with Milvus Vector DB i...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>.keystore 파일에 저장된 개인키 추출 방법과 인증기관으로부터 온 공개키를 합친 pfx 파일 만드는 방법</h1> <p> (제목 참 길군요. ^^)<br /> <br /> 2년 전에 아래와 같은 일이 있었습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > JKS(Java Key Store)에 저장된 인증서를 ActiveX 코드 서명에 사용하는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/882'>http://www.sysnet.pe.kr/2/0/882</a> </pre> <br /> 그런데, 이제 그 인증서가 만료가 되었고 마침 Verisign 측에서의 키관리 정책 변경(2048bit)으로 인해 기존 .key 파일을 사용할 수 없어 사내에서 인증서 담당하시는 분이 새롭게 키를 생성해서 발급을 받았습니다.<br /> <br /> 문제는, 지난번과 같이 협업을 하려고 했는데, 해당 방법을 설명한 웹 문서가 없어져 버린 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Convert the Java JKS key-store to Microsoft PFX format ; <a target='tab' href='http://www.crionics.com/products/opensource/faq/signFree.htm'>http://www.crionics.com/products/opensource/faq/signFree.htm</a> </pre> <br /> 그래서, 일단 자바의 ".keystore" 파일을 다음과 같은 이야기와 함께 통째로 저한테 보내주었습니다. <br /> <br /> <ol> <li>회사 정보를 바탕으로 keystore 파일 생성</li> <li>keystore 파일로부터 제가 보내드린 csr 생성</li> <li>verisign으로부터 받은 cer을 keystore 파일에 반영</li> </ol> <br /> 자... 그럼 위의 이야기를 길게 풀어써보겠습니다.<br /> <br /> 1번 단계에서 생성된 keystore 안에는 개인키/공개키가 함께 담겨 있습니다. 단지 그 누구도 알아주지 않는 키 정보라는 것만 차이가 있을 뿐 PKI 암호화에는 장애 없이 사용할 수 있습니다. 문제는, 제가 배포하는 공개키가 실제로 저한테서 왔다는 것을 다른 사람들이 어떻게 신뢰할 수 있을까 하는 점입니다. 누구나 인증서를 만들 때 "회사 정보"는 임의로 만들 수 있기 때문에 그 부분은 아무런 의미가 없습니다.<br /> <br /> 이런 문제를 해결하기 위해 "인증 기관"이 있는 것입니다. 우리는 그 인증 기관에게 위의 2번 단계를 거쳐서 우리가 가진 "공개키"를 보내게 됩니다. 참고로, 이 과정에서 '개인키'를 보내는 것이 아닙니다. 인증 기관조차도 우리의 개인키가 어떤 건지는 알아선/유출되어선 안됩니다.<br /> <br /> 마지막으로 3번 단계를 거쳐서 "인증 기관"은 자신들의 개인키로 우리의 공개키를 '서명'하고 그 서명된 '공개키 파일'(보통은 Base64 인코딩된 텍스트)을 보내줍니다. Verisign의 경우 이 파일은 다음과 같은 형식으로 된 텍스트 내용을 메일로 전달해 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > -----BEGIN CERTIFICATE----- MIIE4zCCA8ugAwIBAgIQEJ8dqq+4MxWmtkpu7YLYFjANBgkqhkiG9w0BAQUFADCB ...[생략]... lZ5gwQ3kd61SRXy6I9uXU79fteLDHxNhmqynIKLCh9vg2Rwp9diGLiA0dtEmpJIv /cX9tj7/6mEVgkha9/KCCcS7Ez7QygYxbepftABY+UtSJF3q+N1Rc8wYlVhw9jiM c+yBNWmdiQ== -----END CERTIFICATE----- </pre> <br /> 즉, 3번 단계의 "받은 cer" 파일이 의미하는 것이 바로 위의 "BEGIN/END CERTIFICATE"입니다. 이렇게 받은 공개키 인증서 정보를 .keystore 파일에 반영하면 이제서야 제대로 된 개인키/공개키를 가지게 되는 것입니다.<br /> <br /> 엄밀히, ActiveX나 Applet의 경우 '응용 프로그램 서명' 작업을 거치는 것은 '공개키'와는 무관합니다. 왜냐하면, '서명' 작업은 개인키로 하기 때문입니다. 즉, 굳이 Verisign과 같은 인증 기관의 개입 없이도 1번 단계에 생성한 개인키만으로도 ActiveX나 Applet의 서명이 가능합니다.<br /> <br /> "서명되어 생성된 Signature"는 '공개키'로만 유일하게 검증(Verification)을 거칠 수 있습니다. 그래서 편의상 ActiveX/Applet DLL 파일 내에 '공개키'를 'signature'와 함께 포함시켜서 배포를 하는데 이렇게 해서 최종 생성된 파일이야 말로 "서명된 파일"이 되는 것입니다. 인증기관이 필요한 유일한 이유는, 포함된 공개키가 실제 그 '회사 정보로 생성된 공개키'인지를 확인하는 데 필요한 것뿐입니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 여기까지 이해를 하셨으면, .keystore 파일에 우리가 원하는 '개인키'가 있음을 알 수 있습니다. 그리고 저한테는 지금 동료 개발자가 보내준 ".keystore" 파일이 있으니 keytool.exe를 잘 사용하면 문제를 해결할 수 있을 것 같습니다. 검색해 보니 다행히 아래와 같이 답이 나옵니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > How do I list / export private keys from a keystore? ; <a target='tab' href='http://stackoverflow.com/questions/150167/how-do-i-list-export-private-keys-from-a-keystore'>http://stackoverflow.com/questions/150167/how-do-i-list-export-private-keys-from-a-keystore</a> </pre> <br /> 명령어 실행 형식은 다음과 같습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > keytool.exe -importkeystore -srcstoretype [Keystore 형식] -srckeystore [Keystore 경로] -deststoretype [개인키 파일 인코딩 형식] -destkeystore [개인키 담을 파일 경로] </pre> <br /> 인자중에 하나로 쓰이는 "Source Keystore 형식(-srcstoretype)"을 어떻게 알 수 있을까요?<br /> <br /> <a target='tab' href='http://www.sysnet.pe.kr/2/0/1132'>지난번 글에서 설명</a>한 대로 직접 .keystore 파일에 대고 다음과 같이 -list 명령어를 내려보면 알 수 있습니다. <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > * .keystore 파일이 D:\settings 폴더에 있는 상황. * [keystore암호]는 해당 ".keystore" 파일을 생성한 담당자에게 물어보면 알 수 있습니다. C:\temp><span style='color: blue; font-weight: bold'>keytool -list -storepass [keystore암호] -keystore d:\settings\.keystore</span> <span style='color: blue; font-weight: bold'>Keystore 유형: JKS</span> Keystore 공급자: SUN Keystore에는 1 항목이 포함되어 있습니다. jennifersoft, 2012. 3. 7, PrivateKeyEntry, 인증서 지문(MD5): 0F:8D:26:B3:DE:47:63:D2:89:74:63:45:B2:1F:55:54 </pre> <br /> 그럼, 제 경우에 이런 식으로 명령어를 내리면 되겠군요. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp><span style='color: blue; font-weight: bold'>keytool.exe -importkeystore -srcstoretype JKS -srckeystore d:\settings\.keystore -deststoretype PKCS12 -destkeystore d:\settings\keys.pk12.der</span> 대상 키 저장소 암호 입력: <-- 새로 생성되는 keys.pk12.der 파일에 대한 암호 입력 새 암호를 다시 입력하십시오: <-- 확인 소스 키 저장소 암호 입력: <-- 이전 .keystore에 접근하는 암호 입력 별칭 jennifersoft에 대한 항목을 성공적으로 가져왔습니다. 가져오기 명령 완료: 1개 항목을 성공적으로 가져왔습니다. 0개 항목은 실패했거나 취소되었습니다. </pre> <br /> 이렇게 생성된 der 파일을 openssl.exe 도구를 사용해서 pem 파일로 변경해 줄 수 있습니다. openssl은 다음의 사이트에서 소스 코드를 구할 수 있지만,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > openssl ; <a target='tab' href='http://www.openssl.org/source/'>http://www.openssl.org/source/</a> </pre> <br /> 바이너리 배포는 하지 않으므로 빌드된 exe 파일은 다음의 사이트에서 구할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Win32 OpenSSL ; <a target='tab' href='http://www.slproweb.com/products/Win32OpenSSL.html'>http://www.slproweb.com/products/Win32OpenSSL.html</a> Win32 OpenSSL v1.0.0g Light ; <a target='tab' href='http://www.slproweb.com/download/Win32OpenSSL_Light-1_0_0g.exe'>http://www.slproweb.com/download/Win32OpenSSL_Light-1_0_0g.exe</a> </pre> <br /> 그래서, 이렇게 명령어를 내려주면 pem 파일을 얻을 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp><span style='color: blue; font-weight: bold'>openssl.exe pkcs12 -in c:\temp\keys.pk12.der -nodes -out c:\temp\private.rsa.pem</span> WARNING: can't open config file: C::\temp\openssl.cfg Enter Import Password: <-- keytool.exe에서 입력했던 "대상 키 저장소 암호"를 입력 MAC verified OK </pre> <br /> 생성된 private.rsa.pem 파일을 보면 "---BEGIN PRIVATE KEY--- / ---END PRIVATE KEY---" 쌍의 텍스트를 확인할 수 있습니다. 바로 우리가 그토록 원했던 '개인키'가 있다는 것입니다. ^^ 또한 원본이었던 ".keystore" 파일에 자바 개발자가 Verisign의 서명을 받은 인증서를 반영해 두었기 때문에 pem 파일 내에 보면 우리의 공개키뿐만 아니라 verisign 측의 공개키도 함께 있는 "BEGIN/END CERTIFICATE" 쌍을 볼 수 있습니다.<br /> <br /> 그런데, 이제부터의 단계가 좀 애매합니다. private/public key를 모두 가지고 있기 때문에 pfx 파일로 바로 변환할 수 있을 것 같은데, 이 방법을 잘 모르겠습니다. 또한 pem 파일은 윈도우 인증서 관리자에서 직접 import를 지원하지 않습니다. 어떻게 해서든지 pfx로 변환해야 하는데요. 음... 잘 모르겠습니다. 예전 방법을 써야지. ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> <a target='tab' href='http://www.sysnet.pe.kr/2/0/882'>이전에 해본 대로</a> pem 파일에서 private 키만을 담은 pvk 파일을 가져올 수 있습니다.<br /> <br /> pem-key-file을 pvk-file로 변환하는 것은 다음의 pvk.exe를 사용하시면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PVK file information. ; <a target='tab' href='http://www.drh-consultancy.demon.co.uk/pvk.html'>http://www.drh-consultancy.demon.co.uk/pvk.html</a> Win32 binary ; <a target='tab' href='http://www.drh-consultancy.demon.co.uk/pvktool.zip'>http://www.drh-consultancy.demon.co.uk/pvktool.zip</a> 소스 코드 ; <a target='tab' href='http://www.drh-consultancy.demon.co.uk/pvksrc.tgz.bin'>http://www.drh-consultancy.demon.co.uk/pvksrc.tgz.bin</a> </pre> <br /> 위의 pvk.exe를 이용해서 다음과 같이 pem 파일을 pvk 파일로 변환할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp><span style='color: blue; font-weight: bold'>d:\tools\cert\pvk.exe -in c:\temp\private.rsa.pem -topvk -strong -out c:\temp\private.key</span> Enter Password: <-- private.key 파일을 보호할 암호 입력 Verifying - Enter Password: <-- 암호 입력 확인 </pre> <br /> 이렇게 개인키만 소지한 파일을 만들었으니, 이제 verisign의 서명을 받은 우리의 공개키 파일이 필요한데요. 이것 역시 .keystore에서 구할 수 있습니다. (아니면 아마도 private.rsa.pem 파일에서 얻는 방법도 있을 것입니다.)<br /> <br /> 하지만 그럴 필요 없이, Verisign 측에서 보낸 메일에 보면 "BEGIN CERTIFICATE / END CERTIFICATE"(또는 "BEGIN PKCS #7 SIGNED DATA" / "END PKCS #7 SIGNED DATA")로 둘러쌓인 텍스트를 그냥 cer 파일로 저장해도 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [예제 test.cer] -----BEGIN CERTIFICATE----- MIIE4zCCA8ugAwIBAgIQEJ8dqq+4MxWmtkpu7YLYFjANBgkqhkiG9w0BAQUFADCB ...[생략]... c+yBNWmdiQ== -----END CERTIFICATE----- 또는, [예제 test.cer] -----BEGIN PKCS #7 SIGNED DATA----- MIIE4zCCA8ugAwIBAgIQEJ8dqq+4MxWmtkpu7YLYFjANBgkqhkiG9w0BAQUFADCB ...[생략]... c+yBNWmdiQ== -----END PKCS #7 SIGNED DATA----- </pre> <br /> 이렇게 개인키/공개키를 구했으니 모든 준비작업은 끝났습니다. "<a target='tab' href='http://www.sysnet.pe.kr/2/0/863'>인증서 관련(CER, PVK, SPC, PFX) 파일 만드는 방법</a>"에서 설명한 대로 따르면 됩니다. 그리하여 cert2spc를 이용해서 spc 파일을 만들고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp><span style='color: blue; font-weight: bold'>cert2spc.exe c:\temp\test.cer c:\temp\test.spc</span> Succeeded </pre> <br /> 마지막으로 pvkimprt.exe 도구를 이용해서 spc 파일과 key 정보로부터 pfx 파일로 만들 수 있습니다. 그래서, 다음과 같이 명령을 내리면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp><span style='color: blue; font-weight: bold'>pvkimprt.exe -pfx c:\temp\test.spc c:\temp\private.key</span> </pre> <br /> 암호를 묻는 창이 나옵니다.<br /> <br /> <img alt='jks_to_pfx_1.png' src='/SysWebRes/bbs/jks_to_pfx_1.png' /><br /> <br /> pvk.exe를 이용하여 private.key를 만들 때 입력했던 암호를 넣고 계속하면 이어서 본격적인 '인증서 가져오기' 마법사 단계로 넘어갑니다.<br /> <br /> <img alt='jks_to_pfx_2.png' src='/SysWebRes/bbs/jks_to_pfx_2.png' /><br /> <br /> 확인을 누르면, 아래 화면처럼 개인키를 내보낼 수 있는 유형으로 보관할 지 결정합니다. (이것은 회사 정책에 따라 달라질 수 있지만, 여기서는 편의상 "yes"를 선택하겠습니다.) 이에 대한 차이는 "<a target='tab' href='http://www.sysnet.pe.kr/2/0/392'>인증서 관리 - 내보내기/가져오기</a>" 글을 참고하세요.<br /> <br /> <img alt='jks_to_pfx_3.png' src='/SysWebRes/bbs/jks_to_pfx_3.png' /><br /> <br /> 그다음은 기본값으로 두고 진행합니다.<br /> <br /> <img alt='jks_to_pfx_4.png' src='/SysWebRes/bbs/jks_to_pfx_4.png' /><br /> <br /> 이제 새롭게 생성될 pfx 파일에 '개인키'를 가지게 되므로 이를 보호하기 위해 암호를 다시 입력합니다. (이전과 다른 새로운 암호를 입력해도 됩니다.)<br /> <br /> <img alt='jks_to_pfx_5.png' src='/SysWebRes/bbs/jks_to_pfx_5.png' /><br /> <br /> 확인을 누르면 pfx 파일을 저장할 파일명을 지정할 수 있고,<br /> <br /> <img alt='jks_to_pfx_6.png' src='/SysWebRes/bbs/jks_to_pfx_6.png' /><br /> <br /> 마지막으로 정보를 확인하고 "Finish" 버튼을 누르면 정상적으로 pfx 파일이 생성됩니다.<br /> <br /> 휴~~~ 끝입니다. 친근한 pfx 파일이 생성되었으니, 이제 뭐든 ^^ 원하는 대로 작업을 하시면 됩니다.<br /> </p><br /> <br /> <br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1674
(왼쪽의 숫자를 입력해야 합니다.)