#ssl #openssl #certificate
#ssl #openssl #сертификат
Вопрос:
Это сертификат https://gist.github.com/larytet/2fb447e875831577584592cd99980fd1 (x5t VjWIUjS5JS3eAFdm2dnydlZfY-I)
Я делаю
openssl verify -verbose -x509_strict certificate.pen
Я получаю
CN = estsclient.coreauth.outlook.com
error 20 at 0 depth lookup: unable to get local issuer certificate
error certificate.pem: verification failed
Где мне найти сертификат, всю цепочку или корневой, который должен быть установлен в моей системе?
Ответ №1:
Вам необходимо предоставить сертификат CA, и большинство реальных центров сертификации будут указывать местоположения, где его сертификат можно найти в расширении в каждом сертификате, который они выдают.
С помощью OpenSSL вы можете просмотреть это расширение:
openssl x509 -text -noout < certificate.pem
Найдите «Расширение доступа к полномочной информации» и его поле «CA Issuers», чтобы найти URL-адрес и загрузить сертификат из Microsoft.
Поскольку этот файл закодирован с помощью DER, его необходимо перекодировать в PEM для использования с openssl verify
:
openssl x509 -inform der < Microsoft IT TLS CA 2.crt > Microsoft IT TLS CA 2.pem
Поскольку вы только что скачали этот файл неизвестно откуда по протоколу HTTP, вам нужен какой-то способ проверить его подлинность.
Вы заметите, что в нем также указан эмитент, поэтому вы можете выполнить этот процесс рекурсивно, чтобы получить всю цепочку сертификатов обратно к корневому сертификату, которому вы уже доверяете. Обычно мы доверяем сертификатам, которые предварительно установлены в наших системах. Но теоретически злоумышленник мог скомпрометировать этот набор, поэтому люди иногда находят внеполосные способы проверки своих сертификатов корневого центра сертификации. То, что вам подходит, зависит от вашего приложения.
Цепочка сертификатов, которые вы загружаете на пути к привязке доверия, являются «промежуточными» сертификатами; вам не обязательно доверять им напрямую, потому что вы будете проверять цепочку, начинающуюся с одного из привязок в вашей системе.
Объедините сертификаты в кодировке PEM, включая верхние и нижние колонтитулы, в один файл с ненадежными сертификатами. В моем случае корневой сертификат «Baltimore CyberTrust Root», который выдал промежуточный сертификат «Microsoft IT TLS CA 2», предварительно установлен в качестве корневого центра сертификации в моей системе, поэтому мне нужно только загрузить сертификат Microsoft, и он единственный в моем файле «ненадежных» сертификатов.
Теперь у вас есть необходимая информация для попытки выполнить исходную команду:
openssl verify --verbose -untrusted Microsoft IT TLS CA 2.pem -x509_strict certificate.pem
Комментарии:
1. Есть ли случайно утилита командной строки, которая следует по цепочке? Моя конечная цель — проверить сертификат в контексте сборки Docker.
2. @Larytet Я так не считаю. Поиск готовых инструментов или библиотек не по теме для этого сайта. Если вам нужна помощь в написании сценариев для имеющихся у вас инструментов, вы можете задать вопрос об этом. Для этого также может быть довольно легко написать свой собственный инструмент, в зависимости от вашей платформы.
3. По своей невинной неосведомленности я подумал, что все, что мне нужно, это установить отсутствующий корневой сертификат, такой как DigiCert. В моем случае достаточно достаточно высокой вероятности того, что сертификат действителен.
4. @Larytet Может быть, вы можете немного перемотать назад и объяснить, почему вы хотите проверить подобный сертификат в оболочке. Эти сертификаты наиболее полезны в протоколе, таком как TLS, и там правильная конфигурация гарантирует передачу промежуточных сертификатов. В этом случае все, что вам нужно, — это установить отсутствующий корневой каталог.
5. Я проверяю токены JWT, подписанные ключом из gist.github.com/larytet/2fb447e875831577584592cd99980fd1 Я нахожу идею загрузки сертификата во время выполнения тревожной. Я бы предпочел загружать открытый ключ только один раз при создании контейнера и позволять контейнеру работать без изменений до следующего развертывания или истечения срока действия. Естественно, я хочу приложить разумные усилия для проверки ключа, который я только что загрузил с HTTP.
Ответ №2:
В случае, если кто-нибудь найдет этот вопрос, я получил что-то вроде этого много комментариев
RUN curl --silent https://outlook.com/autodiscover/metadata/json/1 > ./outlook.com.autodiscover.metadata.json.1
RUN pem_file=certificate.pem
amp;amp; echo "-----BEGIN CERTIFICATE-----" > $pem_file
amp;amp; cat ./outlook.com.autodiscover.metadata.json.1 | jq --raw-output '.keys[0].keyvalue.value' >> $pem_file
amp;amp; echo "-----END CERTIFICATE-----" >> $pem_file
amp;amp; cat $pem_file
amp;amp; openssl x509 -text -noout < $pem_file | grep "CA Issuers"
amp;amp; curl https://cacerts.digicert.com/BaltimoreCyberTrustRoot.crt.pem > rootCA.pem
amp;amp; curl http://www.microsoft.com/pki/mscorp/Microsoft IT TLS CA 2.crt | openssl x509 -inform der >> rootCA.pem
amp;amp; curl https://cacerts.digicert.com/DigiCertCloudServicesCA-1.crt | openssl x509 -inform der >> rootCA.pem
amp;amp; cat rootCA.pem
amp;amp; cat certificate.pem
RUN pem_file=certificate.pem amp;amp; openssl verify -verbose -x509_strict -untrusted rootCA.pem $pem_file