尝试将扩展从 CSR 复制到 x509 证书时出现 LibreSSL 错误

尝试将扩展从 CSR 复制到 x509 证书时出现 LibreSSL 错误

我正在尝试从 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_extensionsx509 -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
####################################################################
...

相关内容