2017-04-11 100 views
0

我收到的時候我試圖將證書轉讓給X.509無法解析證書:java.io.IOException異常:不支持的編碼

「無法解析證書以下異常:java.io. IOException異常:不支持的編碼 」

從CA的證書2048是這樣的(所述certicicate是不具有換行僅有一個線),這是正常的?

----- BEGIN CERTIFICATE ----- MIIERTCCAy2gAwIBAgIFIBkicgAwDQYJKoZIhvcNAQEFBQAwWTELMAkGA1UEBhMCQ04xMDAuBgNVBAoTJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEYMBYGA1UEAxMPQ0ZDQSBURVNUIE9DQTExMB4XDTE3MDQwNjA2NDQ1OVoXDTE5MDQwNjA2NDQ1OVowdzELMAkGA1UEBhMCQ04xFTATBgNVBAoTDENGQ0EgVEVTVCBDQTERMA8GA1UECxMITG9jYWwgUkExGTAXBgNVBAsTEE9yZ2FuaXphdGlvbmFsLTExIzAhBgNVBAMUGjA1MUBDSl9BQUJCQ0BaMDAwMDAwMDU1MUAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtgAftvnIcaGITXhuWY1R1IYfrCstmDKJYO9anhFcUrsEe7l1BHcmXeF1Fr7KzTr + XmQx8RkSrECm6Gyfg/jElmh6XHEL3UyExIuSxuCoTs + 71JlBPkCDcTdyo4lDI6Ox3JsKU/W8LFKSpae6jAA0uhgwjPCI5uizONLWTdRiXRNRUG7zvGaCgHDipP7gN1Tm + KvlDs8xJGtLdeErlIIDy4Tw2EkK + LD + L9FD8CruzpY52UkTfYfqM3Mwu1EZtfIke0M/dpSkP + 46XPJH7CCbXv + f65ST2Uh + PclwPo3O2raZMZ2R3alCEMx0ZKYbA4hekdt/FJygUwN9e1MCu8KqyQIDA QABo4H1MIHyMB8GA1UdIwQYMBaAFPwLvESaDjGhg6mBhyceBULGv1b4MEgGA1UdIARBMD8wPQYIYIEchu8qAQIwMTAvBggrBgEFBQcCARYjaHR0cDovL3d3dy5jZmNhLmNvbS5jbi91cy91cy0xNS5odG0wOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovLzIxMC43NC40Mi4zL09DQTExL1JTQS9jcmwxODExOS5jcmwwCwYDVR0PBAQDAgPoMB0GA1UdDgQWBBTNUgad4XedWMDOeezrG + J + iwFxQDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwDQYJKoZIhvcNAQEFBQADggEBAI906RKm5xPIaJzIeVpXRUIyHtf/9klxqNdjoXbwfplSocUioYZDPOy33w2b9Wfl/HDNKVUksv6n09dx0hdwiJZaNaVbLw0VGPwg5eTEcSEj1iQzkGGlsCt8uNROGilB8Vn0cPfhByroFO9e8bj7GNAxYtg7fvUB9XIXlMqLukIZ5JY6yOLj2y/MvoQp7B/9xdBWxqDqWhZaaEgsRxeezZ3CIGQjevSF/xNe8g2zM/13K38h64FGS3P1iNAcyJUfjoMSAXMSgPWE8uPDtENU + XgthSsNrTPBxkkY5ZuEj7YGHsiHt8mAK37QigC12fL1gF7OG8oCE/a1ZyfTukj0KRI = ----- END CERTIFICATE -----

該方案是這樣的:

public static X509Certificate getX509Certificate(String base64Cert) 
{ 
    X509Certificate cert = null; 
    if (!isNullOrEmpty(base64Cert)) 
    { 
     log.error("getX509Certificate(): " + base64Cert); 
     BufferedInputStream is = new BufferedInputStream(
       new ByteArrayInputStream(base64Cert.getBytes())); 
     CertificateFactory cf; 
     try 
     { 
      cf = CertificateFactory.getInstance("X.509"); 
      cert = (X509Certificate) cf.generateCertificate(is); 
     } catch (CertificateException e) 
     { 
      log.error("cert format error,cert content is [" + base64Cert 
        + "]"); 
     } 
    } else 
    { 
     log.error("cert is null"); 
    } 
    return cert; 
} 

任何幫助將不勝感激!

回答

0

無論如何,這是我的解決方案,將單線證書轉移到多線。 但我仍然不知道原因的原因,任何人都可以解釋這一點,請發表您的答案。

public static String singleLine2MultiLine(String p10) throws Exception{ 
    byte[] base64Data = p10.getBytes(); 
    ByteArrayInputStream bis = new ByteArrayInputStream(base64Data); 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    byte tmp; 
    while ((tmp = (byte) bis.read()) != -1) { 
     if (tmp != 0x0a && tmp != 0x0d) { 
      bos.write(tmp); 
     } 
    } 
    byte[] bSingleLine = bos.toByteArray(); 
    ByteArrayOutputStream bos2 = new ByteArrayOutputStream(); 
    for (int i = 0; i < bSingleLine.length; i++) { 
     if (i != 0 && i % 64 == 0) { 
      bos2.write("\r\n".getBytes()); 
     } 
     bos2.write(bSingleLine[i]); 
     if (i == bSingleLine.length - 1) { 
      bos2.write("\r\n".getBytes()); 
     } 
    } 
    return new String(bos2.toByteArray()); 
} 
0

PEM文件格式是

  • 忽略的數據
  • 的換行,或數據緩衝區的開始
  • 5連字符
  • 「BEGIN」
  • 一個或多個字(型號信息)
  • 5連字符
  • 的換行
  • Base64編碼數據(有效負載)
  • 的換行
  • 5連字符
  • 「END」
  • 類型信息相同的值
  • 5連字符
  • 忽略的數據

換行符是格式的一部分。沒有它,你不是PEM,並且因爲它大概只支持PEM和DER(base64編碼數據的二進制表示),並且你的價值既不是那些,它也是在一些「不受支持的編碼」,這發生在是「PEM狀,但不換行」

1

這是我的解決方案爲Base64格式的證書轉換爲x509證書

byte[] decodedCertificate = 
    Base64.decodeBase64(encodedCertificate.getBytes()); 
    CertificateFactory certificateFactory; 
    Certificate certificate = null; 

    try { 
     certificateFactory = CertificateFactory.getInstance("X.509"); 
     certificate = certificateFactory.generateCertificate(new 
      ByteArrayInputStream(decodedCertificate)); 
    } catch (CertificateException e) { 
     e.printStackTrace(); 
    } 

     X509Certificate x509Certificate = (X509Certificate) certificate; 
相關問題