|
22 | 22 |
|
23 | 23 | require 'net/protocol'
|
24 | 24 | require 'uri'
|
| 25 | +require 'resolv' |
25 | 26 | autoload :OpenSSL, 'openssl'
|
26 | 27 |
|
27 | 28 | module Net #:nodoc:
|
@@ -1036,17 +1037,34 @@ def connect
|
1036 | 1037 | OpenSSL::SSL::SSLContext::SESSION_CACHE_CLIENT |
|
1037 | 1038 | OpenSSL::SSL::SSLContext::SESSION_CACHE_NO_INTERNAL_STORE
|
1038 | 1039 | @ssl_context.session_new_cb = proc {|sock, sess| @ssl_session = sess }
|
| 1040 | + |
| 1041 | + # Still do the post_connection_check below even if connecting |
| 1042 | + # to IP address |
| 1043 | + verify_hostname = @ssl_context.verify_hostname |
| 1044 | + |
| 1045 | + # Server Name Indication (SNI) RFC 3546/6066 |
| 1046 | + case @address |
| 1047 | + when Resolv::IPv4::Regex, Resolv::IPv6::Regex |
| 1048 | + # don't set SNI, as IP addresses in SNI is not valid |
| 1049 | + # per RFC 6066, section 3. |
| 1050 | + |
| 1051 | + # Avoid openssl warning |
| 1052 | + @ssl_context.verify_hostname = false |
| 1053 | + else |
| 1054 | + ssl_host_address = @address |
| 1055 | + end |
| 1056 | + |
1039 | 1057 | debug "starting SSL for #{conn_addr}:#{conn_port}..."
|
1040 | 1058 | s = OpenSSL::SSL::SSLSocket.new(s, @ssl_context)
|
1041 | 1059 | s.sync_close = true
|
1042 |
| - # Server Name Indication (SNI) RFC 3546 |
1043 |
| - s.hostname = @address if s.respond_to? :hostname= |
| 1060 | + s.hostname = ssl_host_address if s.respond_to?(:hostname=) && ssl_host_address |
| 1061 | + |
1044 | 1062 | if @ssl_session and
|
1045 | 1063 | Process.clock_gettime(Process::CLOCK_REALTIME) < @ssl_session.time.to_f + @ssl_session.timeout
|
1046 | 1064 | s.session = @ssl_session
|
1047 | 1065 | end
|
1048 | 1066 | ssl_socket_connect(s, @open_timeout)
|
1049 |
| - if (@ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE) && @ssl_context.verify_hostname |
| 1067 | + if (@ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE) && verify_hostname |
1050 | 1068 | s.post_connection_check(@address)
|
1051 | 1069 | end
|
1052 | 1070 | debug "SSL established, protocol: #{s.ssl_version}, cipher: #{s.cipher[0]}"
|
|
0 commit comments