【问题标题】:How to establish a SSL enabled TCP/IP Connection in Ruby如何在 Ruby 中建立启用 SSL 的 TCP/IP 连接
【发布时间】:2012-10-01 22:58:48
【问题描述】:

我需要与具有启用 SSL 的端口的服务器建立 TCP 连接,我需要访问该连接。

我需要发送一个 XML 文件并从服务器获取响应。

在启用 SSL 之前,我能够使用下面提到的代码从服务器获取数据。

require 'socket'
myXML = 'test_xml' 
host = 'myhost.com'   
port = 12482               

socket = TCPSocket.open(host,port)  # Connect to server  
socket.send(myXML, 0)
response = socket.recvfrom(port)
puts response
socket.close

现在我有一个“certi.pfx”,我需要与它建立连接、发送 my_xml 数据并获得响应。这是怎么做到的。

我也想知道我是否有'pem'和'key'文件,如何建立连接,发送my_xml数据并得到响应。

请帮忙。

【问题讨论】:

    标签: ruby sockets ssl-certificate tcpclient tcp-ip


    【解决方案1】:
    require 'socket'
    require 'openssl'
    
    myXML = 'my_sample_data'
    host = 'my_host.com'
    port = my_port                
    
    socket = TCPSocket.open(host,port)
    ssl_context = OpenSSL::SSL::SSLContext.new()
    ssl_context.cert = OpenSSL::X509::Certificate.new(File.open("certificate.crt"))
    ssl_context.key = OpenSSL::PKey::RSA.new(File.open("certificate.key"))
    ssl_context.ssl_version = :SSLv23
    ssl_socket = OpenSSL::SSL::SSLSocket.new(socket, ssl_context)
    ssl_socket.sync_close = true
    ssl_socket.connect
    
    ssl_socket.puts(myXML)
    while line = ssl_socket.gets
      p line
    end
    ssl_socket.close
    

    【讨论】:

    • 您好,不想关闭socket怎么办?
    • 我认为您可以删除最后一行 ssl_socket.close 这将保持连接打开。不确定
    【解决方案2】:

    像这样:

      sock = TCPSocket.new('hostname', 443)
      ctx = OpenSSL::SSL::SSLContext.new
      ctx.set_params(verify_mode: OpenSSL::SSL::VERIFY_PEER)
      @socket = OpenSSL::SSL::SSLSocket.new(sock, ctx).tap do |socket|
        socket.sync_close = true
        socket.connect
      end
    

    【讨论】:

    • 罗马 - 感谢您的回复。但有一件事是我需要在哪里指定证书文件。实际上我是套接字编程的新手。当我使用上面的代码时,我得到了一个错误,比如“connect: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)”
    • 我有一个特定的端口 12482。我需要连接到该端口
    • 您需要指定ca bundle (ca_path: '/path', ca_file: 'ca-bundle.crt') 并且需要指定PEM形式的证书(cert)。检查 ri OpenSSL::SSL::SSLContext
    • 目前我只有一个“certi.pfx”文件。我怎样才能在它的帮助下建立联系
    • 如果是 PKCS12 容器,您可以使用 openssl 命令行实用程序提取证书和密钥,可能使用 pkcs12 命令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 2010-11-03
    • 2016-07-28
    • 2015-02-27
    • 2012-11-11
    • 2020-04-05
    • 1970-01-01
    相关资源
    最近更新 更多