如何正确设置 openssl CA 以生成 ssl 客户端证书

SWi*_*ilk 9 openssl

我正在配置我的第一个 CA。它的目的是为我们的客户颁发证书,他们将使用它们通过 https 访问我们的 EDI 服务。所以我需要生成 ssl 客户端证书。至此,证书签名全过程正常,可以成功使用证书访问我们的服务,但我担心一件事:

生成的证书目的是通用的方式:

$ openssl x509 -purpose  -noout -in client.crt.pem
Certificate purposes:
SSL client : Yes
SSL client CA : No
SSL server : Yes
SSL server CA : No
Netscape SSL server : Yes
Netscape SSL server CA : No
S/MIME signing : Yes
S/MIME signing CA : No
S/MIME encryption : Yes
S/MIME encryption CA : No
CRL signing : Yes
CRL signing CA : No
Any Purpose : Yes
Any Purpose CA : Yes
OCSP helper : Yes
OCSP helper CA : No
Run Code Online (Sandbox Code Playgroud)

我觉得在我的情况下,除了 SSL 客户端和 S/MIME 签名之外,应该没有其他目的。我错了,这应该保持原样吗?

如果我是正确的,我应该禁用其他目的,我应该在我的 openssl.cnf 配置中放什么?

这是我当前的配置(剥离了一点):

[ CA_edi ]
# here was directory setup and some other stuff, cut it for clarity
x509_extensions = usr_cert      # The extentions to add to the cert

name_opt    = ca_default        # Subject Name options
cert_opt    = ca_default        # Certificate field options
# Extension copying option: use with caution.
# copy_extensions = copy
# stripped rest of config about validity days and such

[ usr_cert ]

basicConstraints=CA:FALSE
nsCertType = client, email
keyUsage = nonRepudiation, digitalSignature, keyEncipherment, keyAgreement
Run Code Online (Sandbox Code Playgroud)

生成的证书允许服务器使用,我做错了什么?

Cal*_*ion 6

您关注“CRL 签名”、“任何目的 CA”和“OCSP 助手”是正确的,这些通常是为 CA 证书或专门为签名证书撤销列表(CRL,证书列表)而保留的无效),或运行 OCSP 服务器(类似于 CRL,但提供证书有效性状态的在线服务)。

相关的 OpenSSL 文档页面适用于x509 命令x509v3_config

这是我用于生成客户端证书的 OpenSSL 配置:

[user]
basicConstraints = critical,CA:FALSE
extendedKeyUsage = clientAuth,emailProtection
subjectAltName=email:copy
crlDistributionPoints = URI:http://www.rgweb.org/ca/rgweb-ca.crl
authorityKeyIdentifier=keyid:always
authorityInfoAccess = caIssuers;URI:http://www.rgweb.org/ca/rgweb-ca.cer
Run Code Online (Sandbox Code Playgroud)

我将带您逐行完成:

basicConstraints被设置为关键,它的意思是“拒绝这个证书,如果你不明白这一点”,并指定该证书是不是CA。即使有人使用软件从该证书颁发证书,它也永远不会被信任。

扩展密钥的使用不是必需的,但某些软件要求它存在并且列出了特定用途。这列出了客户端身份验证(您正在谈论的内容)以及 S/MIME 电子邮件签名和加密;如果您不需要它,您可以安全地删除 S/MIME 目的。

subjectAltName允许您包含有关您无法包含在subject字段中的主题的信息。它还用于 Web 服务器证书以包含证书可能用于的域名,而不是在主题的通用名称属性中指定的域;这些证书称为 SAN(主题备用名称)证书。通常的做法是subjectAltName在主题中而不是在主题中包含电子邮件地址;您根本不必包含电子邮件地址,并且可以省略扩展名。

crlDistributionPoints列出颁发机构的 CRL 可用的地方;它告诉正在尝试验证证书的软件“这里是查看此证书是否仍然有效的地方”。对于 Internet 使用,http://URL 可能是最好的(CRL 是数字签名的,因此不需要https,并且可能会导致信任循环问题)。

authorityKeyIdentifier通常是颁发 CA 的公钥的 SHA-1 哈希(尽管它可能是其他值)。如果包含此扩展名,则该值必须与subjectKeyIdentifier颁发 CA 证书中的 值匹配

authorityInfoAccess有点像,crlDistributionPoints但它指定了在哪里获取颁发 CA证书而不是 CRL。如果您有很长的信任链,这很有用:例如,CA-1 颁发 CA-2,颁发 CA-3,颁发证书;尝试验证证书的软件可以使用此扩展来获取 CA-3 证书,然后使用该证书中的值来获取 CA-2 证书等。通常,证书链(在本例中为 CA-2 证书)和 CA-3 证书)与主题的证书捆绑在一起(例如在 SSL 交易或 S/MIME 电子邮件中)。我不知道任何使用此扩展程序的软件,但我也不知道它不常用。它通常包含在证书中。

所有这一切,你只有真正需要basicConstraintsextendedKeyUsage; 基本约束真的,真的必须是至关重要的(或者你刚刚发放的CA证书!),和扩展密钥用法一般是没有的。