Ssl-Certificate

嘗試將擴展從 CSR 複製到 x509 證書時出現 LibreSSL 錯誤

  • January 6, 2020

我正在嘗試使用來自 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 證書。但是,當使用上面的形式呼叫 libressl 時echo,出現以下錯誤:

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"

所以@dave_thompson_085 為我指明了正確的方向,我想出瞭如何讓它發揮作用,儘管這有點令人失望。

copy_extensions不像我想像的那樣工作。看來(根據 dave 的說法)它根本不起作用x509 -req

相反,我解決這個問題的方法是創建一個具有適當權限的 openssl conf 文件的一小部分,然後使用傳入extensions參數的新部分對 CSR 進行簽名。截斷範例如下:

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
####################################################################
...

引用自:https://serverfault.com/questions/997581