需要在运行时从 txt 文件添加证书
Need to add certificate from txt file in runtime
客户提供了 2 个“.txt”格式的证书,我需要在运行时调用 SOAP 服务时添加这些证书。无法添加“.txt”格式文件,因为我越来越像 'Invalid Format'。证书在 txt 文件的顶部和底部有“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”headers,因此它是 PEM 类型文件(我假设)。任何 help/suggestion 都将是可观的。
低于异常::
Exception in thread "main" java.io.IOException: Invalid keystore format
使用下面的代码..
public KeyManagerFactory getKeyManagerFactory() throws UnrecoverableKeyException, CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException {
InputStream inputStream = null;
KeyStore ts = null;
KeyManagerFactory keyManagerFactory = null;
try {
ts = KeyStore.getInstance("JKS");
inputStream = this.getClass().getClassLoader().getResourceAsStream("publicCert.txt");
ts.load(inputStream, null);
keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(ts, null);
} catch (Exception e) {
throw e;
} finally {
try {
inputStream.close();
} catch (Exception e) {
throw e;
}
}
return keyManagerFactory;
}
得到答案后,使用下面的代码,它的工作
rootInterIS = new FileInputStream("rootIntermediaryCertificate.txt");
domainIS = new FileInputStream("domainCertificate.txt");
keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(null);
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
X509Certificate rootInterCert = (X509Certificate) certFactory.generateCertificate(rootInterIS);
X509Certificate domainCert = (X509Certificate) certFactory.generateCertificate(domainIS);
keystore.setCertificateEntry("domainCertificate", domainCert);
keystore.setCertificateEntry("rootInterCe", rootInterrtificateCert);
trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keystore);
PEM 格式由一行 ----BEGIN x-----
表示一个或多个单词 x
,一行或多行包含内部结构匹配 x
的数据的 base64,以及匹配的 END
行。虽然有人 可以 创建一个包含正确 BEGIN/END 行但错误的 base64 的伪造文件,除非他们主动试图给你带来麻烦,一个看起来像你描述的文件很可能是PEM 证书。
证书(PEM 格式)不是密钥库,尤其不是 JKS。 Java 支持多种不同的密钥库格式,其中 none 是 PEM,none 仅限于证书。使用 KeyStore.getInstance(type)
仅读取您没有的密钥库;使用 CertificateFactory.getInstance("X.509")
读取证书文件(实际上是 PEM 或二进制文件,也就是 DER,但目前您只关心前者)。
在 SSL/TLS 中,KeyManager
仅用于使用私钥 验证(证明)您自己身份的证书 没有。将没有私钥的证书放在 KeyManager
中将完全无用且无效。如果有人只给了你一个证书而不是私钥来连接到他们的系统,那应该是一个证书来验证他们的系统,而不是你的;询问供应商或查看文件以确认这一点。鉴于 Java,您可以使用 keytool -printcert -file $file
查看证书的详细信息。
您需要将该证书放入 TrustManager
中。请注意 KeyManager
和 TrustManager
都使用 KeyStore
对象,但出于不同的目的以不同的方式使用。因此,您创建了一个 in-memory 空 KeyStore
(执行 .getInstance(type)
然后 .load(null)
), 添加 上面的证书 作为 'trusted' 证书,并将其传递给 TrustManagerFactory
,然后在 SSLContext
等
中使用生成的 TrustManager
]
客户提供了 2 个“.txt”格式的证书,我需要在运行时调用 SOAP 服务时添加这些证书。无法添加“.txt”格式文件,因为我越来越像 'Invalid Format'。证书在 txt 文件的顶部和底部有“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”headers,因此它是 PEM 类型文件(我假设)。任何 help/suggestion 都将是可观的。
低于异常::
Exception in thread "main" java.io.IOException: Invalid keystore format
使用下面的代码..
public KeyManagerFactory getKeyManagerFactory() throws UnrecoverableKeyException, CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException {
InputStream inputStream = null;
KeyStore ts = null;
KeyManagerFactory keyManagerFactory = null;
try {
ts = KeyStore.getInstance("JKS");
inputStream = this.getClass().getClassLoader().getResourceAsStream("publicCert.txt");
ts.load(inputStream, null);
keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(ts, null);
} catch (Exception e) {
throw e;
} finally {
try {
inputStream.close();
} catch (Exception e) {
throw e;
}
}
return keyManagerFactory;
}
得到答案后,使用下面的代码,它的工作
rootInterIS = new FileInputStream("rootIntermediaryCertificate.txt");
domainIS = new FileInputStream("domainCertificate.txt");
keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(null);
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
X509Certificate rootInterCert = (X509Certificate) certFactory.generateCertificate(rootInterIS);
X509Certificate domainCert = (X509Certificate) certFactory.generateCertificate(domainIS);
keystore.setCertificateEntry("domainCertificate", domainCert);
keystore.setCertificateEntry("rootInterCe", rootInterrtificateCert);
trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keystore);
PEM 格式由一行 ----BEGIN x-----
表示一个或多个单词 x
,一行或多行包含内部结构匹配 x
的数据的 base64,以及匹配的 END
行。虽然有人 可以 创建一个包含正确 BEGIN/END 行但错误的 base64 的伪造文件,除非他们主动试图给你带来麻烦,一个看起来像你描述的文件很可能是PEM 证书。
证书(PEM 格式)不是密钥库,尤其不是 JKS。 Java 支持多种不同的密钥库格式,其中 none 是 PEM,none 仅限于证书。使用 KeyStore.getInstance(type)
仅读取您没有的密钥库;使用 CertificateFactory.getInstance("X.509")
读取证书文件(实际上是 PEM 或二进制文件,也就是 DER,但目前您只关心前者)。
在 SSL/TLS 中,KeyManager
仅用于使用私钥 验证(证明)您自己身份的证书 没有。将没有私钥的证书放在 KeyManager
中将完全无用且无效。如果有人只给了你一个证书而不是私钥来连接到他们的系统,那应该是一个证书来验证他们的系统,而不是你的;询问供应商或查看文件以确认这一点。鉴于 Java,您可以使用 keytool -printcert -file $file
查看证书的详细信息。
您需要将该证书放入 TrustManager
中。请注意 KeyManager
和 TrustManager
都使用 KeyStore
对象,但出于不同的目的以不同的方式使用。因此,您创建了一个 in-memory 空 KeyStore
(执行 .getInstance(type)
然后 .load(null)
), 添加 上面的证书 作为 'trusted' 证书,并将其传递给 TrustManagerFactory
,然后在 SSLContext
等
TrustManager
]