Проблема:
Начали сталкиваться с ошибками SSL / TLS в ruby в журналах рельсов, у нас работают серверы единорога
"Возвращено SSL_connect = 1 errno = 0 состояние = сервер чтения SSLv3 привет A: ошибка оповещения sslv3 "
14 февраля этого года, из-за изменения нашей командой neteng, отключившего TLS1.0, мы начали получать эту ошибку.это было проверено после того, как мы увидели это в спленках.
Важная информация
Операционная система
$cat /etc/redhat-release
CentOS release 6.2 (Final)
$rpm -qa | grep openssl
openssl-1.0.1e-16.el6_5.7.x86_64
openssl-devel-1.0.1e-16.el6_5.7.x86_64
$ruby --version
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-linux]
Я могу успешно создать соединение с хостом с помощью утилиты командной строки openssl
Ниже приведен вывод openssl, секретная информация маскируется
$openssl s_client -connect *****:443 -ssl3 -quiet
140724625205064:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1256:SSL alert number 40
140724625205064:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:596:
$openssl s_client -connect *****:443 -tls1 -quiet
139828362553160:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1256:SSL alert number 40
139828362553160:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:596:
$openssl s_client -connect *****:443 -tls1_1 -quiet
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA
verify return:1
depth=0 C = US, ST = California, L = San Jose, O = *****, CN = ****
verify return:1
$openssl s_client -connect *****:443 -tls1_2 -quiet
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA
verify return:1
depth=0 C = US, ST = California, L = San Jose, O = ****, CN = ****
verify return:1
Так что выше показано, что имя хоста (замаскированное) не поддерживает TLS V1.0, но поддерживает TLS V1.1 и далее.
Теперь, когда я вижу поддержку ruby для версии TLS с помощью следующего скрипта
$ruby --version
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-linux]
$ruby
require 'openssl'
print(OpenSSL::SSL::SSLContext::METHODS)
[:TLSv1, :TLSv1_server, :TLSv1_client, :SSLv2, :SSLv2_server, :SSLv2_client, :SSLv3, :SSLv3_server, :SSLv3_client, :SSLv23, :SSLv23_server, :SSLv23_client]
, отображается информация выше.Теперь, если я попытаюсь установить ssl-соединения с хостом простым скриптом, это будет успешно.Например,
$ls
connection_to_host_tls.rb
$cat connection_to_host_tls.rb
require 'net/https'
require 'json'
begin
uri = URI("https://******")
http = ::Net::HTTP.new uri.host, uri.port
http.use_ssl = true
data = http.get('/').body
puts "SSL connection to host succeeded"
rescue Exception => ex
puts "An error of type #{ex.class} happened, message is #{ex.inspect}"
end
$ruby connection_to_host_tls.rb
SSL connection to host succeeded
$
$ruby -e 'print "ruby #{ RUBY_VERSION }p#{ RUBY_PATCHLEVEL }"'
ruby 1.9.3p448$
Я могу создать рукопожатие для этого хоста в маске с помощью приведенного выше сценария.Что здесь происходит?Если я могу создать SSL-соединение с хостом, почему оно перестало работать в приложении ruby на rails?
Может кто-нибудь помочь мне здесь, если вам нужна дополнительная информация, пожалуйста, спросите.