Кажется действительно странным, что OpenSSL оставил это на усмотрение вызывающего кода.
Да, это очень проблематичное упущение на практике, потому что многие приложения не понимают, что они должны вручную выполнять проверку.
OpenSSL 1.1.0 будет включать проверку имени хоста (сейчас это HEAD
(по состоянию на сентябрь 2013 г.)). Согласно журналам изменений, есть вариант -verify_name
, а apps.c
отвечает на переключатель -verify_hostname
. Но s_client
не отвечает ни на один переключатель, поэтому неясно, как будет реализована или вызвана проверка имени хоста для клиента.
Если поле dnsName
расширения subjectAlternativeName
присутствует, установите для имени это значение.
Альтернативных имен субъекта (SAN) может быть несколько, поэтому будьте готовы к более чем одному.
В противном случае установите имя в поле CN темы.
Я считаю, что вам нужно проверить это для матча тоже.
Сравните имя с запрошенным именем хоста, позволяя каждой звездочке соответствовать [A-Za-z0-9_]+, но не «точке» (.).
Это гораздо более болезненно. Вы также должны убедиться, что вы не соответствуете gTLD или ccTLD. Например, вы не хотите сопоставлять сертификат, выданный для gTLD *.com
. Этот сертификат, вероятно, был выдан плохим парнем;)
ccTLD похожи на *.eu, *.us или இலங்கை (nic.lk). Их около 5000, и Mozilla предлагает список на http://publicsuffix.org/. Необработанный список находится по адресу https://mxr.mozilla.org/mozilla-central/source/netwerk/dns/Effective_tld_names.dat?raw=1.
Мне кажется, что для этого должно быть много кода, но я его не нашел.
В дополнение к предложению ван Гулика вы также можете попробовать Curl. Я совершенно уверен, что Curl содержит код соответствия имени хоста.
Вы даже можете проверить, правильно ли сформированы сертификаты. Ответственной группой в контексте Интернета являются форумы CA/Browser. У них есть базовые и расширенные требования для создания сертификатов:
В базовых документах вы обнаружите, например, что IP-адрес, указанный как общее имя (CN), также должен быть указан в альтернативных именах субъекта (SAN).
В расширенной документации вы обнаружите, что зарезервированные IP-адреса (RFC 1918) не могут присутствовать в сертификате расширенной проверки (EV); сертификаты EV не могут содержать подстановочные знаки.
person
jww
schedule
02.12.2013