我正在尝试将 putty ppk 文件转换为 pkcs12 以供 Java 密钥库使用。我用 Google 搜索了一半的互联网,所有方法都围绕着使用 openssl 将 ppk 文件转换为 pkcs12。在用 puttygen 读取 ppk 文件并将私钥转换为 openssh 后,这是我尝试执行的:
openssl pkcs12 -export -inkey my.ppk -out new.p12
我尝试了很多变体,指定名称和所有,但 openssl 命令在终端或 dos 提示符下挂起。没有错误。空 p12 文件。只是黑暗。
可以使用 puttygen 读取 PPK 文件。我尝试过使用和不使用密码短语。导出为私有 RSA 和 OpenSSH 格式。
为什么 PPK 到 PKCS12 的转换挂起?
OpenSSL 不支持 PPK 文件。只有 PuTTY 工具可以。您可以使用 PuTTYgen 将 PPK 转换为 PEM。然后您应该能够将 PEM 转换为 PKCS12。
正如@“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
公钥执行。不确定自动 zombie-tizing 有什么好处,但对于任何关心的人:
openssl pkcs12 -export
通常至少读取两件事:一个来自 的私钥-inkey
,以及一个匹配的 X.509 类型证书,-in
如果未指定,则来自 stdin(标准输入),因为在这种情况下没有指定。通常 stdin 将从包含证书的文件重定向或从生成(可以检索,可以生成)它的命令进行管道传输,但是由于这些没有完成,所以openssl
正在等待 OP 以PEM 格式键入证书在他们的终端上。这是因为 PKCS12 文件通常包含与相应的 X.509(或实际上相同的 PKIX)证书相匹配的私钥。这提示了一个 OP 没有问的问题
一般的 SSH 密钥,尤其是 Putty 密钥,没有 X.509 证书。OpenSSH 确实有自己的私有证书,几乎完全不同于 X.509,它不能与我所知道的任何其他人互操作,包括 Putty。
PKCS12 标准非常灵活——有些人会说过度了——而且实际上可能有一个只有私钥而没有匹配证书的 PKCS12 文件。OpenSSL 可以通过添加
-nocerts
到pkcs12 -export
子命令来创建它。(更正)但是,这违反了 Java API 的规定要求KeyStore
,虽然在我的测试中标准提供程序无论如何都会读取文件,但程序可能会也可能不会使用它。给定一个私钥,例如由 Puttygen OpenSSL 导出的私钥可以为该密钥创建一个“自签名”证书——这是一个虚拟证书,不是由 CA(证书颁发机构)以正常方式颁发的。实际上有两种方法,这两种方法都建立在
req
名义上创建CSR的子命令之上——证书签名请求。在一个步骤中,您可以使用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 ...
。有很多现有的问题,很多(大多数?)可以追溯到很多年前,已经涵盖了这两个选项。这将在
openssl pkcs12 -export
可以创建并且 Java(*) 可以读取包含私钥和自签名证书的文件的意义上“工作”。然而,这个密钥库对于几乎所有你想使用 Java 密钥库的事情都是无用的。例如,您可以使用此密钥库配置 HTTPS 或其他 SSL/TLS 服务器,它会运行,但几乎所有客户端在尝试连接时都会看到证书不是来自有效 CA 并中止。一些东西,比如邮递员,会忽略证书错误并继续,还有一些东西,比如curl --insecure
,可以配置为,但是浏览器和应用程序之类的东西不会工作。同样,您可能会在 Java 中使用这样的密钥库来签署 PDF 文档,但任何阅读该文档的人都会拒绝它,因为该证书不是来自有效的 CA。等等。(*) 在 Java 8u60 上,读取 PKCS12 应该“正常工作”;below/before that special configuration or sometimes coding may be needed,但JCA有能力。
因此,获得有用的PKCS12 密钥库的方法是使用
openssl req -new
创建 CSR,将 CSR 发送到 CA 并获得“真实”证书(这可能需要花钱,但有一些免费的 CA,至少有一个,LetsEncrypt,非常值得信赖),并用于将该openssl pkcs12 -export
证书、任何需要的中间证书或“链”证书以及私钥放在PKCS12 中。所需的链证书因使用的 CA 和获得的证书类型而异,但本世纪运营的每个公共 CA 都至少需要一个;CA 应该记录您应该使用的链证书,或者将它(它们)与您的最终实体“叶”证书一起或“捆绑”提供给您,或两者兼而有之。