OpenSSL和读取openssl.conf文件时出现的错误

152

我正在运行32位的Windows XP操作系统。

我刚从以下网址下载并安装了OpenSSL。 http://www.slproweb.com/products/Win32OpenSSL.html

然后我尝试使用以下命令创建自签名证书:

openssl req -x509 -days 365 -newkey rsa:1024 -keyout hostkey.pem -nodes -out hostcert.pem

然后它开始出现以下错误

Unable to load config info from /usr/local/ssl/openssl.cnf

经过一些搜索,我将上面的命令更改为

openssl req -config C:\OpenSSL\bin\openssl.conf -x509 -days 365 -newkey rsa:1024 -keyout hostkey.pem -nodes -out hostcert.pem

但是现在我在命令提示符中收到以下错误

error on line -1 of C:\OpenSSL\bin\openssl.conf
4220:error:02001002:system library:fopen:No such file or
directory:.\crypto\bio\bss_file.c:126:fopen('C:\OpenSSL\bin\openssl.conf','rb') 
4220:error:2006D080:BIO routines:BIO_new_file:no such file:.\crypto\bio\bss_file.c:129: 
4220:error:0E078072:configuration file routines:DEF_LOAD:no such file:.\crypto\conf\conf_def.c:197:

6
检查确切的文件名:openssl.conf ---> openssl.cnf - Mark
2
Windows现在的文件扩展名是.cfg。同时,请确保指定的文件路径(在命令行或环境变量OPENSSL_CONF中)不包含引号。 - tatx
文件扩展名(.cnf/.cfg)似乎取决于安装OpenSSL时使用的内容。在我刚刚完成的WampServer v3.2.2安装中,配置文件名为openssl.cnf。我还使用了来自Shining Path Productions的二进制文件进行了Windows10 64位安装。该安装中的文件名为openssl.cfg。这种OpenSSL配置文件扩展名的差异似乎是编译相关的。我尚未测试OpenSSL v1.1.1g可识别哪个扩展名。 - Bill Vallance
您可能还想将hostcert文件扩展名更改为.crt或.cer? - Joris
1
我们应该检查我们的安装,我安装了openssl lite,它没有这个配置文件。现在我正在使用git的ssl,更多信息请参见https://dev59.com/-VUL5IYBdhLWcg3wQGDd。 - Reejesh PK
19个回答

165

在Windows上,您还可以设置环境属性OPENSSL_CONF。例如,您可以从命令行键入:

set OPENSSL_CONF=c:/libs/openssl-0.9.8k/openssl.cnf

你可以通过输入以下命令来验证:

echo %OPENSSL_CONF%

你还可以将它设置为计算机的环境变量的一部分,这样所有用户和服务默认情况下都可以使用它。例如,请参见Windows NT中的环境变量管理Windows XP中的环境变量

现在,您可以运行openssl命令,而无需传递配置位置参数。


9
谢谢,对我有用!(设置 OPENSSL_CONF=c:\openssl-win32\bin\openssl.cfg) - Valentin H
@jww 尝试了这个,但它告诉我 set 是一个无效的命令。有什么想法吗? - Sarah
4
@Sarah - “set”是Windows命令,应该从“cmd.exe”中运行。它在非Windows机器上不起作用。“set”和“echo”的方法在Power Shell中也不起作用。你可以使用类似$X=1; Write-Output $X的东西。 - jww
@jww 谢谢。我正在使用 Windows 机器,但我在 openssl.exe 中使用了该命令,而不是 cmd.exe。我看了你的评论,然后转到 cmd.exe 并在那里键入了 set 命令。它可以正常工作,但我仍然在 openssl.exe 中收到相同的错误信息,指出“无法从 wrong_path/ssl/openssl.cnf 加载配置信息”,所以我尝试了下面的解决方案,使用带有 openssl 目录的参数 -config,这很完美地解决了问题。所以我很高兴。感谢你的帮助 :) - Sarah
应该标记为答案。坦白地说,这也应该是不必要的。例如,为什么这个OpenSSL Windows发行版不默认使用PWD? - stonedauwg
设置OPENSSL_CONF变量或从openssl命令指定配置文件,我仍然在\crypto\bio\bss_file.c文件上收到相同的错误。 现在配置文件已经正确读取,但还存在其他问题。 - Disu

49

只需在命令行中添加参数-config c:\your_openssl_path\openssl.cfg,将your_openssl_path更改为实际安装路径即可。


一直在关注这篇博客文章 http://ajden.towfeek.se/post/become-your-own-root-certificate-authority-and-create-self-signed-ssl-certificates 并且添加 -config 也适用于 cygwin,例如 $ openssl ca -in server.csr -config /etc/ssl/openssl.cnf。但是为什么 man openssl 中没有列出 -config 呢?https://www.openssl.org/docs/apps/openssl.html - barlop
@nneonneo 尝试了上面的解决方案,但告诉我 set 和 config 是无效命令。有什么想法吗? - Sarah
set 命令只能在 Windows 系统中使用;config 命令不是独立的命令(你需要将其附加到 OpenSSL 命令行中)。 - nneonneo

39

在第四步中,按照以下方式自己创建一个openssl.cnf文件:http://www.flatmtn.com/article/setting-openssl-create-certificates

链接失效后编辑 openssl.cnf文件的内容如下:

