主机名与服务器证书不匹配 - 使用旧的过期证书

Hostname does not match the server certificate - using old expired certificate

我正在尝试通过 TCP 套接字连接到一个旧的、未维护的游戏服务器。当我尝试使用 OpenSSL 和 Socketry 这样做时,出现以下错误。

hostname "xxx" does not match the server certificate

我的代码是这样工作的。

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 returned=1 errno=0 state=error: dh key too small (OpenSSL::SSL::SSLError)

如何绕过这些错误并强制连接到所述服务器?证书本身已在 10 年前过期。

Socketry 没有包含太多关于此的文档,因此您需要求助于源代码。根据您要执行的操作,您可以尝试以下操作之一:

  1. verify_hostname: false 传递给 Socket#connect
  2. 自救 Socketry::SSL::HostnameError
  3. 营救 Socketry::SSL::CertificateVerifyError

至少其中一项应该可以解决您的具体问题。如果没有,来源提供了您可能 monkey-patch 或针对您的用例进行优化的其他地方。