Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)
(시리즈 글이 5개 있습니다.)
개발 환경 구성: 74. 인증서 관련(CER, PVK, SPC, PFX) 파일 만드는 방법
; https://www.sysnet.pe.kr/2/0/863

개발 환경 구성: 76. JKS(Java Key Store)에 저장된 인증서를 ActiveX 코드 서명에 사용하는 방법
; https://www.sysnet.pe.kr/2/0/882

개발 환경 구성: 147. .keystore 파일에 저장된 개인키 추출 방법과 인증기관으로부터 온 공개키를 합친 pfx 파일 만드는 방법
; https://www.sysnet.pe.kr/2/0/1262

개발 환경 구성: 549. ssh-keygen으로 생성한 PKCS#1 개인키/공개키 파일을 각각 PKCS8/PEM 형식으로 변환하는 방법
; https://www.sysnet.pe.kr/2/0/12560

.NET Framework: 1038. C# - 인증서 및 키 파일로부터 pfx/p12 파일을 생성하는 방법
; https://www.sysnet.pe.kr/2/0/12599




JKS(Java Key Store)에 저장된 인증서를 ActiveX 코드 서명에 사용하는 방법


이번에, DLL 파일에 대한 서명을 할 일이 있었습니다. 문제는, 이미 회사에서 인증서를 verisign으로부터 발급받았고, 애플릿 서명용으로 사용되고 있다는 것입니다.

그것이 왜 문제냐??? 라고 하시겠지만. ^^

기존에 있는 인증서 파일이 달랑 아래와 같은 PEM 형식의 텍스트 파일 뿐이라는 것입니다.

-----BEGIN CERTIFICATE-----
MIIB5jCCAU8CAQAwgaUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJHQTELMAkGA1UE 
...[생략]...
bPZJpECkPLp4Xg==
-----END CERTIFICATE-----

위의 형식으로 된 CER 파일을 윈도우의 "인증서 관리자"에서 "가져오기" 시도를 하면 "개인키"가 없는 인증서로만 등록이 됩니다. 그렇다면, 키 파일을 찾아야 하는데... ^^; 그걸 가지고 있지 않은 것입니다. 게다가 JKS가 있는 서버는 윈도우가 아니고 리눅스 서버여서... ^^; 제가 접근할 수가 없는 상황!

암튼, 검색을 해보니 다음과 같은 글을 찾았습니다.

Convert the Java JKS key-store to Microsoft PFX format
; http://www.crionics.com/products/opensource/faq/signFree.htm

위의 글에 중간 쯤에 보면 "Convert Sun Java JKS Keystore to Microsoft PFX format"와 같은 글이 있는데 거기서 다음과 같은 명령어로 JKS로부터 PFX를 내려받는 방법을 알려주고 있습니다.

형식) JKS2PFX key-store-filename password alias java-class-path-for-ExportPrvKey.class
예제) JKS2PFX CodeSigning.jks mypassword CodeSigning C:\KeyTools

일단, 자바 담당하시는 분에게 위의 방법을 알려주고 pfx를 달라고 했는데요. ^^; 제시되었던 방법과는 달리 다음과 같은 3개의 파일이 나오더라고 합니다.

myprivate.key
privatekey.b64
privatekey.pkcs8

그중에서 privatekey.b64는 "BEGIN/END PRIVATE KEY" 내에 아무런 데이터가 없는 쓸모없는 파일이었고, myprivate.key는 "---BEGIN PRIVATE KEY---"과 "---END PRIVATE KEY---" 사이에 base64 인코딩된 PEM 형식의 개인키 저장 파일이고, privatekey.pkcs8은 동일한 개인키인데 PKCS #8 형식으로 바이너리 파일이었습니다. 참고로, myprivate.key는 다음과 같은 출력 결과였습니다.

---BEGIN PRIVATE KEY---
MIIB5jCCAU8CAQAwgaUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJHQTELMAkGA1UE 
...[생략]...
bPZJpECkPLp4Xg==
---END PRIVATE KEY---

