개발/기타 개발관련

OpenSSL을 이용하여 공인인증서(공동인증서) PKCS12 형식으로 변환하는 방법

jineddy 2025. 4. 13. 17:13
728x90

프로젝트 진행 중 별도의 라이브러리 없이 JAVA 에서 XML 전자문서에 서명을 추가해야 하는 과업이 있어 진행 하던 내용을 정리해 봤습니다.

Java에서 공인인증서(공동 인증서)를 이용해 XML에 서명을 하려면, 인증서가 PKCS#12 (.p12) 형식이어야 합니다. 일반적으로 공동인증서는 .der, .key 파일 형태로 제공되는데, 이를 OpenSSL을 통해 변환하는 과정을 정리해봅니다.

 

※ 변환전 준비 사항

  • 공인인증서(공동인증서) 파일 (signCert.der, signPri.key)
  • OpenSSL 툴 (※ 버전 주의: 1.1.1 계열 사용 권장)
    • 최신 OpenSSL (3.x 이상)에서는 SEED-CBC 방식이 더 이상 지원되지 않아 복호화가 실패할 수 있습니다.
    • OpenSSL 1.1.1 버전을 사용하면 문제 없이 변환됩니다. 이와 관련해 설치 방법이 궁금하시면 [이 글] 을 참고 하세요.

 

1. 인증서 파일을 PEM 형식으로 변환

D:\openssl-3.5.0\apps>openssl x509 -inform DER -in signCert.der -out signCert.pem

 

2. 개인키 파일을 PEM 형식으로 변환

D:\openssl-3.5.0\apps>openssl pkcs8 -inform DER -nocrypt -in signPri.key -out signPri.pem
Error decrypting key
68170100:error:068000A8:asn1 encoding routines:asn1_check_tlen:wrong tag:crypto\asn1\tasn_dec.c:1194:
68170100:error:0688010A:asn1 encoding routines:asn1_d2i_ex_primitive:nested asn1 error:crypto\asn1\tasn_dec.c:752:
68170100:error:0688010A:asn1 encoding routines:asn1_template_noexp_d2i:nested asn1 error:crypto\asn1\tasn_dec.c:685:Field=version, Type=PKCS8_PRIV_KEY_INFO

비밀번호 없이 시도하여 실패

D:\openssl-3.5.0\apps>openssl pkcs8 -inform DER -in signPri.key -passin pass:비밀번호 -out signPri.pem
Error decrypting key
D0F80000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:crypto\evp\evp_fetch.c:375:Global default library context, Algorithm (SEED-CBC : 65), Properties ()

비밀번호를 추가하여 재시도 하여도 실패

이유는 3.5.0 버전에서는 SEED-CBC 방식 지원이 종료되었기 때문이었습니다.

인터넷 검색하여 시도할 경우 대부분 이 부분에 문제 없이 통과하는것으로 나오는데 이는 과거 버전으로 진행하여 문제 없이 성공하는것으로 보입니다.

D:\openssl-1.1.1w\apps>openssl pkcs8 -inform DER -in signPri.key -passin pass:비밀번호 -out signPri.pem

1.1.1w 버전을 추가 설치하여 진행한 결과 오류 메시지가 없이 실행되는것을 확인 할수 있습니다.

 

3. PKCS12 (.p12) 파일로 병합

D:\openssl-1.1.1w\apps>openssl pkcs12 -export -out mycert.p12 -inkey signPri.pem -in signCert.pem -passout pass:비밀번호

 

  • -inkey : PEM 형식 개인키
  • -in : PEM 형식 인증서
  • -passout : 생성할 PKCS12 파일의 비밀번호

 

 

4. 변환된 .p12 파일 검증

D:\openssl-1.1.1w\apps>openssl pkcs12 -in mycert.p12 -info -noout
Enter Import Password:

MAC: sha1, Iteration 2048
MAC length: 20, salt length: 8
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048

정상적으로 .p12 파일이 생성되었고, 사용할 수 있는 상태입니다.

 참고

  • Java에서 .p12 파일을 활용해 XML 전자서명을 하려면 KeyStore를 통해 키를 로드하고, XML Digital Signature API를 사용할 수 있습니다.
  • 다음 글에서는 공인인증서(공동인증서)를 활용한 Java XML 서명 구현 방법을 다룰 예정입니다.

 

같이 읽어보기 좋은 글

[개발] - Windows에 OpenSSL 설치하는 방법 (GitHub 소스 빌드 기준)

 

Windows에 OpenSSL 설치하는 방법 (GitHub 소스 빌드 기준)

지난 프로젝트에서 XML 전자문서를 서명할 일이 있었는데 JAVA에서 서명하는 프로그램을 만드려면 인증서를 PKCS12 형식으로 변환해야 하는 일이 있었다.이를 위해 윈도우에 OpenSSL 프로그램을 버젼

jineddy.tistory.com

[개발/Java] - JAVA에서 XML 전자문서에 디지털 서명하는 방법 (PKCS12 인증서 사용)

 

JAVA에서 XML 전자문서에 디지털 서명하는 방법 (PKCS12 인증서 사용)

프로젝트를 진행하다 보면, 외부 상용 라이브러리 없이 **전자문서(XML)**에 디지털 서명을 직접 구현해야 하는 경우가 종종 생깁니다.이번 글에서는 Java 표준 API를 이용하여 PKCS12 형식의 인증서

jineddy.tistory.com

 

 

728x90