をデコードする方法を以下に私の要件です:のJava - Base64でエンコードされた証明書
- プログラムは3個のタグを入力としてXMLファイルを持っています:、と。これらのデータはすべてBase64でエンコードされています。注意:プログラムが
- プログラムがそれらをデコードし、Base64では、復号化され、別のファイルの下
に書き込まなければなりません
検証されたデータを署名し、証明書を使用して、その信憑性についてのデータを確認する必要がBCの瓶を使用しています証明書を解読しようとする私のコードは次のとおりです。
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ファイルを作成します。そのプログラムでは、証明書を符号化するために以下のコードが使用される:変数encodedStringCertは、タグ内の証明書の値として渡され
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)));
。この質問の先頭にあるプログラムでは、この証明書の値を解読する必要があります。
サンプル証明書の内容:----- BEGIN CERTIFICATE ----- MIIDBjCCAe6 .... IM1g == ----- END CERTIFICATE -----の
このタグがあります。ここではもう少し広範囲になります:\t以下は私のコードで得られる入力を生成するコードです。 encodedStringCert stringは私のプログラムの入力です: 'code'CertificateFactory factory = CertificateFactory.getInstance(" X.509 "); \t X509証明書の証明書=(X509Certificate)factory.generateCertificate(新しいFileInputStream( "FilePath/cert.cert")); \t \t byte [] encodedCert = certificate.getEncoded(); \t \t String encodedStringCert = new String(Base64.encode(新しい文字列(encodedCert).getBytes(StandardCharsets.UTF_8))););コード – Sujaikareik
上記のフォーマットが悪いのは残念です。私が新しいので、ここでフォーマットを知らないのです – Sujaikareik
このコードで質問を更新することを提案します。それは前のものとは異なります。 base64 PEMでエンコードされた '.cer'(' ----- BEGIN CERTIFICATE ----- 'タグ付き)から証明書を読み込むことができます。コメントに投稿したコードを使用しますが、この 'new String(encodedCert).getBytes(StandardCharsets.UTF_8)'は実行できません。ソリューションについては – pedrofb