OpenSSL x509v3扩展密钥用法

61

我知道你可以通过在openssl.cfg文件中添加以下一行来指定证书公钥的用途:

extendedKeyUsage=serverAuth,clientAuth

但由于我有多个要创建的证书,每个证书都具有不同的扩展密钥用法,是否可能在命令行中指定我需要的属性(而不使用openssl.cfg文件)?就像这样:

openssl req -newkey rsa:4096 \
            -extendedKeyUsage "serverAuth,clientAuth" \
            -keyform PEM \
            -keyout server-key.pem \
            -out server-req.csr \
            -outform PEM

谢谢!

6个回答

40

你只能使用类似这样的东西:

openssl -extensions mysection -config myconfig.cnf

以及我的config.cnf文件:

[mysection]
keyUsage         = digitalSignature
extendedKeyUsage = codeSigning

我不知道如何通过命令行接口使用这个功能。


5
我理解为:在配置中找不到“distinguished_name”。 - Marinos An
3
@MarinosAn,给定的配置文件只包含与问题相关的部分。你可能需要提供一些额外的参数。这超出了原始问题的范围。 - patrikbeno

23

您可以尝试使用addext:

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt \
    -subj '/CN=User1' \
    -addext extendedKeyUsage=1.3.6.1.4.1.311.80.1 \
    -addext keyUsage=keyEncipherment

适用于openssl 1.1.1a


1
序列 1.3.6.1.4.1.311.80.1 代表什么?应该被替换为 extendedKeyUsage = serverAuth, clientAuth, codeSigning, emailProtection 吗? - alijandro
这是微软特定的扩展(PKI)(我猜在openssl中没有相应的名称)。这更像是一个示例,您可以使用OID而不是使用名称(您可能不知道的名称)。 - Mike Twc
@cactuschibre 这在较旧的版本上无法运行。你使用的是哪个版本? - Mike Twc

14

我最终做的是创建了几个不同的openssl.cfg文件,通过使用-config-extfile开关来引用正确的文件。


8
你可能希望“接受”自己的答案(这样它就不会再显示为未回答的问题了)。 - umläute

6

与处理SAN相同

openssl req -subj "/CN=client" -sha256 -new -key client-key.pem -out client.csr\ -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:example.com,DNS:www.example.com\nextendedKeyUsage=serverAuth,clientAuth"))

请注意,上述命令需要在终端中执行。


4

最近的 OpenSSL 版本中,您可以使用 -addext 选项来添加扩展密钥用途(Extended key usage)

对于您的特定情况,应该如下所示:

openssl req -newkey rsa:4096 \                          
            -addext "extendedKeyUsage = serverAuth, clientAuth" \
            -keyform PEM \
            -keyout server-key.pem \
            -out server-req.csr \
            -outform PEM

你可以使用以下方式验证输出结果:
openssl req -noout -text  -in server-req.csr

更常见的用法是同时设置主题(subject)和密钥用途(key usage)。

以同样的示例为例:

openssl req -newkey rsa:4096 \
            -subj '/CN=My Name' \
            -addext "keyUsage = digitalSignature,keyAgreement" \
            -addext "extendedKeyUsage = serverAuth, clientAuth" \
            -keyform PEM \
            -keyout server-key.pem \
            -out server-req.csr \
            -outform PEM

3

Mike Twc,https://stackoverflow.com/users/7775187/mike-twc 是完全正确的!不幸的是,因为没有足够的声望来标记他的答案并添加扩展,所以我需要写一个新的答案…… 你需要使用-addext,但请记住这里有 key->value 参数,并且所有值必须用逗号分隔。

openssl req -x509 -nodes -newkey rsa:4096 -keyout efs.key -out efs.crt -days 36500 -subj '/CN=EFS/O=Company' -addext 'extendedKeyUsage=1.3.6.1.4.1.311.10.3.4,1.3.6.1.4.1.311.10.3.4.1'

您可以在答案中添加评论,而不是单独回答。 - dtech
@dtech 由于评级限制,我之前无法完成。 - KUL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接