#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 не содержит много документации по этому поводу, поэтому вам нужно обратиться к источнику. В зависимости от того, что именно вы пытаетесь сделать, вы можете попробовать одно из следующих действий:
- Передача
verify_hostname: false
в сокет#connect. - Спасение Socketry::SSL::HostnameError самостоятельно.
- Спасение Socketry::SSL::CertificateVerifyError.
По крайней мере, один из них должен решить вашу конкретную проблему. Если нет, источник предлагает другие места, которые вы могли бы исправить или доработать для вашего варианта использования.
Комментарии:
1. Спасибо! Я начал просматривать исходный код, но почему-то я пропустил эту вещь verify_hostname, это решило проблему 🙂