当前位置: 首页 > 面试题库 >

直接在文件系统上使用PEM编码的CA Cert进行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。

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

  1. 有数百种PEM证书要测试
  2. 证书在我的文件系统上
  3. 使用文件系统中的证书符合我的工作流程
  4. 我不想使用opensslkeytool
  5. 我不想执行密钥库维护

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


问题答案:

我在尝试为KeyStore.TrustedCertificateEntry设置证书时尝试另一种方法找到了答案。它基于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证书作为信任锚: 当我试图运行该程序时,我得到一个错误: 我还尝试了

  • 我有一个包含证书、私钥和信任链的.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

  • 问题内容: 我正在尝试使用请求获取正确的编码。 不管我做什么,丹麦字符的编码都不对。 有什么想法吗? 问题答案: 也许您的麻烦在于标题。假设您的标题为 如果是这样,您有2种方法可以解决此问题: 删除此标题 使用以下代码解压缩数据: });

  • 问题内容: 关于此问题,有什么方法可以将[文件从ASP.NET应用程序直接上传到Amazon S3并具有进度条? -—编辑---- 两天后,仍然没有直接的运气。发现了一件看起来很有前途但又不是免费的东西:http : //www.flajaxian.com/ 使用Flash通过进度条直接上传到S3。 问题答案: 我也在寻找解决方案。也许这会有所帮助, 来自AWS Dev Commnity, 但在许

  • 摘要 本文介绍了 RT-Thread 文件系统的基本知识和使用方法,帮助开发者更好地使用 RT-Thread 文件系统。并给出了在正点原子 STM32F429-apollo 开发板上验证的代码示例。 简介 第一次接触 RT-Thread 文件系统的开发者可能觉得 RT-Thread 文件系统过于复杂,不知道该从何入手。想要在项目中使用文件系统,却不知道该怎么做。本文将介绍 RT-Thread 文件

  • 我使用RSA_public_encrypt函数发送加密数据到套接字。我正在读取公钥。使用"pkey=PEM_read_PUBKEY(f, NULL, NULL, NULL);"函数的PEM文件。从上面的函数中检索的pkey是类型EVP_PKEY*,我不能在函数RSA_public_encrypt中使用。(RSA_public_encrypt使用RSA*类型密钥) 如何将EVP_PKEY*PKEY转