흠... PFX로 바로 나오진 않았지만, 어쨌든 base64 인코딩된 CER 인증서 파일이 있고, 개인키 파일이 있으니 잘 조립해보면 개인키를 가진 인증서 파일로 변환이 가능할 것 같은데요.

여기서 다시 검색을 해보았습니다.

How to transform your certificate to a pvk + spc combination.
; http://www.globalsign.com/support/code-signing/pvk-spc.html

위의 글에 보면 아래와 같이 PEM 형식의 개인키 파일을 PVK 파일로 변환하는 것을 볼 수 있습니다.,

Download the pvk transform utility. This file can be found at 
http://www.globalsign.com/support/code-signing/PVK.zip 

pvk -in <pem-key-file> -topvk -strong -out <pvk-file>

그래서 실행해 보니 다음과 같은 결과가 나옵니다.

C:\temp>pvk -in myprivate.key -topvk -strong -out myprivate.pvk
Error reading key
6408:error:0906D06C:PEM routines:PEM_read_bio:no start line:.\crypto\pem\pem_lib
.c:632:Expecting: ANY PRIVATE KEY

헉~~~ 당황스럽습니다. ^^; 이 문제 때문에 엄청나게 고생을 했는데요. 원인은? ^^;

[기존 형식]
---BEGIN PRIVATE KEY---
MIIB5jCCAU8CAQAwgaUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJHQTELMAkGA1UE 
...[생략]...
bPZJpECkPLp4Xg==
---END PRIVATE KEY---

==>

[변경된 형식]
-----BEGIN PRIVATE KEY-----
MIIB5jCCAU8CAQAwgaUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJHQTELMAkGA1UE 
...[생략]...
bPZJpECkPLp4Xg==
-----END PRIVATE KEY-----

위에서 보는 것처럼, BEGIN/END 구분자의 "-" 문자가 3개였던 것을 5개로 했어야 한다는 것입니다. (실수로 찾아낸 것입니다. ^^;)

그래서 다시 실행해 보면, 다음과 같이 정상적으로 pvk 파일을 생성해 냅니다.

C:\temp>pvk -in myprivate.key -topvk -strong -out myprivate.pvk
Enter Password:
Verifying - Enter Password:

자... 일단 이렇게 해서 PVK와 CER 파일이 있으니 "인증서 관련(CER, PVK, SPC, PFX) 파일 만드는 방법"에서 설명한 대로 다음과 같이 명령어를 주면 PFX 파일이 나오게 됩니다.

cert2spc mycert.cer mycert.spc
pvkimprt -pfx mycert.spc myprivate.pvk

이 정도면 해결이 되었죠. ^^

시간을 내서 좀 더 검색을 해보니, openssl이라는 공개 도구를 찾았습니다.

Download OpenSSL for windows
; http://www.deanlee.cn/programming/openssl-for-windows/

위의 툴을 이용하면 PEM 형식이었던 myprivate.key와 CER 파일만을 가지고 곧바로 PFX 파일로 만드는 것이 가능했습니다.

C:\temp>openssl pkcs12 -export -in mycert.cer -inkey myprivate.key -out my.pfx
Loading 'screen' into random state - done
Enter Export Password:
Verifying - Enter Export Password:
unable to write 'random state'

마지막 부분에 "unable to write 'random state'"라고 안 좋은 메시지가 있긴 하지만, "인증서 관리자"로 해당 pfx 파일을 가져와서 등록하는 과정이 정상적으로 진행되었습니다.

참고로, 위에서 "---" 3개의 구분 문자만 있는 상황에서 openssl을 실행하면 다음과 같은 식으로 오류가 발생합니다.

C:\temp>openssl pkcs12 -export -in mycert.cer -inkey myprivate.key -out my.pfx
Loading 'screen' into random state - done
unable to load private key
unable to write 'random state'

끝!!!



