HostnameVerifier против TrustManager?

При каких обстоятельствах можно было бы использовать HostnameVerifier вместо TrustManager в Java? Рекомендуется ли одно над другим? Глядя на документы Java (Interface HostnameVerifier и интерфейс TrustManager) , я тоже не могу сказать, когда его лучше использовать (хотя TrustManager кажется более универсальным).

Раньше я всегда использовал пользовательский файл TrustManager. Однако я заметил, что эксплойт Heartbleed в java использует оба (но я не думаю, что это правильно) .

EDIT: при использовании HostnameVerifier выполняются ли другие обычные проверки X509, такие как построение пути, истечение срока действия и отзыв (если настроено)? Я думаю, что по существу спрашиваю, дополняет ли HostnameVerifier другие проверки (а не заменяет ли их).

Например, предположим, что сервер разработки находится в dev.example.com и подписан внутренним центром сертификации. В сертификате dev.example.com есть одно DNS-имя, и это dev.example.com. Далее предположим, что я подключаюсь к нему как 192.168.1.10. Могу ли я использовать HostnameVerifier, чтобы разрешить и dev.example.com, и 192.168.1.10? В этом сценарии разрешено ли дополнительное имя и выполняются ли другие обычные проверки X509?


person jww    schedule 11.05.2014    source источник


Ответы (1)


При каких обстоятельствах можно использовать HostnameVerifier вместо TrustManager в Java?

Никогда. Они делают разные вещи. TrustManage аутентифицирует сертификаты как часть SSL. HostnameVerifier проверяет имена хостов как часть HTTPS. Они не в конкуренции.

Рекомендуется ли одно над другим?

No.

ИЗМЕНИТЬ

  • TrustManager запускается во время рукопожатия TLS. Если это указывает на сбой, рукопожатие прерывается и соединение не выполняется.
  • HostnameVerifier запускается после рукопожатия TLS через соединение TLS, которое уже является действительным с точки зрения TLS, поэтому в этот момент вы знаете, что сертификат действителен, подписан доверенным эмитентом, не просрочен (?) и т. д., и все, что вам нужно сделать, это решить (а) с того ли сервера, и (б) доверяете ли вы этому серверу. Вы можете сделать (b) внутри TrustManager,, но гораздо чаще вы вообще не будете предоставлять свой собственный TrustManager.
person user207421    schedule 11.05.2014
comment
Спасибо ЭДЖП. Итак, я ясно: TrustManager нельзя использовать для переопределения несоответствия имени хоста в checkServerTrusted? - person jww; 11.05.2014
comment
@jww Я этого не говорил. Я сказал, что нет никаких обстоятельств, при которых вы предпочли бы одно другому. TrustManager является частью TLS; HostnameVerifier является частью HTTPS. Они не в конкуренции. Вы можете проверить имена хостов в TrustManager, если вам нужно: см. .security.cert.X509Certificate%5B%5D,%20java.lang.String,%20java.net.Socket)" rel="nofollow noreferrer">Javadoc, но вы делаете это по другой причине, под другим RFC и на другом этапе коммуникации. - person user207421; 07.08.2014
comment
comment
@FD_ JSSE реализует RFC 2246 и последующие версии, которые на момент внедрения не требовали проверки имени хоста. SSL/TLS только когда-либо обязывался обеспечивать секретность сообщений + целостность и аутентификацию. Авторизация всегда была на уровне приложения, в данном случае HTTP. Дизайн по-прежнему кажется мне совершенно разумным даже спустя 18 лет. - person user207421; 04.03.2021