Может ли кто-нибудь подтвердить, что символ подстановки удаляется Indy или библиотеками OpenSSL, хотя необходимо проверить имя хоста?
Нет, OpenSSL не удаляет его.
Я не знаю о библиотеке Indy.
Может кто-нибудь подтвердить, что символ подстановки удаляется Инди или библиотеки OpenSSL, хотя нужно проверить имя хоста?
Я со ссылкой на это дважды по причине :) Размещение имен серверов в Common Name (CN) является устаревшим как IETF и форумах CA/B (какие браузеры следуют).
Что вы, вероятно, испытываете, это что-то вроде CN=example.com
.В этом случае example.com
не является имя сервера; скорее это is домен. Итак, вы не должны предположим, что это означает, что оно соответствует *.example.com
.
И если сервер отвечает на https://example.com
, вы должны принимать только сертификат, если альтернативного имя включает example.com
потому что домены указаны в CN общественного УЦ. Публичные ЦС помещают имена DNS в SAN, поскольку они следуют за форумами CA/B.
кто-нибудь идею, чтобы проверить имя хоста в этих условиях?
OpenSSL до 1.1.0 не выполнить имя хоста сопоставление. Разработчик должен был это сделать. OpenSSL 1.1.0 и выше имеют встроенную функциональность. См. X509_check_host(3)
и друзья.
Чтобы соответствовать имя хоста, вы должны собрать все имена из какCommon Name (CN) и Subject Alternate Name (SAN). Затем, как правило, это просто, как сопоставление с регулярным выражением.
IETF быстро и свободно, и они позволяют указать имя хоста в CN или SAN. Форум CA/B и браузеры более строгие: если имя хоста находится в CN, оно также должно присутствовать в SAN (да, оно должно быть указано дважды). В противном случае форум CA/B и браузеры ожидают, что все имена хостов в SAN.
Я считаю, что OpenSSL и CA/B Forums допускают только подстановочный знак на самой левой метке. Я считаю, что IETF позволяет показывать символы в любом месте.
Если вы хотите увидеть пример кода, то проверьте реализацию cURL. cURL использует OpenSSL, но не зависит от 1.1.0's X509_check_host(3)
и друзей. cURL имеет свою собственную реализацию.
Быстрое предупреждение. Соответствие имени хоста - это черное искусство. Например ...
IETF позволяет сопоставлять глобальный домен верхнего уровня (gTLD), такой как *.com
или *.net
; и домен верхнего уровня страны (ccTLD), такой как *.uk
или *.us
. Я считаю, что это нападение, потому что я знаю, что нет единого центра сертификации, который может претендовать на «собственное» или «сертифицировать» gTLD. Если я испытываю один из этих сертификатов в дикой природе, то я его отвергаю.
Форумы CA/B не разрешают групповые gTLD или ccTLD. Браузеры пытаются избежать этого, используя Public Suffix List (PSL). Вещи только ухудшились с областями суеты, например *.google
.
Есть еще одна вещь, которую браузеры пытаются сделать с PSL. Они пытаются вырезать административные границы на субдоменах. Например, Amazon владеет всем amazon.com, но они делегируют полномочия на субдомены, например example.amazon.com.Таким образом, PSL пытается разрешить Amazon управлять своим доменом amazon.com
, но не связанным с продавцом субдоменом example.amazon.com
.
IETF пытается решить административные границы в DBOUND Working Group. Но в комитете все кажется заторможенным.
Данные сертификата обеспечивается самим OpenSSL. Класс Indy 'TIdX509' просто обертывает дескриптор' PX509', предоставляемый OpenSSL внутри функции обратного вызова проверки Indy. 'TIdX509' не возится с данными сертификата, он представляет его как есть. Свойство 'Subject' переносит дескриптор' PX509_NAME' из функции 'X509_get_subject_name()' OpenSSL, а свойство 'OneLine' возвращает любое значение, возвращаемое функцией OpenSSL' X509_NAME_oneline() '. Таким образом, сам OpenSSL лишает шаблон. –
Как сказано, OpenSSL имеет функции 'X509_check_host()' и 'cert_host_name_override()'. Вы можете передать им оригинальный дескриптор 'PX509' (член' TIdX509.FX509' - для этого вам нужно будет использовать класс accessor) и имя хоста, к которому вы подключились. –
Спасибо Реми за быстрый ответ. Я попробую это завтра и сообщит вам о моих результатах. – Cheesy