Назад | Перейти на главную страницу

Ошибки LibreSSL при попытке скопировать расширения из CSR в x509 Cert

Я пытаюсь создать сертификат x509 с очень конкретным набором расширений x509v3 из CSR (у которого уже есть эти расширения). У меня есть CSR в форме PEM (?). Выглядит это так:

-----BEGIN CERTIFICATE REQUEST-----
MIIEjDCCAnQCAQAwFT...
...EQFqw==
-----END CERTIFICATE REQUEST-----

Я пытаюсь подписать его, пропустив его через libressl (я на Mac) и используя установленный инструмент openssl, чтобы подписать запрос с помощью сертификата корневого центра сертификации, которому я уже доверял на своей машине. Процесс выглядит так:

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 не работает так, как я думал. Похоже (по словам Дэйва), что это не работает с x509 -req вообще.

Вместо этого я решил обойти это следующим образом: создать небольшой раздел файла conf openssl с соответствующими разрешениями, а затем подписать 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
####################################################################
...