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)
13050정성태5/6/20226780.NET Framework: 2003. C# - COM 개체의 이벤트 핸들러에서 발생하는 예외에 대한 CLR의 특별 대우파일 다운로드1
13049정성태5/6/20225668오류 유형: 811. GoLand - Error: Cannot find package
13048정성태5/6/20226900오류 유형: 810. "ASUS TUF GAMING B550M-PLUS (WI-FI)" 모델에서 블루투스 장치가 인식이 안 되는 문제
13047정성태5/6/20226929오류 유형: 809. Speech Recognition could not start
13046정성태5/5/20227226.NET Framework: 2002. C# XingAPI - ACF 파일을 이용한 퀀트 종목 찾기(t1857)
13045정성태5/5/20227234.NET Framework: 2001. C# XingAPI - 주식 종목에 따른 PBR, PER, ROE 구하는 방법(t3341 예제)
13044정성태5/4/20226644오류 유형: 808. error : clang++ exited with code 127
13043정성태5/3/20226342오류 유형: 807. C# - 닷넷 응용 프로그램에서 Informix DB 사용 시 오류 메시지 정리
13042정성태5/3/20226764.NET Framework: 2000. C# - 닷넷 응용 프로그램에서 Informix DB 사용 방법파일 다운로드1
13041정성태4/28/20227097개발 환경 구성: 642. Informix 데이터베이스 docker 환경 구성
13040정성태4/27/20227514VC++: 156. 비주얼 스튜디오 - Linux C/C++ 프로젝트에서 openssl 링크하는 방법
13039정성태4/27/20228349.NET Framework: 1999. C# - Playwright를 이용한 간단한 브라우저 제어 실습
13038정성태4/26/20226092오류 유형: 806. twine 실행 시 ConfigParser.ParsingError: File contains parsing errors: /root/.pypirc
13037정성태4/25/20226529.NET Framework: 1998. Azure Functions를 사용한 간단한 실습
13036정성태4/24/20227374.NET Framework: 1997. C# - nano 시간을 가져오는 방법 [2]
13035정성태4/22/20227926Windows: 204. Windows 10부터 바뀐 QueryPerformanceFrequency, QueryPerformanceCounter
13034정성태4/21/20227249.NET Framework: 1996. C# XingAPI - 주식 종목에 따른 PBR, PER, ROE, ROA 구하는 방법(t3320, t8430 예제)파일 다운로드1
13033정성태4/18/20227789.NET Framework: 1195. C# - Thread.Yield와 Thread.Sleep(0)의 차이점(?)
13032정성태4/17/20227508오류 유형: 805. Github의 50MB 파일 크기 제한 - warning: GH001: Large files detected. You may want to try Git Large File Storage
13031정성태4/15/20227130.NET Framework: 1194. C# - IdealProcessor와 ProcessorAffinity의 차이점
13030정성태4/15/20226766오류 유형: 804. 정규 표현식 오류 - Quantifier {x,y} following nothing.
13029정성태4/14/20227143Windows: 203. iisreset 후에도 이전에 설정한 전역 환경 변수가 w3wp.exe에 적용되는 문제
13028정성태4/13/20227135.NET Framework: 1193. (appsettings.json처럼) web.config의 Debug/Release에 따른 설정 적용
13027정성태4/12/20227352.NET Framework: 1192. C# - 환경 변수의 변화를 알리는 WM_SETTINGCHANGE Win32 메시지 사용법파일 다운로드1
13026정성태4/11/20228898.NET Framework: 1191. C 언어로 작성된 FFmpeg Examples의 C# 포팅 전체 소스 코드 [3]
13025정성태4/11/20228211.NET Framework: 1190. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 vaapi_encode.c, vaapi_transcode.c 예제 포팅
... 16  17  18  19  20  21  22  23  [24]  25  26  27  28  29  30  ...