Я использую Mechanize для очистки сайта и получаю ошибки, связанные с несоответствием имени хоста. Я обнаружил, что корень проблемы - это SNI, используемый на сайте, который я очищаю, и я бы хотел указать имя хоста, чтобы убедиться, что используется правильный сертификат.Mechanize Hostname Matching
Вот моя текущая настройка:
agent = Mechanize.new
agent.user_agent = custom_user_agent
agent.verify_mode = OpenSSL::SSL::VERIFY_PEER
page = agent.get "website.com"
И вот что я думаю, что нужно добавить (или что-то вдоль этих линий) для обеспечения правильного сертификата используется:
OpenSSL::SSL::SSLSocket.hostname = "website.com"
Возможно ли это сделать в Mechanize, или мне нужно выяснить, как вручную указать сертификат для использования?
Для контекста, я знаю решение VERIFY_NONE
, но предпочел бы избежать этого, учитывая уязвимости, которые он вводит.
OpenSSL 1.0.2 и ниже делает *** нет *** выполнить имя хоста. Приложения, такие как cURL и Mechanize, должны выполнять сопоставление. [OpenSSL 1.1.0 планируется реализовать] (http://wiki.openssl.org/index.php/Hostname_validation). Если у вас возникли проблемы с именами имен, то это, безусловно, происходит от Mechanize в этот момент времени. SNI - это функция TLS, поэтому обязательно используйте TLS 1.0 или выше. Я предполагаю, что ваша проблема - Mecahanize (или Ruby) - это * не * использование SNI. – jww
@jww Не существует способа установить его в Mechanize. Знаете ли вы, как это сделать или чередуются с Mechanize, которые поддерживают SNI? –
Может быть связано (я не разработчик Ruby или Mechanize): [Как установить параметры контекста TLS в Ruby (например, OpenSSL :: SSL :: SSL_OP_NO_SSLv2)] (http://stackoverflow.com/q/22550213) и [ OpenSSL :: SSL :: SSLError: имя хоста не совпадает с сертификатом сервера] (http://stackoverflow.com/q/23190868). Функция OpenSSL, которая должна быть вызвана, является ['SSL_set_tlsext_host_name'] (http://wiki.openssl.org/index.php/SSL/TLS_Client), но ее неясно, когда/когда Ruby вызывает ее. – jww