Уведомление Apple Push/ошибка Ruby OpenSSL

При попытке отправить push-уведомление из моего приложения rails я получаю это. Я убедился, что токен устройства и файл .pem действительны с помощью команды

openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert aps_development.pem -key aps_development.pem

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read finished A: tlsv1 alert internal error
    from /Library/Ruby/Gems/2.0.0/gems/houston-2.2.3/lib/houston/connection.rb:44:in `connect'
    from /Library/Ruby/Gems/2.0.0/gems/houston-2.2.3/lib/houston/connection.rb:44:in `open'
    from /Library/Ruby/Gems/2.0.0/gems/houston-2.2.3/lib/houston/connection.rb:19:in `open'
    from /Library/Ruby/Gems/2.0.0/gems/houston-2.2.3/lib/houston/client.rb:40:in `push'

Это сообщение об ошибке невероятно расплывчато, не могу понять, что происходит.


person blee908    schedule 19.11.2016    source источник
comment
Связано с этим, см. "проверить ошибку:num=20" при подключении к gateway.sandbox.push.apple.com. Ваша проблема, вероятно, связана с сертификатом клиента. Почему сертификат и закрытый ключ называются aps_development.pem?   -  person jww    schedule 19.11.2016
comment
Это решило проблему, если бы я использовал open openssl через командную строку, но я использую драгоценный камень (Хьюстон), который использует openssl, и проблема все еще сохраняется. Есть идеи?   -  person blee908    schedule 19.11.2016
comment
Извините, я не знаю о Руби. Я давно отказался от этого. Слишком сложно выполнять простые задачи, связанные с безопасностью, например установить версию протокола TLS 1.0 или задать имя сервера для SNI. Можете ли вы убедиться, что ваш Gem использует TLS 1.0 или выше, использует индикацию имени сервера (SNI) и сертификат клиента? Wireshark сможет определить это, потому что они доступны в ClientHello до того, как сработает шифрование.   -  person jww    schedule 19.11.2016
comment
Вот некоторые связанные вопросы: Как установить параметры контекста TLS в Ruby (например, OpenSSL::SSL::SSL_OP_NO_SSLv2), OpenSSL::SSL::SSLContext SNI servername_cb не работает и HTTP библиотека для Ruby с HTTPS, сертификатом клиента SSL и поддержкой Keep-Alive? Я не уверен, применимы ли они как к Ruby, так и к Gems; или только собственно Руби.   -  person jww    schedule 19.11.2016
comment
Я сталкиваюсь с той же проблемой. Вы уверены, что ваш ruby ​​использует правильную версию openssl? Попробуйте это, чтобы быть уверенным: ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'   -  person wrtsprt    schedule 07.03.2017


Ответы (1)


когда вы получаете эту ошибку OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read finished A: tlsv1 alert internal error, это означает, что с вашим сертификатом что-то не так. либо срок действия сертификата истек, либо, возможно, пароль.

Просто обновите свой сертификат Apple Push Notification, и все будет хорошо.

Дополнительное примечание: команды openssl мало что говорят об этом, если вы обнаружите, что вам нужно добавить -CApath или -CAfile (или передать эти пути в ENV ), что, вероятно, вводит в заблуждение.

Надеюсь, это поможет. Я возился почти неделю, чтобы разобраться в этом вопросе.

person rubyonrails3    schedule 09.04.2017