![如何在使用 openssl 生成自签名证书时添加扩展密钥使用字符串](https://linux22.com/image/626143/%E5%A6%82%E4%BD%95%E5%9C%A8%E4%BD%BF%E7%94%A8%20openssl%20%E7%94%9F%E6%88%90%E8%87%AA%E7%AD%BE%E5%90%8D%E8%AF%81%E4%B9%A6%E6%97%B6%E6%B7%BB%E5%8A%A0%E6%89%A9%E5%B1%95%E5%AF%86%E9%92%A5%E4%BD%BF%E7%94%A8%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我正在 Mac OS X 10.9 上使用 openssl 为 Windows Server 远程桌面服务生成自签名证书。
使用下面的命令我可以生成证书,
openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout myserver.key -out myserver.crt
但是,我需要添加扩展密钥使用字符串服务器身份验证(1.3.6.1.5.5.7.3.1)我不知道如何在上面的命令中执行此操作。
我尝试过使用 openssl 选项-ext 文件包含此内容的文件,
[= default ]
extendedKeyUsage = 1.3.6.1.5.5.7.3.1
但是,我收到一条错误“未找到-extfile 选项”
答案1
当openssl x509
使用时-extfile
,您所使用的命令openssl req
,需要-config
指定配置文件。
因此,您可以使用如下命令:
openssl req -x509 -config cert_config -extensions 'my server exts' -nodes \
-days 365 -newkey rsa:4096 -keyout myserver.key -out myserver.crt
默认配置文件(可能/System/Library/OpenSSL/openssl.cnf
在 OS X 上)中定义了通常的可分辨名称位提示,但使用时不会处理此文件-config
,因此您的配置文件还必须包含一些 DN 位。因此,上面引用的内容cert_config
可能看起来像这样:
[ req ]
prompt = no
distinguished_name = my dn
[ my dn ]
# The bare minimum is probably a commonName
commonName = secure.example.com
countryName = XX
localityName = Fun Land
organizationName = MyCo LLC LTD INC (d.b.a. OurCo)
organizationalUnitName = SSL Dept.
stateOrProvinceName = YY
emailAddress = [email protected]
name = John Doe
surname = Doe
givenName = John
initials = JXD
dnQualifier = some
[ my server exts ]
extendedKeyUsage = 1.3.6.1.5.5.7.3.1
# 1.3.6.1.5.5.7.3.1 can also be spelled serverAuth:
# extendedKeyUsage = serverAuth
# see x509v3_config for other extensions
正如评论中指出的那样,您可能可以省略大多数 DN 字段。对于 HTTPS 使用,我认为您所需要的只是一个与您的主机名匹配的 CN。
这可分辨名称和属性部分格式部分的要求(1)展示了如果您想生成多个类似的证书/请求,如何修改上述配置以提示输入值(并提供默认值)。
如果您需要其他证书扩展,请检查 x509v3_配置(5) 您可以在扩展部分中指定哪些其他位。
答案2
使用较新的 OpenSSL 版本,所有这些都可以在单个命令行上完成,而无需创建配置文件。该选项-addext
还添加到req
命令
有关扩展密钥用法的可能值的完整列表,请查看配置手册。
完整示例:
openssl req -x509 -nodes -newkey rsa:2048 -keyout key.pem -out server.pem -days 7300 -subj '/CN=My Name/C=US/OU=My Unit/O=ACME' -addext "keyUsage = digitalSignature, keyEncipherment, dataEncipherment, cRLSign, keyCertSign" -addext "extendedKeyUsage = serverAuth, clientAuth"