openssl“无法在配置中找到‘distinguished_name’”

Tha*_*tos 50 openssl

我收到以下错误openssl req

unable to find 'distinguished_name' in config
problems making Certificate Request
41035:error:0E06D06C:configuration file routines:NCONF_get_string:no value:/SourceCache/OpenSSL098/OpenSSL098-52.30.1/src/crypto/conf/conf_lib.c:329:group=req name=distinguished_name
Run Code Online (Sandbox Code Playgroud)

我的理解是,这是它找不到的“主题”……但是,我说明的是:

openssl req -new \
    -key "$PRIVATE_KEY" \
    -sha256 \
    -config "$OPTIONS_FILE" \
    -subj "/C=US/ST=California/L=San Francisco/O=ACME, Inc./CN=*.*.$DOMAIN/" \
    -out "$CSR_FILENAME"
Run Code Online (Sandbox Code Playgroud)

手册的唯一建议是配置文件不存在;我可以cat "$OPTIONS_FILE",所以它肯定存在,并且该错误之前没有手册指出的错误,如果是这种情况,它将在此之前出现,所以我很确定会openssl看到配置文件。

我的配置文件包含以下内容:

[req]
req_extensions = v3_req

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.*.example.com 
Run Code Online (Sandbox Code Playgroud)

...这几乎就是文档中的示例

我在这里做错了什么?

Tha*_*tos 40

据我所知-config正在覆盖某种内部配置;如果您看到openssl req 手册页的“示例”部分,它会显示其中包含配置文件的示例distinguished_name。凭直觉,我在配置中添加了以下内容:

[req]
…
distinguished_name = req_distinguished_name

[req_distinguished_name]
# empty.
Run Code Online (Sandbox Code Playgroud)

因此,我的整个配置看起来像

[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name

[req_distinguished_name]

[v3_req]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.*.${DOMAIN}
Run Code Online (Sandbox Code Playgroud)

(请注意,这里${DOMAIN}不是字面意思;您应该将其替换为您的 DNS 域名;我在bash脚本中创建了此文件,使用cat >"$OPTIONS_FILE" <<EOF,然后是上面,然后是EOF

openssl req … -subj <my subject> -config <that file> …然后从命令行获取我的主题。对于那些感兴趣的人,整个命令最终看起来像:

openssl req -new \
    -key "$PRIVATE_KEY" \
    -sha256 \
    -config "$OPTIONS_FILE" \
    -subj "/C=US/ST=California/L=San Francisco/O=My Company, Inc./CN=*.*.$DOMAIN/" \
    -out "$CSR_FILENAME"
Run Code Online (Sandbox Code Playgroud)

在这篇文章中,我的理解是 X.509 证书不推荐使用 SHA-1,因此-sha256(这是一个未记录的标志......),并且 subjectAltName 变得必需²,因此需要配置。为了生成上述最佳实践 CSR,我所知道的唯一额外问题是您应该使用至少 2048 位的 RSA 密钥大小(如果您使用的是 RSA,我就是这样);您必须指定openssl genrsa命令的大小,因为当前默认值是不安全的。

¹虽然在我写这篇文章的时候还没有崩溃,但人们认为这只是时间问题。参见“逐渐淘汰SHA1”
²不再推荐使用CN作为域名;我不确定浏览器何时/是否打算弃用此功能。“不要在主题的通用名称中包含和检查看起来像域名的字符串。”,RFC 6125
注意:我不太确定keyUsage.

  • 请参阅我对该问题的说明;此答案中的配置无效,因为 `*.*.example.com` 无效(您不能有多个 `*`);c/p-ers 小心。 (2认同)

小智 18

我遇到了同样的问题,并在这里找到了回应:

https://www.citrix.com/blogs/2015/04/10/how-to-create-a-csr-for-a-san-certificate-on-netscaler/

配置文件如下所示:

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = US
ST = VA
L = SomeCity
O = MyCompany
OU = MyDivision
CN = www.company.com
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.company.com
DNS.2 = company.com
DNS.3 = www.company.net 
DNS.4 = company.net 
Run Code Online (Sandbox Code Playgroud)

进而:

openssl req -new -key private.key -sha256 -nodes -config openssl.conf -out certificate.csr
Run Code Online (Sandbox Code Playgroud)

  • `req_distinguished_name` 部分可以留空。它的作用是指定所需字段名称的标签模板,可以通过`-subj= /C=xx/ST=xx/L=xx/O=xx/OU=xx/CN=xx`覆盖等等,但不要分配这些字段值。 (2认同)

小智 5

对我来说,这个错误似乎是由于在 Windows Server 2012 中运行命令时路径创建不正确造成的, C:\OpenSSL-Win32\bin

openssl req -new -sha256 -key private.pem -out example.csr
Run Code Online (Sandbox Code Playgroud)

在要求 pass phare 之前输出非阻塞错误:

无法打开 C:\Program Files (x86)\Common Files\SSL/openssl.cnf 进行读取,没有这样的文件或目录

显然,由于斜杠错误,路径无效,因此必须在命令行中显式附加配置文件:

openssl req -new -sha256 -key private.pem -config openssl.cfg -out example.csr
Run Code Online (Sandbox Code Playgroud)