Имя хоста не соответствует сертификату сервера — использование старого сертификата с истекшим сроком действия

#ruby #sockets #ssl #websocket #openssl

#ruby #сокеты #ssl #websocket #openssl

Вопрос:

Я пытаюсь подключиться через сокет TCP к старому, не обслуживаемому игровому серверу. Когда я пытаюсь сделать это с помощью OpenSSL и Socketry, я получаю следующую ошибку.

имя хоста «xxx» не соответствует сертификату сервера

Вот как работает мой код.

 ssl_context = OpenSSL::SSL::SSLContext.new
ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
ssl_context.ciphers = "AES128-SHA"
ssl_context.cert = OpenSSL::X509::Certificate.new(File.open("certificate.crt"))
ssl_context.key = OpenSSL::PKey::RSA.new(File.open("certificate.key"))

socket = Socketry::SSL::Socket.new(ssl_context: ssl_context)
socket.connect(address, port)
  

Мне пришлось принудительно зашифровать AES128-SHA, так как в противном случае я бы получил другую ошибку.

SSL_connect возвращено =1 ошибка = 0 состояние = ошибка: ключ dh слишком мал (OpenSSL::SSL::SSLError)

Как я могу обойти эти ошибки и просто принудительно подключиться к указанному серверу? Срок действия самого сертификата истек 10 лет назад.

Ответ №1:

Socketry не содержит много документации по этому поводу, поэтому вам нужно обратиться к источнику. В зависимости от того, что именно вы пытаетесь сделать, вы можете попробовать одно из следующих действий:

  1. Передача verify_hostname: false в сокет#connect.
  2. Спасение Socketry::SSL::HostnameError самостоятельно.
  3. Спасение Socketry::SSL::CertificateVerifyError.

По крайней мере, один из них должен решить вашу конкретную проблему. Если нет, источник предлагает другие места, которые вы могли бы исправить или доработать для вашего варианта использования.

Комментарии:

1. Спасибо! Я начал просматривать исходный код, но почему-то я пропустил эту вещь verify_hostname, это решило проблему 🙂