Если вас интересует только то, как заставить Ruby вести себя так же, как OpenSSL s_client
или ваш браузер, вы можете перейти к самому последнему разделу, я опишу мелкий шрифт в следующем.
По умолчанию OpenSSL::X509::Store
, используемый для установления соединения, вообще не использует никаких доверенных сертификатов.Основываясь на своих знаниях в области приложения, вы, как правило, предоставляете экземпляр X509::Store
доверенным сертификатам, которые имеют отношение к вашему приложению.Для этого есть несколько вариантов:
- Store # add_file принимает путь к сертификату в кодировке PEM / DER
- Store # add_cert принимает экземпляр X509 :: Certificate
- Store # add_path принимает путь к каталогу, где можно найти доверенные сертификаты
Подход "Browser"
Это в отличие от подходов браузеров Java (cacerts) или Windows с собственным внутренним хранилищем доверенных сертификатов, бери.Там программное обеспечение предварительно оснащено набором доверенных сертификатов, которые, по мнению поставщика программного обеспечения, считаются «хорошими».Обычно это неплохая идея, но если вы действительно посмотрите на эти наборы, то вскоре заметите, что сертификатов слишком много.Человек не может действительно сказать, следует ли доверять всем этим сертификатам вслепую или нет.
Подход Ruby
Требования вашего типичного приложения на Ruby, с другой стороны, сильно отличаются от требований браузера.Браузер должен быть в состоянии позволить вам перейти на любой «законный» веб-сайт, который поставляется с сертификатом TLS и обслуживается по протоколу https.Но в типичном Ruby-приложении вам придется иметь дело только с несколькими службами, которые используют TLS или иным образом требуют проверки сертификата.
И есть преимущество подхода Ruby - хотя он требует больше ручного труда, вы получите ручное решение, которое точно доверяет сертификатам, которым оно должно доверять в контексте данного приложения.Это утомительно, но безопасность намного выше, так как вы открываете намного меньше поверхности атакиВозьмем недавние события: если вам никогда не приходилось включать DigiNotar или любой другой скомпрометированный корень в ваш набор доверия, то такие нарушения не могут повлиять на вас.
Однако, как вы уже заметили, обратная сторона этогопо умолчанию, если вы не добавляете доверенные сертификаты активно, расширение OpenSSL вообще не сможет проверять любой сертификат равноправного узла.Чтобы все заработало, вы должны настроить конфигурацию вручную.
Это неудобство привело к множеству сомнительных мер, чтобы обойти его, худшее из всего, что глобально установить OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
.Пожалуйста, не делай этого.Мы даже пошутили о добавлении кода, который позволяет случайному сбою вашего приложения, если мы столкнемся с таким взломом:)
Если ручная настройка доверия кажется слишком сложной, я предложу простую альтернативу, которая теперь делает расширение OpenSSL в точноститак же, как команды CLI OpenSSL, такие как s_client
.
Почему s_client может проверить сертификат
OpenSSL использует аналогичный подход для браузеров и Windows.Типичная установка помещает пакет доверенных сертификатов где-то на вашем жестком диске (что-то вроде /etc/ssl/certs/ca-bundle.crt
), и это будет служить набором доверенных сертификатов по умолчанию.Вот где s_client
выглядит, когда нужно проверить сертификаты одноранговых узлов, и именно поэтому ваш эксперимент прошел успешно.
Заставляет Ruby вести себя как s_client
Если вы все еще хотите иметь такой же комфорт при проверкеСертификаты с Ruby, вы можете сказать ему использовать пакет доверенных сертификатов OpenSSL, если он доступен в вашей системе, вызвав OpenSSL::X509::Store#set_default_paths
.Дополнительную информацию можно найти здесь .Чтобы использовать это с XMLRPC::Client
, просто убедитесь, что set_default_paths
вызывается на X509::Store
, который он использует.