Java에서 인증서 사용시, String 형태로 되어 있지 않은 경우 (파일로 받아오거나, X509Certificate 형태로 받은 경우) 에는 다시 PEM 형태로 변환이 필요할 때가 있어서, 정리해서 기재한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | import java.security.cert.X509Certificate; import java.util.Collection; import java.util.Iterator; import org.bouncycastle.asn1.pkcs.SignedData; import org.bouncycastle.cert.X509CertificateHolder; import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; import org.bouncycastle.cms.CMSSignedData; import org.bouncycastle.util.Store; import com.sun.org.apache.xml.internal.security.utils.Base64; public class pemConvert { public static void main(String[] args) throws Exception { //signData : PEM 형태로 되어있는 인증서 String signData = "PEMDATA"; chainCheck(signData); } public static void chainCheck(String signData) { try { // PEM 인증서 -> X509Certificate 형태의 인증서로 변경 후 // 다시 X509Certificate 인증서를 String형태의 PEM 인증서로 변환 byte[] derData = Base64.decode(signData); CMSSignedData cmsData = new CMSSignedData(derData); Store<X509CertificateHolder> certStore = cmsData.getCertificates(); Collection<X509CertificateHolder> allCollection = certStore.getMatches(null); Iterator<X509CertificateHolder> allIt = allCollection.iterator(); X509CertificateHolder firstCertificateHolder = allIt.next(); X509Certificate issuedCertificate = new JcaX509CertificateConverter().getCertificate(firstCertificateHolder); String pemCert = new String(Base64.encode(issuedCertificate.getEncoded())); System.out.println("PEM : " + pemCert); } catch (Exception e) { e.printStackTrace(); } } } | cs |
java security 외에도 BouncyCastle을 사용해야 하는데,
bcpkix-jdk15to18-166.jar
bcprov-jdk15to18-166.jar
이 임포트 되어 있어야 정상 사용 가능하다.
지금 소스는 인증서 형태로 signData를 넣지 않으면 오류가 출력된다.
com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException: You must initialize the xml-security library correctly before you use it. Call the static method "com.sun.org.apache.xml.internal.security.Init.init();" to do that before you use any functionality from that library.
at com.sun.org.apache.xml.internal.security.utils.Base64.decodeInternal(Base64.java:509)
at com.sun.org.apache.xml.internal.security.utils.Base64.decode(Base64.java:485)
at verifyTest4.chainCheck(verifyTest4.java:39)
at verifyTest4.main(verifyTest4.java:27)
그냥 형태 맞춰서 넣으면 정상 동작 가능하다.
댓글
댓글 쓰기