2016-08-26 22 views
0

私はsslサポートを追加せずに正常に動作した単純なssl Webクライアントを作成しています。今、私はこのエラーメッセージを取得し、要求を取得するためにSSL機能を追加したこと:Ruby SSL_read:tlsv1警告プロトコルのバージョン

SSL_read:TLSv1の警告プロトコルバージョン

それについてグーグルでの後、私は、opensslのバージョンを確認するという結論に来たIそれがTLSv1.2をサポートしていることがわかります。私は明示的に強制的にtlsv1.2を強制するコンテキストを作成しましたが、それと同じエラーメッセージです。私のopensslのバージョン:

ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION' ===> OpenSSL 1.0.1f 6 Jan 2014 

私のコード:

require 'socket' 
    require 'openssl' 

    puts "Please select:" 
    puts "get ==> to use GET method" 
    puts "post ==> to use POST method" 
    method = gets.chomp.downcase 

    case method 
    when "get" 
     print "Please enter the domain name to get the http: " 
     domain = "www." << gets.chomp 
     print "Now enter the page you want to get: " 
     page = gets.chomp 

     # opening socket 
     soc = TCPSocket.new domain, 443 
     ctx = OpenSSL::SSL::SSLContext.new 
     ctx.ssl_version = :TLSv1_2 
     ssl = OpenSSL::SSL::SSLSocket.new(soc, ctx) 
     ssl.sync_close = true 
     ssl.connect 
     soc.puts "GET #{page} HTTP/1.1\nHost: #{domain}\n\n\n" 
     while line = ssl.gets 
     puts line 
     end 
    when "post" 
     print "Please enter the domain name to post the http:" 
     domain = gets.chomp.downcase 
     print "Now enter the post form page:" 
     form_page = gets.chomp.downcase 
     puts "Please enter the parameters of POST and related values one at a time:" 
     puts "(\"done\" to end input)" 
     post_variable = [] 
     while true 
     print "Parameter:" 
     parameter = gets.chomp.downcase 
     break if parameter == "done" 
     print "Value:" 
     value = gets.chomp.downcase 
     break if value == "done" 
     post_variable.push("#{parameter}=#{value}") 
     post_sentense = post_variable.join("&") 
     end 
     # opening socket 
     soc = TCPSocket.new domain, 80 
     soc.puts "POST #{form_page} HTTP/1.1\nHost: #{domain}\nContent-Length: #{post_sentense.length}\n\n\n#{post_variable}" 
     while line = soc.gets 
     puts line 
     end 
    else 
     puts "wrong input!!!" 
    end 

私は、ドメイン名は、WWWなしで入力する必要があることを言及する必要があり、ページが正常に/index.htmlです。 誰かがこれで私を助けることができますか?

+0

これはクライアントが処理できないため、サーバーから送信されるアラートです。サーバー(つまり、外部から到達可能な場合はURL)に関する詳細情報がなくても、何が起きているのかを言うことは不可能です。 –

+0

@grimfrog実際に私はこのコードgoogle.com yahoo.com https://msn.comをテストし、それらのすべてから同じメッセージを受け取りました – Farhad

答えて

0

問題が見つかりました。このライン:

soc.puts "GET #{page} HTTP/1.1\nHost: #{domain}\n\n\n" 

はこのようになります。

ssl.puts "GET #{page} HTTP/1.1\nHost: #{domain}\n\n\n" 

私は理由を正確に知りませんが、私の代わりにSSLをソケットにメッセージを送ることによってだと思う、それはSSLネゴシエーションに参加しませんでしたプロセスを完了するために交渉をさせてください。