2017-01-03 123 views
1

解码下面是我的要求:爪哇 - 如何Base64编码的证书

  1. 计划将有一个XML文件作为输入有3个标签:和。所有这些数据都是Base64编码的。注:程序是使用BC罐子
  2. 计划需要来解码和使用签名和证书
  3. 验证的数据应该是Base64编码解码并写入到另一个文件

下面验证其真实性的数据是我的代码它试图证书解码:

public void executeTask(InputStream arg0, OutputStream arg1) throws SomeException{ 
try{ 
    BufferedReader br = null; 
    br = new BufferedReader(new InputStreamReader(arg0)); 
    String orgContent = "", splitData = "", signContent = "", certContent = ""; 

    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
    Document doc = docBuilder.parse(arg0); 
    doc.getDocumentElement().normalize(); 

    NodeList originalContent = doc.getElementsByTagName("OrgContent"); 
    Element originalElement = (Element)originalContent.item(0); 
    NodeList textOrgContent = originalElement.getChildNodes(); 
    orgContent = ((Node)textOrgContent.item(0)).getNodeValue().trim(); 

    NodeList signature = doc.getElementsByTagName("Signature"); 
    Element signatureElement = (Element)signature.item(0); 
    NodeList signatureContent = signatureElement.getChildNodes(); 
    signContent = ((Node)signatureContent.item(0)).getNodeValue().trim(); 

    NodeList certificate = doc.getElementsByTagName("Certificate"); 
    Element certificateElement = (Element)certificate.item(0); 
    NodeList certificateContent = certificateElement.getChildNodes(); 
    certContent = ((Node)certificateContent.item(0)).getNodeValue().trim(); 
    String decodedCertContent = new String(Base64.decode(certContent),StandardCharsets.UTF_8); 
    byte[] certByteValue = Base64.decode(certContent); 
    CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 
    System.out.println("certContent:\n" + new String(certByteValue,StandardCharsets.UTF_8)); 
    InputStream inputStream = new ByteArrayInputStream(Base64.decode(certContent)); 

    X509Certificate cert = (X509Certificate)certFactory.generateCertificate(inputStream); 

    arg1.write(decodedOrgData.getBytes()); 
    arg1.flush(); 
} 
catch (ParserConfigurationException e){ 
    e.printStackTrace(); 
} 
catch (IOException e){ 
    e.printStackTrace(); 
} 
catch (org.xml.sax.SAXException e){ 
    e.printStackTrace(); 
} 
catch (CertificateException e){ 
    e.printStackTrace(); 
} 

}

当我打印新字符串(certByteValue,StandardCharsets.UTF_8)的值时,程序正在打印一些无法识别的文本。当执行代码的最后一行时X509Certificate cert = (X509Certificate)certFactory.generateCertificate(inputStream);系统抛出java.security.cert.CertificateException:无法解析证书:java.io.IOException:无效的BER/DER数据(太大?)。

由于我是这些证书的新手,我已经陷入僵局。我无法继续这项要求。我想知道如何达到我的上述要求。

编辑 上述代码的输入流将是一个xml文件。另一个程序使用带有签名和证书的base64编码数据创建该xml文件。在该程序中,用于编码所述证书下面的代码用于:

 KeyStore keyStore = KeyStore.getInstance("JKS"); 
    keyStore.load(new FileInputStream("Filepath/certificate.p12"), "password".toCharArray()); 
    PrivateKey privateKey = (PrivateKey)keyStore.getKey(alias, "password".toCharArray()); 

     CertificateFactory factory = CertificateFactory.getInstance("X.509"); 
     X509Certificate certificate = (X509Certificate) factory.generateCertificate(new FileInputStream("D:/Sujai/Implementation Team/PI/Axis Treds/Certificates/PI_7.5_Cert/Arteria_Certificate-cert.cert")); 
    byte[] encodedCert = certificate.getEncoded(); 
    String encodedStringCert = new String(Base64.encode(new String(encodedCert).getBytes(StandardCharsets.UTF_8))); 

可变encodedStringCert被作为标签内的证书值传递。在这个问题顶部共享的程序中,我需要解码这个证书的值。

样品证书内容:----- BEGIN CERTIFICATE ----- MIIDBjCCAe6 .... IM1g == ----- END CERTIFICATE -----

回答

1

new String(certByteValue,StandardCharsets.UTF_8)失败因为证书编码数据不能表示为字符串

问题可能在于源数据不是base64 X509证书,或者是您的库Base64.decode()的编码问题。我建议使用Java的标准解码器8 Base64.getDecoder().decode()DataTypeConverter.parseBase64Binary()为Java> 6

检查也是这个工作代码解码base64编码的证书

