Я пытаюсь создать сертификат 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
####################################################################
...