如何在使用 openssl 生成自签名证书时添加扩展密钥使用字符串

如何在使用 openssl 生成自签名证书时添加扩展密钥使用字符串

我正在 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"

相关内容