openssl – проблема с использованием промежуточного CA

Вопрос или проблема

Я пытаюсь понять, как подписывать элементы, используя промежуточный сертификат 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, когда у вас есть промежуточный центр сертификации (ЦС). Давайте разберем теоретические основы, предложим примеры и дадим рекомендации по применению.

Теория

Цель процесса заключается в проверке подлинности сертификатов, начиная с конечного сертификата и возвращаясь обратно к корневому ЦС. По умолчанию, для проверки цепочки сертификатов требуется последовательность из всех участников цепочки, где каждый сертификат подписан предыдущим. Если какой-либо из сертификатов в цепочке отсутствует, процедура проверки не может быть завершена успешно.

Основные концепции:

  1. Корневой центр сертификации (ЦС) – Это сертификат, который считается доверенным, и все остальные сертификаты, подписанные им и любыми промежуточными ЦС, подчиняются его авторитете.

  2. Промежуточный ЦС – Сертификат, который находится между корневым ЦС и конечным сертификатом. Он служит для делегирования полномочий на генерирование подчинённых сертификатов.

  3. Конечный сертификат – Сертификат, который выдается, например, для конкретного домена или пользователя, и который должен быть признан действительным, если цепочка до него доходит и имеет подписи всех вышестоящих ЦС.

Пример

В вашем сценарии сначала создается корневой ЦС (rootca.crt), затем промежуточный ЦС (interca1.crt), и наконец — конечный сертификат (example1.crt). Причины проблем с проверкой кроются в цепочке доверия, которую необходимо должным образом передать встроенному в OpenSSL механизму.

Примерные проблемы:

  1. Отсутствие полных цепочек в CAfile: Файл CAfile (опция -CAfile в команде openssl) должен содержать все сертификаты в цепочке доверия. Если он содержит только корневой сертификат, OpenSSL не способен завершить верификацию, потому что ему недостает промежуточного сертификата.

  2. Проверка "самого себя": Промежуточный ЦС (interca1.crt) не может сам себя верифицировать, потому что он не является корневым сертификатом. По аналогии с корневым сертификатом, который считается "заведомо доверенным" или "самоподписанным", промежуточный ЦС нуждается в наличии корневого сертификата в цепочке.

Применение

  1. Создание полного файла цепочки: Создайте отдельный файл, содержащий как rootca.crt, так и interca1.crt, и используйте этот новый файл, когда вы выполняете проверку конечного сертификата:

    cat interca1.crt rootca.crt > fullchain.crt
    openssl verify -CAfile fullchain.crt example1.crt

    Это объединяет всю цепочку в один файл и позволяет OpenSSL правильно следовать от example1.crt вверх к rootca.crt.

  2. Использование каталога – CAdir: Используйте CAdir, что особенно удобно в случае большого количества сертификатов. Для этого необходимо правильно разложить сертификаты по каталогам, следуя определённой структуре и формату:

    mkdir demoCA
    mkdir demoCA/newcerts demoCA/private demoCA/certs
    echo 01 > demoCA/serial
    touch demoCA/index.txt
  3. Обновите и пересмотрите конфигурации OpenSSL: Например, в случае использования openssl.cnf, убедитесь в том, что пути и секции в конфигурационных файлах правильные и соответствуют вашей инфраструктуре сертификатов.

Проблемы, с которыми вы столкнулись, обычно решаются именно путем создания корректной цепочки сертификатов, что нужно как для предотвращения ошибок, так и для поддержки безопасности иерархии доверия. Убедившись в соответствии всех вышеперечисленных рекомендаций, вы сможете исправить ошибки и обеспечить корректную работу с OpenSSL и межстратовыми центрами сертификации.

Оцените материал
Добавить комментарий

Капча загружается...