gpt4 book ai didi

java - 直接在文件系统上使用 PEM 编码的 CA 证书进行 HTTPS 请求吗?

转载 作者:太空宇宙 更新时间:2023-11-04 15:01:46 24 4
gpt4 key购买 nike

这类似于 Import PEM into Java Key Store 。但问题的答案使用 OpenSSL 进行转换并使用工具将它们导入到文件系统上的 key 存储中。

我正在尝试使用格式良好的 X509 证书作为信任 anchor :

static String CA_FILE = "ca-rsa-cert.pem";

public static void main(String[] args) throws Exception
{
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(CA_FILE), null);

TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);

SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);

// Redirected through hosts file
URL url = new URL("https://example.com:8443");

HttpsURLConnection connection = (HttpsURLConnection) url
.openConnection();
connection.setSSLSocketFactory(context.getSocketFactory());

...
}

当我尝试运行该程序时,出现错误:

$ java TestCert 
Exception in thread "main" java.io.IOException: Invalid keystore format
at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:650)
at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55)
at java.security.KeyStore.load(KeyStore.java:1214)
at TestCert.main(TestCert.java:30)

我也尝试过KeyStore ks = KeyStore.getInstance("PEM");getInstance("X509"); ,但它们也不起作用。

我知道 Java 支持 PEM 和 DER 编码证书,因为这是 Web 服务器发送到客户端的证书。但 KeyStoreType 都没有似乎符合我的需求,所以我怀疑我没有为此使用正确的 API。

我想直接使用它们而不是将它们导入到长期存在的 KeyStore 中的原因是:

  1. 有数百个 PEM 证书可供测试
  2. 证书位于我的文件系统上
  3. 使用文件系统中的证书符合我的工作流程
  4. 我不想使用 opensslkeytool
  5. 我不想执行 key 存储维护

如何在文件系统上获取格式良好的 PEM 编码证书并直接使用它?

最佳答案

我在尝试以另一种方式做到这一点时找到了答案 Set certificate for KeyStore.TrustedCertificateEntry? 。它基于 Vit Hnilica 在 loading a certificate from keystore 的回答。 。我将用这个答案留下问题,因为大多数 Stack Overflow 答案都以“使用 openssl 进行转换,然后使用 keytool ...”开头。

String CA_FILE = ...;

FileInputStream fis = new FileInputStream(CA_FILE);
X509Certificate ca = (X509Certificate) CertificateFactory.getInstance(
"X.509").generateCertificate(new BufferedInputStream(fis));

KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null, null);
ks.setCertificateEntry(Integer.toString(1), ca);

TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
...

关于java - 直接在文件系统上使用 PEM 编码的 CA 证书进行 HTTPS 请求吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22493997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com