【发布时间】:2017-05-17 09:55:15
【问题描述】:
以下是我的要求:
- 程序将有一个带有 3 个标签的 XML 文件作为输入:
OrgContent、Signature和Certificate。所有这些数据都是 Base64 编码的。注意:程序使用的是 BC jars - 程序需要对其进行解码并使用签名和证书验证数据的真实性
- 经过验证的数据应经过 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();
}
}
当我打印 new String(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-----
【问题讨论】:
标签: java base64 certificate x509 decoding