![将 putty ppk 转换为 pkcs12 挂起](https://linux22.com/image/1597545/%E5%B0%86%20putty%20ppk%20%E8%BD%AC%E6%8D%A2%E4%B8%BA%20pkcs12%20%E6%8C%82%E8%B5%B7.png)
我正在尝试将 putty ppk 文件转换为 pkcs12 以供 Java 密钥库使用。我在 Google 上搜索了一半的互联网,所有方法都围绕使用 openssl 将 ppk 文件转换为 pkcs12。在使用 puttygen 读取 ppk 文件并将私钥转换为 openssh 后,我尝试执行以下步骤:
openssl pkcs12 -export -inkey my.ppk -out new.p12
我尝试了很多变体,指定了名称和全部,但 openssl 命令在终端或 dos 提示符中挂起。没有错误。空的 p12 文件。只有黑色。
PPK 文件可以用 puttygen 读取。我尝试过使用和不使用密码。导出为私有 RSA 和 OpenSSH 格式。
为什么 PPK 到 PKCS12 的转换挂起了?
答案1
不确定自动僵尸化有什么好处,但对于那些关心的人来说:
为什么[尝试] PPK 到 PKCS12 的转换挂起了?
openssl pkcs12 -export
通常至少读取两样东西:来自的私钥-inkey
,以及匹配的 X.509 类型证书来自-in
,或者如果没有指定,就像本例中没有指定一样,来自 stdin(标准输入)。通常,stdin 将从包含证书的文件重定向,或从生成(可能是检索,可能是生成)证书的命令传输,但由于这些都没有完成,openssl
正在等待原帖者打印证书以 PEM 格式保存在终端上。这是因为 PKCS12 文件通常包含与相应的 X.509(或实际上相同的东西,PKIX)证书匹配的私钥。
这引出了楼主的一个问题不是问
[去哪里获取证书?]
SSH 密钥一般没有 X.509 证书,Putty 密钥尤其没有。OpenSSH 有自己的私有证书,几乎与 X.509 完全不同,它与我所知道的任何其他证书(包括 Putty)都无法互操作。
PKCS12 标准非常灵活 —— 有些人会说过于灵活 —— 实际上,PKCS12 文件可能只包含私钥,而没有匹配的证书。OpenSSL 可以通过添加到-nocerts
子pkcs12 -export
命令来创建此文件。(更正)但是,这违反了 Java API 上规定的要求KeyStore
,虽然在我的测试中,标准提供程序无论如何都会读取该文件,但程序可能能够或不能使用它。
给定一个私钥(例如由Puttygen导出的私钥)OpenSSL 可以创建“自签名”证书对于该密钥——这是一个伪证书,不是由 CA(证书颁发机构)以正常方式颁发的。实际上有两种方法,它们都基于req
名义上创建企业社会责任-- 证书签名要求。您可以使用 一步完成openssl req -new -x509 -key privkeyfile -out certfile ...
(证书中的一些数据有其他选项,如主题名称、有效期长度和扩展)或分两步创建 CSR,然后自己“批准”:然后openssl req -new -key privkeyfile -out csrfile ...
。openssl x509 -req -in csrfile -signkey privkeyfile -out certfile ...
有许多现有的 Q,很多(大多数?)可以追溯到很多年前,已经涵盖了这两个选项。
这将“起作用”,因为openssl pkcs12 -export
可以创建包含私钥和自签名证书的文件,并且 Java(*) 可以读取该文件。但是,对于您想要使用 Java 密钥库的几乎所有事情来说,此密钥库都是无用的。例如,您可以使用此密钥库配置 HTTPS 或其他 SSL/TLS 服务器,它将运行,但几乎所有客户端在尝试连接时都会发现证书不是来自有效 CA 并中止。一些东西,如邮递员,会忽略证书错误并继续,还有一些,如curl --insecure
,可以配置为,但浏览器和应用程序等将不起作用。同样,您可以在 Java 中使用这样的密钥库来签署 PDF 文档,但任何读该文件将被拒绝,因为该证书不是来自有效的CA。等等。
(*) 使用 Java 8u60 以上版本,读取 PKCS12 应该“就可以正常工作”;在此之前/之下可能需要特殊配置或有时需要编码,但 JCA 具有此功能。
因此,获得有用PKCS12 密钥库用于openssl req -new
创建 CSR,将 CSR 发送到 CA 并获得“真实”证书(这可能需要花钱,但也有一些免费的 CA,至少有一个,LetsEncrypt,是值得信赖的),并用它openssl pkcs12 -export
来放置该证书,加任何需要的中间或“链”证书,和私钥,全部在 PKCS12 中。所需的链证书因使用的 CA 和获得的证书类型而异,但本世纪运营的每个公共 CA 至少需要一个;CA 应该记录您应该使用的链证书,或者将其与您的最终实体“叶”证书一起提供给您或“捆绑”提供给您,或者两者兼而有之。
答案2
OpenSSL 不支持 PPK 文件。只有 PuTTY 工具支持。您可以使用 PuTTYgen 将 PPK 转换为 PEM。然后您应该能够将 PEM 转换为 PKCS12。
答案3
正如@“Martin Prikryl”已经提到的,OpenSSL 不支持 PPK 文件,您需要安装putty-tools
。之后,您puttygen YOUR_PRIVATE.ppk -O private-openssh -o your_private_id
将为您的私钥和puttygen YOUR_PUBLIC.ppk -O public-openssh -o your_public_id
公钥执行。