OpenSSL在PKCS12导出过程中卡住,显示“Loading 'screen' into random state”。

117

我正在使用OpenSSL(而非makecert)生成自签名的SSL证书,以在IIS中使用。

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes -subj '//CN=myhost'

(双斜杠是正确的。如果没有双斜杠,上述命令将无法正常工作。)

openssl pkcs12 -export -out key.pfx -inkey key.pem -in cert.pem -name 'myhost'

第一条命令成功完成。然而,第二条命令卡在了

Loading 'screen' into random state -

我正在使用随同 Git for Windows (2.6.3) 的 OpenSSL (1.0.2d)。 有人遇到过同样的问题吗?

澄清: 问题《如何修复 OpenSSL 中的“无法写入‘random state’”错误》描述了不同的问题,即无法编写 .rnd 文件。而这里的问题似乎是生成随机状态。(只出现在第二条命令中。)


你尝试过另一个版本的OpenSSL吗(它们有独立的构建)? - Iansus
没有。(最后,我使用了MakeCert。) - TN.
1
可能是如何在openssl中修复“无法写入'随机状态'”的问题的重复。此外,在Windows上还有一些错误;请参见OpenSSL维基上的随机数| Windows问题。最后,/CN=myhost可能是错误的;请参见如何使用openssl创建自签名证书? - jww
3个回答

333
请尝试在openssl之前添加winpty
winpty openssl ...

或者您可以运行由winpty包装的新bash:
winpty bash

在Windows控制台中,终端的输入/输出存在一些问题,因此如果某些软件需要Unix终端行为,则可以使用winpty来解决。
winpty帮助我在这个环境中运行openssl。
git version 2.7.3.windows.1
OpenSSL 1.0.2g  1 Mar 2016

5
这个答案和@Duncan Smart的答案是可以互换的。当导出PFX文件时,OpenSSL会提示输入密码。但是在Git for Windows中的终端无法处理此I/O,因此命令会一直停留。在命令前添加winpty可以包装命令,使得I/O能够正常工作,而在命令中传递-passout参数则意味着OpenSSL不再需要询问密码。 - Rabadash8820
1
经过30年的时间,Windows 10自带的PowerShell控制台终于能够进行半可靠的ANSI/VT仿真,详见https://devblogs.microsoft.com/commandline/new-experimental-console-features/。当从PowerShell控制台运行openssl密码提示时,它可以正常工作,您可以通过ssh连接运行编辑器而不会破坏打开的每个文件,并且可以剪切和粘贴。您甚至可以*调整终端窗口的大小*。现在,如果我能摆脱难以忍受的“唤醒死者”控制台蜂鸣声就好了... - Robert Calhoun

107

我发现需要在命令行中使用-passout pass:SomePassword指定PFX密码,例如:

openssl pkcs12 -export -out foo_example_com.pfx -inkey foo_example_com.key -in foo_example_com.crt -passout pass:Pa55w0rd

1
非常感谢。它只是挂起来了,没有任何提示必须提供密码。 - Miller-STGT
1
它能工作,但实际上这只是绕过问题而不是解决问题。这是一个终端问题,最好通过winpty的答案来解决。 - John Fantastico

1
最近我在从Windows 10笔记本电脑通过SSH连接到Azure Ubuntu虚拟机上运行openssl时遇到了同样的问题。我还尝试在Windows命令提示符和PowerShell中使用Windows版本的openssl。导致这个问题的根本原因似乎是在Windows命令提示符中使用openssl时终端不兼容。
我发现基于wsl(Windows子系统Linux)的shell表现良好,命令会通过正确的提示而不是看起来卡住。以下是步骤:
  1. 安装Ubuntu on Windows
  2. 启动Windows命令提示符。使用wsl命令启动bash shell。
  3. openssl工具已经在此shell中可用。它应该会提示输入密码并验证密码。

openssl pkcs12 command


如何将密码包含在行内? - frozenade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接