我为我的开发环境设置了一个小型自签名 CA。我想创建许多具有不同属性的不同服务器证书。我的方法是为每个服务器创建一个特定的扩展部分。我有一个很大的 openssl.cnf,其中包含如下部分:
[ server0_http ]
nsCertType = server
nsComment = "HTTP server0"
basicConstraints=CA:FALSE
extendedKeyUsage=serverAuth
subjectAltName=@server0_http_altnames
[ server0_http_altnames ]
URI.1 = https://server.domain.tld
URI.2 = http://server.domain.tld
IP.1 = 1.2.3.4
DNS.1 = server.doamin.tld
然后,当我使用openssl
参数创建我的 csr 时-config myCustomOpenssl.cnf -reqexts server0_http
。当我查看我的请求时,openssl req -text -noout -in myrequest.csr
一切看起来都很完美。
但是,在我签署请求后,“X509v3 扩展密钥用法”和“X509v3 主题备用名称”部分消失了。为了解决这个问题,我还添加了-extfile myCustomOpenssl.cnf -reqexts server0_http
签名调用的参数openssl
。
这是预期的行为吗?我一直认为仅 csr 文件就足以根据要求创建证书,即及其所有部分。我的系统现在的工作方式是我获得了缺少部分的证书。为了获得我想要的证书,我必须提供 csr 文件以及用于创建请求的 openssl 配置文件中的相应部分。这对于我的小型设置来说不是问题,但如果我成为更大的 CA,这会变得相当混乱。应该是这样还是我错误地使用了 openssl?
答案1
找到了!我所描述的是 openssl 的正常预期行为。默认情况下,自定义扩展不会复制到证书中。
要使 openssl 将请求的扩展复制到证书,必须指定copy_extensions = copy
签名。在普通安装中,这意味着必须将此行添加到default_CA
中的部分openssl.cnf
。
在openssl.cnf
(至少)Centos 附带的版本中,该行已作为注释包含在内,并带有警告“谨慎使用”。如果您不小心,请求者可能会滥用此功能来让您颁发 CA 证书。