#
# OpenSSL configuration file.
#

# Establish working directory.

dir                 = .

[ ca ]
default_ca              = CA_default

[ CA_default ]
serial                  = $dir/serial
database                = $dir/certindex.txt
new_certs_dir               = $dir/certs
certificate             = $dir/cacert.pem
private_key             = $dir/private/cakey.pem
default_days                = 365
default_md              = md5
preserve                = no
email_in_dn             = no
nameopt                 = default_ca
certopt                 = default_ca
policy                  = policy_match

[ policy_match ]
countryName             = match
stateOrProvinceName         = match
organizationName            = match
organizationalUnitName          = optional
commonName              = supplied
emailAddress                = optional

[ req ]
default_bits                = 1024          # Size of keys
default_keyfile             = key.pem       # name of generated keys
default_md              = md5               # message digest algorithm
string_mask             = nombstr       # permitted characters
distinguished_name          = req_distinguished_name
req_extensions              = v3_req

[ req_distinguished_name ]
# Variable name             Prompt string
#-------------------------    ----------------------------------
0.organizationName          = Organization Name (company)
organizationalUnitName          = Organizational Unit Name (department, division)
emailAddress                = Email Address
emailAddress_max            = 40
localityName                = Locality Name (city, district)
stateOrProvinceName         = State or Province Name (full name)
countryName             = Country Name (2 letter code)
countryName_min             = 2
countryName_max             = 2
commonName              = Common Name (hostname, IP, or your name)
commonName_max              = 64

# Default values for the above, for consistency and less typing.
# Variable name             Value
#------------------------     ------------------------------
0.organizationName_default      = My Company
localityName_default            = My Town
stateOrProvinceName_default     = State or Providence
countryName_default         = US

[ v3_ca ]
basicConstraints            = CA:TRUE
subjectKeyIdentifier            = hash
authorityKeyIdentifier          = keyid:always,issuer:always

[ v3_req ]
basicConstraints            = CA:FALSE
subjectKeyIdentifier            = hash

18

如果您已经安装了带有OpenSSL的Apache,请导航到bin目录。在我的情况下是D:\apache\bin。

*如果您单独安装了openssl,这些命令也适用。

运行以下命令:

openssl req -config d:\apache\conf\openssl.cnf -new -out d:\apache\conf\server.csr -keyout d:\apache\conf\server.pem
openssl rsa -in d:\apache\conf\server.pem -out d:\apache\conf\server.key
openssl x509 -in d:\apache\conf\server.csr -out d:\apache\conf\server.crt -req -signkey d:\apache\conf\server.key -days 365

*这将创建一个自签名证书,您可以用于开发目的。

如果您已经安装了Apache,请在httpd.conf中添加以下内容:

  <IfModule ssl_module>
    SSLEngine on
    SSLCertificateFile "D:/apache/conf/server.crt"
    SSLCertificateKeyFile "D:/apache/conf/server.key"
  </IfModule>

提问者明确表示他正在使用Win32OpenSSL。Apache的东西从哪里来?它与问题有什么关系? - jww
3
当然,安装独立的OpenSSL或者与Apache捆绑的OpenSSL本质上是相同的。我提到了Apache,因为在95%的情况下,在Windows上安装OpenSSL的原因是将其与Apache一起使用。 - Artur Kedzior
这很有用,因为XAMPP在Apache文件夹中包含了OpenSSL。 - Jimmy Adaro

18

安装链接很有帮助,我从其他地方下载了0.9.8版本,但它无法正常工作。谢谢。 - EpicPandaForce

13

尝试以管理员身份运行openssl.exe。


3
为使这些命令正常运行,你不应该需要以管理员身份运行它们。更好的方式是修复潜在的问题。 - jww
如果安装在系统驱动器的程序文件目录中,则需要使用提升的权限运行命令,否则您将没有写入权限。 - CodeManX
3
这对我有用。我不知道为什么它想要访问 C:\Program Files\Common Files\SSL/openssl.cnf,但当以管理员身份运行时,突然不再关心它找不到它(也没有创建文件),但这对我有用,所以我也不在意。 - Simon_Weaver

13

我曾经使用Apache for windows二进制文件夹中的openssl.exe时遇到类似的错误。我指定了-config标志,但openssl.cnf文件路径中有一个拼写错误。我认为你会发现

openssl req -config C:\OpenSSL\bin\openssl.conf -x509 -days 365 -newkey rsa:1024 -keyout hostkey.pem -nodes -out hostcert.pem

应该是这样的

openssl req -config "C:\OpenSSL\bin\openssl.cnf" -x509 -days 365 -newkey rsa:1024 -keyout hostkey.pem -nodes -out hostcert.pem

注意:conf 可能应该改为 cnf


9
如果您在Windows上安装了OpenSSL和Git,则需要将以下内容添加到您的命令中:
-config "C:\Program Files\Git\usr\ssl\openssl.cnf"

6

我在Windows上遇到了同样的问题。通过按照以下方式设置环境变量,问题得以解决:

变量名称:OPENSSL_CONF 变量值:C:(OpenSSL目录)\bin\openssl.cnf


4

如果 OpenSSL 安装成功,请在 C 盘中搜索“OPENSSL”以找到配置文件并设置路径。

set OPENSSL_CONF=<location where cnf is available>/openssl.cnf

这对我很有效。


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