[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 2/23/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2015-03-09 05시43분
정성태

... 76  77  78  79  80  81  82  83  84  85  86  87  [88]  89  90  ...
NoWriterDateCnt.TitleFile(s)
11736정성태10/12/201818504오류 유형: 492. Visual Studio 로딩 시 오류 - The 'Scc Display Information' package did not load correctly.
11735정성태10/12/201824265VS.NET IDE: 129. Visual Studio - 특정 문자(열)를 개행 문자로 바꾸는 방법
11734정성태10/10/201818608Linux: 4. Synology NAS(DS216+II)에 FTDI 장치 연결 후 C#(.NET Core)으로 DTR 제어파일 다운로드1
11733정성태10/10/201821365Linux: 3. Synology NAS(DS216+II)에서 FTDI 장치를 C/C++로 제어
11732정성태10/10/201821125디버깅 기술: 119. windbg 분석 사례 - 종료자(Finalizer)에서 예외가 발생한 경우 비정상 종료(Crash) 발생파일 다운로드1
11731정성태10/9/201820549개발 환경 구성: 409. C# - REST API를 이용해 Azure Kudu 서비스 이용 - 웹 앱 확장 처리파일 다운로드1
11730정성태10/9/201819834개발 환경 구성: 408. C# - REST API를 이용해 Azure Kudu 서비스 이용 - 파일 처리파일 다운로드1
11729정성태10/9/201822321Windows: 150. 윈도우에서 ARP Cache 목록 확인 및 삭제하는 방법
11728정성태10/9/201820148사물인터넷: 50. Audio Jack 커넥터의 IR 적외선 송신기 [1]
11727정성태10/8/201821375오류 유형: 491. Visual Studio의 리눅스 SSH 원격 연결 - "Connectivity Failure. Please make sure host name and port number are correct."
11726정성태10/7/201824053사물인터넷: 49. 라즈베리 파이를 이용해 원격 컴퓨터의 전원 스위치 제어파일 다운로드1
11724정성태10/5/201823811개발 환경 구성: 407. 유니코드와 한글 - "Hangul Compatibility Jamo"파일 다운로드1
11723정성태10/4/201817542개발 환경 구성: 406. "Docker for Windows" 컨테이너 내의 .NET Core 응용 프로그램에서 직렬 포트(Serial Port, COM Port) 사용 방법
11722정성태10/4/201821252.NET Framework: 798. C# - Hyper-V 가상 머신의 직렬 포트와 연결된 Named Pipe 간의 통신파일 다운로드1
11721정성태10/4/201821573.NET Framework: 797. Linux 환경의 .NET Core 응용 프로그램에서 직렬 포트(Serial Port, COM Port) 사용 방법파일 다운로드1
11720정성태10/4/201823145개발 환경 구성: 405. Hyper-V 가상 머신에서 직렬 포트(Serial Port, COM Port) 사용
11719정성태10/4/201823725.NET Framework: 796. C# - 인증서를 윈도우에 설치하는 방법
11718정성태10/4/201818890개발 환경 구성: 404. (opkg가 설치된) Synology NAS(DS216+II)에 cmake 설치
11717정성태10/3/201821505사물인터넷: 48. 넷두이노의 C# 네트워크 프로그램 [1]
11716정성태10/3/201822097사물인터넷: 47. Raspberry PI Zero (W)에 FTDI 장치 연결 후 C/C++로 DTR 제어파일 다운로드1
11715정성태10/3/201820841사물인터넷: 46. Raspberry PI Zero (W)에 docker 설치
11714정성태10/2/201820114사물인터넷: 45. Raspberry PI에 ping을 hostname으로 하는 방법
11713정성태10/2/201822489개발 환경 구성: 403. Synology NAS(DS216+II)에 docker 설치 후 .NET Core 2.1 응용 프로그램 실행하는 방법
11712정성태10/2/201827693.NET Framework: 795. C# - 폰트 목록을 한글이 아닌 영문으로 구하는 방법 [3]
11711정성태10/2/201823104오류 유형: 490. 윈도우 라이선스 키 입력 오류 0xc004f050, 0xc004e028
11710정성태10/2/201822048.NET Framework: 794. C# - 같은 모양, 다른 값의 한글 자음을 비교하는 호환 분해 [5]
... 76  77  78  79  80  81  82  83  84  85  86  87  [88]  89  90  ...