【问题标题】:Converting a PEM file to a .JKS Key Store and Trust Store files将 PEM 文件转换为 .JKS 密钥存储和信任存储文件
【发布时间】:2021-08-12 20:49:53
【问题描述】:

来自服务器端的PEM文件,打开时格式如下:

-----BEGIN CERTIFICATE-----
somestuff1234
-----END CERTIFICATE-----

我正在尝试将其转换为获取两个 JKS 文件(一个信任库和密钥库),我可以通过 SSL 使用我的 java 应用程序调用服务器。

任何人都可以帮助简单地分解如何使用 openssl 然后使用 java 密钥库来做到这一点?我尝试按照以下说明进行操作:https://docs.oracle.com/cd/E35976_01/server.740/es_admin/src/tadm_ssl_convert_pem_to_jks.html

但我无法成功导入密钥库,因为某些原因它是空的。 PS,当我按照这些说明创建 PKSC12 时,我没有输入私钥,因为我没有提供私钥。

我是否需要使用我自己也需要创建的私钥,但由于我只获得了证书而不确定是否需要它?有人告诉我中间证书是在 TLS 握手中发送的。

感谢您对此的任何帮助。

【问题讨论】:

  • 我不知道 Endeca 是什么,但那页是裤子;创建一个伪造的密钥对并将其删除以“创建一个空的......商店”是完全没用的、浪费的和愚蠢的。您不清楚您的问题是验证/信任服务器,您可能需要一个仅包含证书的信任库(尽管许多人认为他们实际上没有),还是验证你自己(客户),你需要一个不同的证书,一个(匹配的)私钥,通常还有一些链证书,全部在一个密钥库——或两者兼而有之。

标签: java ssl ssl-certificate pem jks


【解决方案1】:

尝试使用调试模式和关于 SSL 服务器的特定信任库运行您的 java 代码,如下所述: How to configure trustStore for javax.net.ssl.trustStore on windows?

【讨论】:

    【解决方案2】:

    如果该 PEM 文件中的唯一内容是您发布的内容:

    -----BEGIN CERTIFICATE-----
    somestuff1234
    -----END CERTIFICATE-----
    

    您将无法创建适合用作接受连接的 TLS 服务器的完整密钥库。

    您需要与证书对应的私钥。

    我是否需要使用我自己也需要创建的私钥,但由于我只获得了证书,所以不确定是否需要它?

    否 - 连同其识别数据,您的证书中包含一个公钥。整个证书由您的 CA 加密签名 - 这就是“信任”转移到您的证书的方式。证书中的公钥是从特定的私钥派生而来的。

    为什么它不起作用?因为使用证书中的公钥加密的数据只能使用派生公钥的私钥解密。

    您的证书只有在与正确的私钥配对时才有效。

    但是:

    我从 der 创建了 PKSC12,但没有输入私钥,因为我没有提供私钥。

    您必须拥有私钥和证书才能运行 TLS 服务器。*

    编辑:

    出于同样的原因,在连接到 TLS 服务器时,您必须将正确的私钥与您的证书配对,才能将其用作客户端证书。

    此外,TLS 证书是公开的 - 如果您只需要证明自己的身份,那么公开就会使其毫无用处。您拥有适当的私钥就是证明该证书是您的证书,而不是我的或其他任何人的。

    您的 TLS 服务器或与 TLS 服务器的客户端连接将无法正常工作,除非您找到适合您所拥有证书的私钥。如果您或您的组织丢失了该私钥,您必须创建一个新的私钥并通过该新私钥完成创建证书的过程。

    因为没有正确的私钥,你现在拥有的证书是完全没用的。

    * - 技术上不正确。 TLS 标准确实支持不需要任何证书或私钥的"anonymous" cipher suites。但几乎没有应用程序支持匿名密码套件。例如,如果您自己从源代码编译,OpenSSL 仅支持匿名密码套件。

    【讨论】:

    • 你认为 OP 想要运行服务器吗?我不那样读Q,虽然不清楚。并且尼特:您的脚注至少在 1.1.1 之前是错误的,假设打包程序等使用默认值并且不打补丁(很多):默认情况下上游仍然 编译 匿名套件(仅适用于 1.2 及以下版本)但它们被默认密码列表和全局级别禁用,您可以覆盖它们,例如openssl s_server -accept N -cipher aNULL:@SECLEVEL=0 -nocert。 (当然,这并不是一个好主意。)
    • @dave_thompson_085 你认为 OP 想要运行服务器吗? 我最初是这样读的,但在阅读了你的评论后我重新读了它,你可能是对的。这看起来更像是用于 TLS 客户端证书 - 但出于同样的原因,如果没有私钥,它仍然无用。而且我不知道 1.1.1 启用匿名(以及您的评论中的 NULL 密码...... :-o )开箱即用。我很确定 1.0.2 分支没有,至少如果使用 OpenSSL 源的默认值编译的话。而且我不知道目前正在开发的 3.0 分支会如何表现。
    • 那 (1.0.2) 也会被误认为 :-( 在 1.1.0 SECLEVEL 之前不存在(也不存在 TLS1.3),因此在 1.0.2 及更低版本中,匿名套件已编译但已禁用,并且可以仅使用-cipher aNULL 启用。我什至在 0.9.8 中使用它(仅在测试中)。注意 SSL/TLS 中有两种 NULL:aNULL(无身份验证或匿名,特别是 DH_anon=ADH 加上 ECDH_anon= AECDH)和eNULL(不加密);我们这里只讨论aNULL。(我注意到)3.0终于达到了beta,但我也没有仔细研究过。
    猜你喜欢
    • 2020-01-18
    • 2013-12-16
    • 2016-01-30
    • 2014-09-27
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2022-12-24
    相关资源
    最近更新 更多