当前位置: 首页 > 知识库问答 >
问题:

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

秦博达
2023-03-14

这类似于将PEM导入Java密钥存储。但问题的答案是使用OpenSSL进行转换,并使用工具将其导入文件系统上的密钥存储。

我试图使用一个格式良好的X509证书作为信任锚:

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。

我希望直接使用它们而不将它们导入长寿命的密钥库的原因如下:

  1. 有数百个PEM证书要测试
  2. 证书在我的文件系统上
  3. 从文件系统使用证书匹配我的工作流
  4. 我不想使用opensslkeyool
  5. 我不想执行密钥存储维护

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


共有1个答案

蓬思博
2023-03-14

我在Set certificate for KeyStore尝试以另一种方式执行此操作时找到了答案。信任的认证尝试?。它基于Vit Hnilica在从密钥库加载证书时的回答。我将用这个答案来回答这个问题,因为大多数堆栈溢出答案都是以“使用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);
...
 类似资料:
  • 问题内容: 这类似于将PEM导入Java密钥存储区。但是问题的答案使用OpenSSL进行转换和使用工具将其导入文件系统上的密钥存储中。 我正在尝试使用格式良好的X509证书作为信任锚: 当我尝试运行程序时,出现错误: 我也尝试了和,但它们也不起作用。 我知道Java支持PEM和DER编码的证书,因为这是Web服务器发送给客户端的内容。但是所有的似乎都不符合我的需求,因此我怀疑我没有为此使用正确的A

  • 在Android上安装系统CA证书 从Android 7开始,除非将应用程序配置为使用用户证书,否则它们将忽略用户证书。由于大多数应用程序未明确选择使用用户证书,因此我们需要将mitmproxy CA证书放置在系统证书存储中,以避免不得不打补丁我们要监视的每个应用程序。 请注意,应用程序可以决定忽略系统证书存储,并维护自己的CA证书。在这种情况下,您必须修补该应用程序。 1.先决条件 来自Andr

  • 问题内容: 我已经在debian’s中安装了一个自签名的root ca cert并使用安装了它们。在这一点上很高兴,也很高兴,但是python2和python3请求模块坚持认为对证书不满意。 python2: python3 为什么python会忽略系统ca-certificates捆绑包,以及如何集成它? 问题答案: 从http://codingdict.com/questions/664 为了

  • 我已经将一个自签名的根ca证书安装到debian的中,并使用安装它们。此时,true|gnutls-climysite.local感到高兴,true|openssls_client连接mysite.local:443感到高兴,但是python2和python3请求模块坚持认为它对证书不满意。 蟒蛇2: 蟒蛇3

  • 也许我会在这里找到帮助。我想在spring boot应用程序上启用SSL。我的配置如下: 服务器:端口:8999 SSL:enabled:true key-store:classpath:keystore.jks key-store-password:mypass key-password:mypass 问题是我的密钥库。我已将*crt文件导入别名为“tomcat”的密钥存储库: 但是,我仍然无法

  • 我有一个包含证书、私钥和信任链的.pem文件,以及使用openssl pkcs12-export从中生成的.p12文件: < code > OpenSSL pkcs12-export-out file . p12-in file . PEM-inkey file . PEM-passin pass:password-passout pass:password 我的PEM文件结构: 我正在使用此cu