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

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

我收到以下错误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

我的理解是,这是它找不到的“主题”……然而,我具体规定:

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"

手册的唯一建议是配置文件不存在;我可以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 

…这几乎是实际上是文档中的例子

我在这里做错了什么?

答案1

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

[req]
distinguished_name = req_distinguished_name

[req_distinguished_name]
# empty.

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

[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}

(请注意,这里的${DOMAIN}不是文字;您应该将其替换为您的 DNS 域名;我在脚本中创建此文件bashcat >"$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"

截至本文发布时,我的理解是,SHA-1 已在 X.509 证书中弃用¹,因此-sha256(这是一个未记录的标志……),而 subjectAltName 正成为必需²,因此需要配置。据我所知,为了生成上述最佳实践的 CSR,唯一的额外问题是您应该使用至少 2048 位的 RSA 密钥大小(如果您使用的是 RSA,我就是这么做的);你必须指定命令的大小,openssl genrsa因为当前默认值是不安全的。

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

答案2

我遇到了同样的问题并在这里找到了答复:

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 

进而:

openssl req -new -key private.key -sha256 -nodes -config openssl.conf -out certificate.csr

答案3

对我来说,此错误似乎是由于在 Windows Server 2012 中运行命令时创建了错误的路径引起的,C:\OpenSSL-Win32\bin

openssl req -new -sha256 -key private.pem -out example.csr

在请求密码之前输出非阻塞错误:

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

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

openssl req -new -sha256 -key private.pem -config openssl.cfg -out example.csr

答案4

另一个可能的问题可能是特殊(不可见)UTF-8 字符。使用以下方法检查文件

cat -v $OPTIONS_FILE

相关内容