【问题标题】:How do I import SSL certifcate .pem file into JRE cacerts file on Mac?如何在 Mac 上将 SSL 证书 .pem 文件导入 JRE cacerts 文件?
【发布时间】:2018-11-29 17:53:27
【问题描述】:

我尝试使用keytool -importcert -alias (my cert alias) -file (cert file path.pem) -keystore (jre keystore path),但我收到一条错误消息,提示我的 .pem 文件不是 x509 证书。我认为这是因为我的 .pem 文件格式不正确,或者因为它同时包含私钥和证书。有什么建议么?我的 .pem 文件如下所示:

Bag Attributes
    Microsoft Local Key set: <No Values>
    localKeyID: 
    friendlyName: 
    Microsoft CSP Name: 
    X509v3 Key Usage: 10 
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG...
-----END PRIVATE KEY-----
Bag Attributes
   ...
-----BEGIN CERTIFICATE-----
MIIHQzCCBiugAwIBAgIQDEtIx...
-----END CERTIFICATE-----

【问题讨论】:

  • 试试这个工具。它可能会为您提供有关该问题的更多信息keystore-explorer.org
  • 你(Mac)真的有古老的Java吗? 6 和更早版本没有处理(正确的)PEM 块之前的其他信息。

标签: java macos https ssl-certificate keystore


【解决方案1】:

我终于能够将证书导入到我的 JRE cacerts 文件中。首先,我必须创建一个仅包含证书的新 .pem 文件:

-----BEGIN CERTIFICATE-----
MIIHQzCCBiugAwIBAgIQDEtIx...
-----END CERTIFICATE-----

然后我不得不将 cacerts 文件复制到一个新位置,然后运行以下代码来导入它:

keytool -import -v -trustcacerts -alias serveralias -file /Applications/certificate.pem -keystore /cacerts

导入证书后,我将新的 cacerts 文件复制回 JRE 安全文件夹,成功!

【讨论】:

    【解决方案2】:

    查看this page on the PEM file format 由于您的文件包含对 Microsoft 的引用,我建议确保该文件使用 Unix 行尾 (\n) 而不是 Windows 行尾 (\r\n)

    【讨论】:

    • 谢谢,这很有帮助。我将尝试将 .pem 文件拆分为 privatekey.pem 和 certifcate.pem,然后转换行尾,我会回复您看看是否有效。
    • Java 可以使用任何一种或任何类型的行分隔符读取 PEM 证书(和 CRL),请参阅例如 readOneBlock hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/… 或 j6 使用 BufferedReader 同上。
    • @dave 我使用的是 Java 8。如果我的机器上有证书,我可以将其作为文件读取并使用 java 将其导入我的 cacerts 文件吗?或者我应该使用来自 httpget 的输入流并使用 readOneBlock ?
    • @TMO:你实际上不能直接打电话给readOneBlock;它位于提供程序结构的深处,当您在代码 或 中的 keytool 中使用 CertificateFactory 时会自动调用它。 j8 keytool 应该像你在 Q 中那样工作,我不知道为什么它不工作,除非文件中有一些看不见的损坏/损坏,这似乎不太可能。如果'httpget'是指Apache httpclient中的HttpGet,它从服务器(或尝试)获取数据并且与您机器上的文件无关,否则我不知道您的意思。 ...
    • ...鉴于您可能无法使用明文私钥发布实际文件,我不知道还能说什么。您是否拥有或可以找到或借用任何其他可以测试此文件的系统?
    【解决方案3】:

    不幸的是,我无法将证书导入到我的 cacerts 文件中,但是我能够配置我的 CloseableHttpClient 以便它使用没有“有效”证书的 HTTPS URL。我只是在实现我的客户端时使用了以下代码:

    SSLContext sslContext = new SSLContextBuilder()
        .loadTrustMaterial(null, ((certificate, authType) -> true)).build();
    CloseableHttpClient client = HttpClients.custom().setSSLContext(sslContext)
        .setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
    

    我知道这不是处理这种情况的正确方法,但我并不担心在此特定实例中验证来自与我通信的服务器的证书。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      相关资源
      最近更新 更多