我们有一个内部/私有 PKI 来颁发证书,因此只有公司的员工才能访问某些子域(例如 admin.example.com)。
这是我们用来生成证书的脚本:
names="john maria foo bar"
for name in $names; do
echo "$name"
openssl genrsa -aes256 -out $name.key 2048
# Creating the certificate signing request
openssl req -new -key $name.key -out $name.csr
# Signing the certificate
openssl ca -in $name.csr -out $name.crt
# Exporting both the key and the certificate in a p12 file
openssl pkcs12 -export -clcerts -in $name.crt -inkey $name.key -out $name.p12
# And now a bit of cleaning
rm $name.csr
done
该脚本为每个员工生成 .key 、 .crt 和 .p12 文件,然后员工可以将他的 p12 文件添加到他的浏览器(以及公司的 CA 根证书)以访问子域。
但最近,它不再适用于 Chrome,显然已经有更新,我们需要在员工使用的个人证书中包含 SAN(主题替代名称)。
下列的常见问题解答/主题替代名称 (SAN),我修改了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 = admin.example.com
DNS.2 = admindashboard.example.com
但生成的证书不包含 SAN。
我删除了脚本的最后一部分,该部分破坏了 .csr 文件,重新启动脚本并使用以下命令测试了 csr 文件
openssl req -text -noout -in john.csr | grep DNS
在这一点上,自从我得到以来,它似乎有效
DNS:admin.example.com, DNS:admindashboard.example.com
因此。
但是当我用以下命令测试 crt 文件时
openssl x509 -text -noout -in john.crt | grep DNS
我什么也没得到。
我错过了什么吗?
答案1
OpenSSL 仅将请求中的扩展复制到证书(如果已配置)。
该选项在配置文件的部分copy_extensions
中调用。[ca]
如果缺少或设置为,none
则不会将任何扩展从您的请求复制到您的证书。
如果设置为copy
它,将从请求中复制不在证书中的任何其他扩展。
如果设置为copyall
它,将复制所有扩展,覆盖证书中的任何扩展。
man ca
会告诉你这件事。它还带有警告。如果您使用该命令随意签署任何请求openssl ca
,则当设置此选项时;您最终可能会颁发带有扩展名的证书,例如CA:True
.首先检查您的请求。