解码下面是我的要求:爪哇 - 如何Base64编码的证书
- 计划将有一个XML文件作为输入有3个标签:和。所有这些数据都是Base64编码的。注:程序是使用BC罐子
- 计划需要来解码和使用签名和证书
- 验证的数据应该是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 -----
它具有这些标签。我会在这里稍微扩展一点:\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
抱歉上面的格式不正确。由于我是新手,我不知道这里的格式 – Sujaikareik
我建议用这段代码更新这个问题。它与前一个不同。您可以从base64 PEM中的'.cer'加载证书(使用'----- BEGIN CERTIFICATE -----'标签)。使用你在评论中发布的代码,但你不能这样做'new String(encodedCert).getBytes(StandardCharsets.UTF_8)'。请参阅解答 – pedrofb