String certB64 = "MIIHFDCCBfygAwIBAgIIK2o4sL7KHQgwDQYJKoZIhvcNAQELBQAwSTELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRlcm5ldCBBdXRob3JpdHkgRzIwHhcNMTYxMjE1MTQwNDE1WhcNMTcwMzA5MTMzNTAwWjBmMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEVMBMGA1UEAwwMKi5nb29nbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEG1y99TYpFSSiawnjJKYI8hyEzJ4M+IELfLjmSsYI7fW/V8AT61quCswtBMikJYqzYBZrV2Reu5sHlLr6936cR6OCBKwwggSoMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjCCA2sGA1UdEQSCA2IwggNeggwqLmdvb2dsZS5jb22CDSouYW5kcm9pZC5jb22CFiouYXBwZW5naW5lLmdvb2dsZS5jb22CEiouY2xvdWQuZ29vZ2xlLmNvbYIWKi5nb29nbGUtYW5hbHl0aWNzLmNvbYILKi5nb29nbGUuY2GCCyouZ29vZ2xlLmNsgg4qLmdvb2dsZS5jby5pboIOKi5nb29nbGUuY28uanCCDiouZ29vZ2xlLmNvLnVrgg8qLmdvb2dsZS5jb20uYXKCDyouZ29vZ2xlLmNvbS5hdYIPKi5nb29nbGUuY29tLmJygg8qLmdvb2dsZS5jb20uY2+CDyouZ29vZ2xlLmNvbS5teIIPKi5nb29nbGUuY29tLnRygg8qLmdvb2dsZS5jb20udm6CCyouZ29vZ2xlLmRlggsqLmdvb2dsZS5lc4ILKi5nb29nbGUuZnKCCyouZ29vZ2xlLmh1ggsqLmdvb2dsZS5pdIILKi5nb29nbGUubmyCCyouZ29vZ2xlLnBsggsqLmdvb2dsZS5wdIISKi5nb29nbGVhZGFwaXMuY29tgg8qLmdvb2dsZWFwaXMuY26CFCouZ29vZ2xlY29tbWVyY2UuY29tghEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNugg0qLmdzdGF0aWMuY29tggoqLmd2dDEuY29tggoqLmd2dDIuY29tghQqLm1ldHJpYy5nc3RhdGljLmNvbYIMKi51cmNoaW4uY29tghAqLnVybC5nb29nbGUuY29tghYqLnlvdXR1YmUtbm9jb29raWUuY29tgg0qLnlvdXR1YmUuY29tghYqLnlvdXR1YmVlZHVjYXRpb24uY29tggsqLnl0aW1nLmNvbYIaYW5kcm9pZC5jbGllbnRzLmdvb2dsZS5jb22CC2FuZHJvaWQuY29tghtkZXZlbG9wZXIuYW5kcm9pZC5nb29nbGUuY26CBGcuY2+CBmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIKdXJjaGluLmNvbYIKd3d3Lmdvby5nbIIIeW91dHUuYmWCC3lvdXR1YmUuY29tghR5b3V0dWJlZWR1Y2F0aW9uLmNvbTALBgNVHQ8EBAMCB4AwaAYIKwYBBQUHAQEEXDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0GA1UdDgQWBBThPf/3oDfxFM/hdOi5kLv8qrZbsjAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMCEGA1UdIAQaMBgwDAYKKwYBBAHWeQIFATAIBgZngQwBAgIwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3BraS5nb29nbGUuY29tL0dJQUcyLmNybDANBgkqhkiG9w0BAQsFAAOCAQEAWZQy0Kvn9cPnIh7Z4kfUCXX/dhdvjLJYFAn3b3d5DVs1BLYuukfIjilVdAeTUHZH7TLn/uVejg3yS0ssRg1ds1iv2O9DJbnl5FHcjNAvwfN533FulWP41OC6B6dC6BGGTXTvQobDup7/EKg1GWX9ksBtTfKLH5wrjhN955Itnd25Sjw2bSjLaWEtTrjINXmnBoc2+qHFzF/fNxK1KbmkBboUIGoaGsThe3AF0Ye+XAeaZH08+GdrorknlHDQLLtHIcJ3C6PrQ/kTpwWd/TVXW42BN+N7xZiGJbvKOg0S0rk2hzhgX4QoUKZHMqqh1sS6ypkfnWx75nh325y4Tenk+A=="; 
byte encodedCert[] = Base64.getDecoder().decode(certB64); 
ByteArrayInputStream inputStream = new ByteArrayInputStream(encodedCert); 

CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 
X509Certificate cert = (X509Certificate)certFactory.generateCertificate(inputStream); 

我假定你的证书不具有标签----- BEGIN CERTIFICATE ---------- END CERTIFICATE -----

EDITED

您可以直接加载.cer在base64 PEM中编码的文件(使用-----BEGIN CERTIFICATE-----标签)。

FileInputStream inputStream = new FileInputStream (pathToYourCert); 
CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 
X509Certificate cert = (X509Certificate)certFactory.generateCertificate(inputStream); 
+0

它具有这些标签。我会在这里稍微扩展一点:\t下面是生成我在代码中获得的输入的代码。 encodedStringCert字符串是我的程序的输入:'code'CertificateFactory factory = CertificateFactory.getInstance(“X.509”); \t X509Certificate certificate =(X509Certificate)factory.generateCertificate(new FileInputStream(“FilePath/cert.cert”)); \t \t byte [] encodedCert = certificate.getEncoded(); \t \t String encodedStringCert = new String(Base64.encode(new String(encodedCert).getBytes(StandardCharsets.UTF_8)));'code' – Sujaikareik

+0

抱歉上面的格式不正确。由于我是新手,我不知道这里的格式 – Sujaikareik

+0

我建议用这段代码更新这个问题。它与前一个不同。您可以从base64 PEM中的'.cer'加载证书(使用'----- BEGIN CERTIFICATE -----'标签)。使用你在评论中发布的代码,但你不能这样做'new String(encodedCert).getBytes(StandardCharsets.UTF_8)'。请参阅解答 – pedrofb