2016-07-17 5 views
2

Я использую 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, но предпочел бы избежать этого, учитывая уязвимости, которые он вводит.

+1

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

+0

@jww Не существует способа установить его в Mechanize. Знаете ли вы, как это сделать или чередуются с Mechanize, которые поддерживают SNI? –

+1

Может быть связано (я не разработчик 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

ответ

1

Вам не нужно указывать имя хоста или проверить имя хоста с помощью Mechanize.

Net Руби :: HTTP обрабатывает это для вас:

https://github.com/ruby/ruby/blob/trunk/lib/net/http.rb#L928

Исключение OpenSSL :: SSL :: SSLError будет повышена, если есть несоответствие имени хоста.

+0

Интересно. Поэтому проблема несоответствия имени хоста происходит случайным образом, и я слышал, что проблемы с SNI могут вызвать это. Если спецификация имени хоста не является проблемой, знаете ли вы, как я могу отладить эту проблему? –

+0

Если вы хотите устранить Ruby, вы можете использовать openssl для его отладки. Правильная настройка SNI должна завершиться неудачей с 'openssl s_client -connect example.com: 443', а затем успешно, если вы укажете' -servername example.com'. Если он терпит неудачу последовательно или периодически, это проблема с сервером. Предполагая, что вы не контролируете сервер, вы можете связаться с владельцем/администратором и попросить их исправить их настройку SSL. –

+0

Кажется, что в Механизе не так много времени. Я заметил ошибку при использовании openssl: «проверьте ошибку: num = 19: самоподписанный сертификат в цепочке сертификатов». Это приведет к прерывистым сбоям в Механизации? –