【问题标题】:How to generate Java PKCS12 store to connect to regular SSL website?如何生成 Java PKCS12 存储以连接到常规 SSL 网站?
【发布时间】:2021-08-08 13:34:57
【问题描述】:

我们使用常规购买的 SSL 证书通过 https 运行标准 Web API。我们的客户只是通过 https 访问它,证书是通过默认系统 RootCA 信任的。

新客户端正在使用需要 PKCS12 密钥库中的证书的 Java 通信服务器。我们如何从我们的 key/csr/crt/pem 文件生成 PKS12 密钥库?

我做了一些研究,大多数示例都需要私钥。我当然不想与客户分享我们的私钥。

是否可以在没有私钥的情况下创建 PKCS12 密钥库,类似于浏览器中的标准 RootCA?

谢谢,蓝豹

【问题讨论】:

  • 没有 PKCS#12 证书之类的东西。然而,存在 PKCS#12 密钥库或信任库之类的东西。它是哪一个?具体一点。
  • 感谢您指出这一点。客户刚刚表示他们需要 PKCS12 格式的证书。
  • 这能回答你的问题吗? Creating a .p12 file
  • 在我的脑海中,openssl pkcs12 -in cert.crt -inkey key -out -export cert.p12 应该很接近。有时 LMGTFY 链接是合适的答案...
  • 如果您是服务器,而客户端是客户端,那么他们需要的是 PKCS#12 信任库。这仅包含导出的证书,没有私钥。但他们真正需要的是将您的证书按原样导入到他们现有的信任库中,以便继续访问他们的其他站点。更好的是,您需要让他们已经信任的 CA 签署您的服务器证书。而且您似乎已经这样做了,新客户已经在做一些错误的事情,这不是您的责任。他们的要求是考虑不周的。

标签: java ssl public-key-encryption pkcs#12


【解决方案1】:

是的。

虽然 PFX-now-PKCS12 主要用于存储或传输私钥证书链证书作为一个集群,并且最常用于也就是说,它能够存储一个或多个与任何私钥都不匹配的“单独”证书。你是正确的,想要连接到你的客户端应该在他们的信任库中拥有你的服务器证书链的根证书,或者你的服务器证书本身,但绝对不是你的私钥。

openssl确实可以创建这样的PKCS12:

 openssl pkcs12 -export -in certfile.pem [-name $name] -nokeys -out blah.p12 
 # if you don't specify -name it defaults to 1 (the digit one) which can be mildly confusing
 # instead of being prompted for the password you can use -passout with several forms
 # described on the openssl man page, but consider the warning below

但是如果他们使用标准 (Sun/Oracle/OpenJDK) 加密提供程序,则结果在 Java 中不起作用,这些加密提供程序(在 8+ 中)仅在以下情况下支持 PKCS12 中的单独证书作为 Java 中的“trustedCert”条目(每个) certbag 都有一个特殊的 Sun 定义的属性,Java 提供者在创建此类文件时会写入该属性,但 OpenSSL 没有。

改为在 8 中使用 Java 的 keytool:

jre8/bin/keytool -importcert -keystore blah.p12 -storetype pkcs12 -file $certfile [-alias $name]

或在 9+ 中,pkcs12 现在是默认值:

jre9+/bin/keytool -importcert -keystore blah.p12 -file $certfile [-alias $name]

如果您不指定别名,则默认为mykey。在这两种情况下,您都可以添加-storepass $pw 以避免被提示,但因此密码将显示在您的屏幕上,在您的 shell 或其他命令处理器的命令历史记录中,它有一个,并且在大多数情况下其他进程同时在您的系统上运行,(任何)这可能是一个安全问题,也可能不是。也可以添加-noprompt,避免出现确认提示。

但是 user207421 是(大致)正确的,即使用这样的信任库可以破坏从他们的系统(至少来自同一个 JVM)建立的 other SSL/TLS 连接,除非个别调用指定个别,单独的信任库,如果他们编写了代码,他们将知道如何处理(并要求)更简单的证书格式,例如 PEM。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    相关资源
    最近更新 更多