2016-10-22 16 views
1

Следующий код сервера делает SSL-соединение с curl и Safari, но он не работает с Firefox или Chrome. Работает над Safari после сохранения исключения сертификата.Как сделать безопасное соединение HTTP/2 с сервером Ruby с Chrome и Firefox?

server = TCPServer.new(8080) 

    ctx = OpenSSL::SSL::SSLContext.new 
    ctx.cert = OpenSSL::X509::Certificate.new(File.open('lib/keys/server.crt')) 
    ctx.key = OpenSSL::PKey::RSA.new(File.open('lib/keys/server.key')) 

    ctx.ssl_version = :TLSv1_2 
    ctx.options = OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:options] 
    ctx.ciphers = OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ciphers] 

    server = OpenSSL::SSL::SSLServer.new(server, ctx) 

Я попытался добавить сертификат в Firefox и брелок (OSX), но я все еще получаю

Веб-страница https://localhost:8080/ может быть временно недоступна или постоянно перемещена по новому адресу ,

ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY

Googling предполагает, что существует проблема с шифрами, но следующий не делали разницы:

ctx.ciphers = 'AESGCM:HIGH:!aNULL:!MD5' 
ctx.ciphers = 'EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES' 
ctx.ciphers = 'TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5' 

Комментирование ctx.ciphers не помогло.

На Firefox соединение висит. Не нашел хорошего способа получить ошибку.

Использование Chrome 53, Firefox 46 и OpenSSL 1.0.2j.

Что может вызвать эту ошибку?

ответ

1

Похоже, что Chrome настаивает на использовании эфемерную ECDH обмена ключами для HTTP/2, и получить, что для работы вам необходимо установить tmp_ecdh_callback:

ctx.tmp_ecdh_callback = lambda do |*args| 
    OpenSSL::PKey::EC.new 'prime256v1' 
end 

я на основе этого на example code from the Ruby http-2 gem, который я подумайте, что у вас тоже есть код. Обратите внимание, что в этом коде он использует lambda do |_args| (с подчеркиванием, но не *), и это вызывает проблемы, потому что количество аргументов неверно и lambda строго придерживается правильного номера, поэтому вы получаете ошибки. Я изменил его обратно на оригинал *args здесь, он, похоже, имеет been changed to fix Rubocop warnings. Поскольку вы, похоже, активны в этом репо, вы можете изменить его на что-то вроде |*_args|.

+0

Похоже, что это изменение изменится в будущих версиях Openssl и привязок Ruby: https://github.com/ruby/openssl/commit/fcb9b4a6b5c6e30a99d9acb8c73e62c3c7559001 – matt

+0

ОМЗ. Я провел целый день, пытаясь понять это. И я использую тот же пример кода. Я думал, что это проблема с шифрами. Я извлек этот код, потому что он вызывал проблемы, и он вот-вот должен был добавить его обратно и понять, почему он терпит неудачу. –

+0

@ Даже мне потребовалось некоторое время, чтобы выяснить, что происходит. Проблема с использованием 'lambda' была сложной - это вызвало отказ callback полностью, но не было очевидно, почему. – matt