Мой клиент использует самоподписанный сертификат для работы приложения. Чтобы работать, мне нужно установить корневой сертификат, который они использовали для подписи сертификата.
Можно ли настроить корневой сертификат так, чтобы он проверял только один домен?
НетПод доверием сертификату ЦС клиента подразумевается доверие к каждому сертификату, подписанному этим ЦС.
Я не знаю ни одного приложения / библиотеки, в котором есть простой вариант, позволяющий вам как конечному пользователю выбрать, доверять ли вы своим клиентам или любому другому сертификату CA только для определенных (под) доменов, то есть только для *. example.com и * .example.org и ничего больше.
У Mozilla аналогичное беспокойство по поводу доверенных в настоящее время ЦС, спонсируемых государством, как открытая точка внимания и например Хром имеет встроенные дополнительные проверки для доступа к сайтам Google, именно поэтому мошеннический сертификат * .google.com и взлом ЦС Diginotar стали достоянием общественности.
Но даже если вы не доверяете ЦС, вы все равно можете импортировать / доверять определенному сертификату сервера, подписанному этим ЦС, что предотвратит предупреждения SSL для имен хостов в этом сертификате. Это должно заставить ваше приложение работать без ошибок и жалоб.
Очень малоиспользуемый вариант стандарта PKI X.509v3 - это Ограничения имени расширение, которое позволяет сертификату ЦС содержать белые и черные списки шаблонов доменных имен, для которых он уполномочен выдавать сертификаты.
Возможно, вам повезет, и ваш заказчик воздержался от настройки инфраструктуры PKI и включил это ограничение Name в свой сертификат CA. Затем вы можете напрямую импортировать их сертификат CA и знать, что он может проверять только ограниченный диапазон доменных имен.
@CryptoGuy дал здесь довольно хороший ответ, но я хотел бы остановиться на нем подробнее.
Перефразируя:
Вы можете ограничить сторонний ЦС доверять сертификатам (от этого ЦС), выданным списку имен по вашему желанию. Даже если сторонний CA не имеет расширения Name Constraints, их можно применить, используя собственный внутренний сервер CA через перекрестную сертификацию. Уловка заключается в том, что вы подписываете сторонний центр сертификации, используя свой внутренний центр сертификации.
лист SSL-сертификат -> кросс-сертификат -> ваш сертификат CA -> ваш внутренний корневой сертификат.
И вот как это работает (с использованием CA командной строки OpenSSL)
Создать простой ЦС
openssl req -new -x509 -days 3650 -newkey rsa:2048 -sha256 -out root-ca.crt -keyout root-ca.key -subj "/CN=My Root CA"
Вы можете пропустить создание промежуточного центра сертификации
Создайте промежуточный запрос CA с ограничениями имени.
openssl req -new -days 3650 -newkey rsa:2048 -out domain-ca.req -sha256 -keyout domain-ca.key -config ossl_domain_com.cfg
При этом в ossl_domain_com.cfg
файл:
[ req ]
prompt=no
distinguished_name=req_distinguished_name
req_extensions=domain_ca
[ req_distinguished_name ]
CN=somedomain.com trust CA
[ domain_ca ]
basicConstraints=critical,CA:true,pathlen:1
nameConstraints=critical,permitted;DNS:.somedomain.com
Затем подпишите этот ЦС промежуточного домена своим ЦС.
openssl x509 -req -in domain-ca.req -CA root-ca.crt -CAkey root-ca.key -sha256 -set_serial 1 -out domain-ca.crt -extensions domain_ca -extfile ossl_domain_com.cfg
Если вы пропустили создание промежуточного звена, используйте корневой ЦС для подписи
Теперь повторно подпишите ЦС исходного домена под вашими полномочиями, используя их сертификат. Здесь вы можете добавить расширения CA.
openssl x509 -in third_party_ca.crt -CA domain-ca.crt -CAkey domain-ca.key -set_serial 47 -sha256 -extensions domain_ca -extfile ossl_domain_com.cfg -out domain-cross-ca.crt
Возможно, вам придется использовать openssl x509 -x509toreq
чтобы создать запрос, который вы бы подписали точно так же, как и промежуточный выше.
Теперь добавьте корневой CA, промежуточный CA и домен-кросс-CA в базу данных доверия вашего браузера.