Вопрос или проблема
Я пытаюсь понять, как подписывать элементы, используя промежуточный сертификат CA. Я разработал довольно простой пример (используя https://gist.github.com/jadbaz/9350f4df4e4ef4c5d256889aa3d5a5ed в качестве основы, хотя я удалил конфигурационный файл и соответствующим образом настроил некоторые команды)… Я ожидал бы, что окончательный сертификат будет проверяем с помощью любого из 2 CA, которые я создаю во время выполнения, но проверка не удается… чего я упускаю:
# root ca
openssl genrsa -out rootca.key 4096
openssl req -sha256 -new -x509 -days 3650 -key rootca.key -out rootca.crt -subj /CN=rootca
# intermediate ca
openssl genrsa -out interca1.key 4096
openssl req -sha256 -new -key interca1.key -out interca1.csr -subj /CN=intermediateca -addext "basicConstraints=critical,CA:true" -addext "keyUsage=critical,keyCertSign,cRLSign"
openssl x509 -copy_extensions copyall -req -days 365 -in interca1.csr -CA rootca.crt -CAkey rootca.key -CAcreateserial -out interca1.crt
# verify chain so far
openssl verify -CAfile rootca.crt rootca.crt interca1.crt # оба сертификата в порядке
# generating an example certificate
openssl genrsa -out example1.key 2048
openssl req -new -sha256 -key example1.key -out example1.csr -subj /CN=example1
openssl x509 -copy_extensions copyall -req -days 365 -in example1.csr -CA interca1.crt -CAkey interca1.key -CAcreateserial -out example1.crt
# verify results
openssl verify -CAfile rootca.crt rootca.crt interca1.crt example1.crt
openssl verify -CAfile interca1.crt interca1.crt example1.crt
Вот вывод последних проверок:
# openssl verify -CAfile rootca.crt rootca.crt interca1.crt example1.crt
rootca.crt: OK
interca1.crt: OK
CN=example1
error 20 at 0 depth lookup: unable to get local issuer certificate
error example1.crt: verification failed
# openssl verify -CAfile interca1.crt interca1.crt example1.crt
CN=intermediateca
error 20 at 0 depth lookup: unable to get local issuer certificate
error interca1.crt: verification failed
CN=intermediateca
error 2 at 1 depth lookup: unable to get issuer certificate
error example1.crt: verification failed
Чего я упускаю?
Также, почему interca1
не может проверять себя так же, как это делает rootca
?
Я использую openssl 3.2.2.
В вашем случае выданный сертификат содержит ссылку на все корневые и промежуточные CA. Когда вы проверяете выданный сертификат, вы должны предоставить (если в файле) все корневые и промежуточные сертификаты в одном файле. Если вы используете CAdir
вместо CAfile
, вы можете добавить все корневые и промежуточные сертификаты в эту директорию.
Ответ или решение
Проблема, с которой вы столкнулись, связана с процессом проверки цепочки сертификатов с использованием OpenSSL, когда у вас есть промежуточный центр сертификации (ЦС). Давайте разберем теоретические основы, предложим примеры и дадим рекомендации по применению.
Теория
Цель процесса заключается в проверке подлинности сертификатов, начиная с конечного сертификата и возвращаясь обратно к корневому ЦС. По умолчанию, для проверки цепочки сертификатов требуется последовательность из всех участников цепочки, где каждый сертификат подписан предыдущим. Если какой-либо из сертификатов в цепочке отсутствует, процедура проверки не может быть завершена успешно.
Основные концепции:
-
Корневой центр сертификации (ЦС) – Это сертификат, который считается доверенным, и все остальные сертификаты, подписанные им и любыми промежуточными ЦС, подчиняются его авторитете.
-
Промежуточный ЦС – Сертификат, который находится между корневым ЦС и конечным сертификатом. Он служит для делегирования полномочий на генерирование подчинённых сертификатов.
-
Конечный сертификат – Сертификат, который выдается, например, для конкретного домена или пользователя, и который должен быть признан действительным, если цепочка до него доходит и имеет подписи всех вышестоящих ЦС.
Пример
В вашем сценарии сначала создается корневой ЦС (rootca.crt), затем промежуточный ЦС (interca1.crt), и наконец — конечный сертификат (example1.crt). Причины проблем с проверкой кроются в цепочке доверия, которую необходимо должным образом передать встроенному в OpenSSL механизму.
Примерные проблемы:
-
Отсутствие полных цепочек в CAfile: Файл CAfile (опция
-CAfile
в команде openssl) должен содержать все сертификаты в цепочке доверия. Если он содержит только корневой сертификат, OpenSSL не способен завершить верификацию, потому что ему недостает промежуточного сертификата. -
Проверка "самого себя": Промежуточный ЦС (interca1.crt) не может сам себя верифицировать, потому что он не является корневым сертификатом. По аналогии с корневым сертификатом, который считается "заведомо доверенным" или "самоподписанным", промежуточный ЦС нуждается в наличии корневого сертификата в цепочке.
Применение
-
Создание полного файла цепочки: Создайте отдельный файл, содержащий как rootca.crt, так и interca1.crt, и используйте этот новый файл, когда вы выполняете проверку конечного сертификата:
cat interca1.crt rootca.crt > fullchain.crt openssl verify -CAfile fullchain.crt example1.crt
Это объединяет всю цепочку в один файл и позволяет OpenSSL правильно следовать от example1.crt вверх к rootca.crt.
-
Использование каталога – CAdir: Используйте CAdir, что особенно удобно в случае большого количества сертификатов. Для этого необходимо правильно разложить сертификаты по каталогам, следуя определённой структуре и формату:
mkdir demoCA mkdir demoCA/newcerts demoCA/private demoCA/certs echo 01 > demoCA/serial touch demoCA/index.txt
-
Обновите и пересмотрите конфигурации OpenSSL: Например, в случае использования openssl.cnf, убедитесь в том, что пути и секции в конфигурационных файлах правильные и соответствуют вашей инфраструктуре сертификатов.
Проблемы, с которыми вы столкнулись, обычно решаются именно путем создания корректной цепочки сертификатов, что нужно как для предотвращения ошибок, так и для поддержки безопасности иерархии доверия. Убедившись в соответствии всех вышеперечисленных рекомендаций, вы сможете исправить ошибки и обеспечить корректную работу с OpenSSL и межстратовыми центрами сертификации.