我正在尝试从 CSR(已设置这些扩展)创建具有一组非常特定的 x509v3 扩展的 x509 证书。我有一个 PEM 格式的 CSR(?)。它看起来像这样:
-----BEGIN CERTIFICATE REQUEST-----
MIIEjDCCAnQCAQAwFT...
...EQFqw==
-----END CERTIFICATE REQUEST-----
我尝试通过 libressl 管道对其进行签名(我在 Mac 上),并使用已安装的 openssl 工具使用我已在计算机上信任的根 CA 证书对请求进行签名。该过程如下所示:
echo "-----BEGIN CERTIFICATE REQUEST-----\nMIIE...qw==\n-----END CERTIFICATE REQUEST-----\n" | openssl x509 -req -days 3650 -CA trusted_cert.pem -CAkey trusted_key.pem -CAcreateserial -out output_crt.pem -sha512 -extfile /usr/local/etc/openssl/openssl.cnf -extensions my_ca
libressl 并非 100% 与 openssl “覆盖兼容”(这可能是造成这种麻烦的原因)。因此,openssl 应该有标志的地方-config
,libressl 似乎也有-extfile
标志。这已经困扰了我一次将代码从 libressl 移到 openssl。
该my_ca
部分openssl.cnf
如下所示:
[ my_ca ]
# Extension copying option: use with caution.
copy_extensions = copy
default_days = 365 # how long to certify for
default_crl_days= 30 # how long before next CRL
default_md = default # use public key default MD
preserve = no # keep passed DN ordering
# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy = policy_match
根据我对 openssl 的理解(以及阅读这些行,libressl),copy_extensions = copy
本节中的应该导致 CSR 中的扩展被复制到输出 x509 证书。但是,当使用echo
上述形式调用 libressl 时,我收到以下错误:
Error Loading extension section my_ca
4592432748:error:22FFF082:X509 V3 routines:func(4095):unknown extension name:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22.260.1/libressl-2.6/crypto/x509v3/v3_conf.c:127:
4592432748:error:22FFF080:X509 V3 routines:func(4095):error in extension:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22.260.1/libressl-2.6/crypto/x509v3/v3_conf.c:96:name=copy_extensions, value=copy
我以为,只要我能够让 libressl 加载该部分,它就会理解该copy_extensions
指令 - 但事实似乎并非如此。我该如何编写配置文件,以便 libressl 将 CSR 中的扩展复制到生成的证书中?
作为参考,我的 libressl 版本如下:
openssl version -a
LibreSSL 2.6.5
built on: date not available
platform: information not available
options: bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)
compiler: information not available
OPENSSLDIR: "/private/etc/ssl"
答案1
所以@dave_thompson_085 为我指明了正确的方向,我也弄清楚了如何让它发挥作用,尽管这有点令人失望。
copy_extensions
x509 -req
不像我想象的那样工作。看起来(根据 Dave 的说法)它根本不起作用。
相反,我解决这个问题的方法是创建一个具有适当权限的 openssl conf 文件的一小部分,然后使用传递给参数的新部分对 CSR 进行签名extensions
。以下是一个截断的示例:
echo "-----BEGIN CERTIFICATE REQUEST-----\nMI...E=\n-----END CERTIFICATE REQUEST-----\n" | openssl x509 -req -days 3650 -CA my_cert.pem -CAkey my_key.pem -CAcreateserial -out new_cert.pem -sha512 -extfile /usr/local/etc/openssl/openssl.cnf -extensions my_ca
openssl.cnf 文件中的部分内容:
...
####################################################################
[ my_ca ]
basicConstraints = critical,CA:TRUE
keyUsage = critical, digitalSignature, keyEncipherment, keyCertSign
####################################################################
...