Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 3개 있습니다.)
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분
정성태

... 16  17  18  19  20  [21]  22  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
13126정성태9/15/20227476.NET Framework: 2049. C# 11 - 정적 메서드에 대한 delegate 처리 시 cache 적용
13125정성태9/14/20227718.NET Framework: 2048. C# 11 - 구조체 필드의 자동 초기화(auto-default structs)
13124정성태9/13/20227507.NET Framework: 2047. Golang, Python, C#에서의 CRC32 사용
13123정성태9/8/20227861.NET Framework: 2046. C# 11 - 멤버(속성/필드)에 지정할 수 있는 required 예약어 추가
13122정성태8/26/20227831.NET Framework: 2045. C# 11 - 메서드 매개 변수에 대한 nameof 지원
13121정성태8/23/20225668C/C++: 157. Golang - 구조체의 slice 필드를 Reflection을 이용해 변경하는 방법
13120정성태8/19/20227313Windows: 209. Windows NT Service에서 UI를 다루는 방법 [3]
13119정성태8/18/20226879.NET Framework: 2044. .NET Core/5+ 프로젝트에서 참조 DLL이 보관된 공통 디렉터리를 지정하는 방법
13118정성태8/18/20225663.NET Framework: 2043. WPF Color의 기본 색 영역은 (sRGB가 아닌) scRGB [2]
13117정성태8/17/20227885.NET Framework: 2042. C# 11 - 파일 범위 내에서 유효한 타입 정의 (File-local types)파일 다운로드1
13116정성태8/4/20228335.NET Framework: 2041. C# - Socket.Close 시 Socket.Receive 메서드에서 예외가 발생하는 문제파일 다운로드1
13115정성태8/3/20228716.NET Framework: 2040. C# - ValueTask와 Task의 성능 비교 [1]파일 다운로드1
13114정성태8/2/20228883.NET Framework: 2039. C# - Task와 비교해 본 ValueTask 사용법파일 다운로드1
13113정성태7/31/20228205.NET Framework: 2038. C# 11 - Span 타입에 대한 패턴 매칭 (Pattern matching on ReadOnlySpan<char>)
13112정성태7/30/20228569.NET Framework: 2037. C# 11 - 목록 패턴(List patterns) [1]파일 다운로드1
13111정성태7/29/20228326.NET Framework: 2036. C# 11 - IntPtr/UIntPtr과 nint/nuint의 통합파일 다운로드1
13110정성태7/27/20228382.NET Framework: 2035. C# 11 - 새로운 연산자 ">>>" (Unsigned Right Shift)파일 다운로드1
13109정성태7/27/20229784VS.NET IDE: 177. 비주얼 스튜디오 2022를 이용한 (소스 코드가 없는) 닷넷 모듈 디버깅 - "외부 원본(External Sources)" [1]
13108정성태7/26/20227731Linux: 53. container에 실행 중인 Golang 프로세스를 디버깅하는 방법 [1]
13107정성태7/25/20226821Linux: 52. Debian/Ubuntu 계열의 docker container에서 자주 설치하게 되는 명령어
13106정성태7/24/20226616오류 유형: 819. 닷넷 6 프로젝트의 "Conditional compilation symbols" 기본값 오류
13105정성태7/23/20227924.NET Framework: 2034. .NET Core/5+ 환경에서 (프로젝트가 아닌) C# 코드 파일을 입력으로 컴파일하는 방법 - 두 번째 이야기 [1]
13104정성태7/23/202211002Linux: 51. WSL - init에서 systemd로 전환하는 방법
13103정성태7/22/20227493오류 유형: 818. WSL - systemd-genie와 관련한 2가지(systemd-remount-fs.service, multipathd.socket) 에러
13102정성태7/19/20226956.NET Framework: 2033. .NET Core/5+에서는 구할 수 없는 HttpRuntime.AppDomainAppId
13101정성태7/15/202215930도서: 시작하세요! C# 10 프로그래밍
... 16  17  18  19  20  [21]  22  23  24  25  26  27  28  29  30  ...