2012-10-11 11 views
8

アクセスする必要のあるSSL対応ポートを持つサーバーとのTCP接続を確立する必要があります。RubyでSSL対応のTCP/IP接続を確立するには

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 

は、今私は、私は、接続を確立するノードがmy_xmlデータを送信し、応答を取得する必要があると「certi.pfx」を持っています。どのようにこれを行うことができます。

「pem」と「key」ファイルがあるかどうかを知りたいのですが、どのように接続を確立し、my_xmlデータを送信して応答を得ることができますか?

助けてください。このよう

答えて

14
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 
+0

こんにちは、ソケットを閉じたくない場合はどうしたらいいですか? – freeze

+0

最後の行ssl_socket.closeを削除すると、接続を開いたままにしておくことができます。正確ではない –

3

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 
+0

ローマ - お返事に感謝。しかし、一つは、証明書ファイルを指定する必要があることです。実際は私はソケットプログラミングの新機能です。私は上記のコードを使用したとき、私は "connect:SSL_connect returned = 1 errno = 0 state = SSLv3サーバー証明書B:証明書の検証に失敗しました(OpenSSL :: SSL :: SSLError)"というエラーが発生しました。 –

+0

私は特定のポート12482を持っています。接続する必要があるのは –

+0

caバンドル(ca_path: '/ path'、ca_file: 'ca-bundle.crt')を指定する必要があり、証明書(cert)をPEM形式で指定する必要があります。 riを確認するOpenSSL :: SSL :: SSLContext – Roman

関連する問題