私はAndroidアプリを開発しています。これは、HTTPSリクエストを自分のWebサーバー(Linux、Nginx、「Let's Encrypt」からのSSL証明書)に送信します)。
リクエストはテストデバイス(Android 4.2.2&Android 6.0.1)では正常に機能しましたが、別のデバイス(5.1.1)ではリクエストが例外をスローしました:
ホスト名[my_domain]を確認できません
ブラウザで証明書を見ると、次の接続を使用して正常に動作しているようです。
TLS 1.2 AES_128_GCM ECDHE_RSA
ヘルプをWebで検索した後、クライアントにCipher SuiteTLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(これはリクエストが機能した他のテストデバイスで使用されました)。
要するに、リクエストはどのデバイスでも機能しました。これは、接続が成功しなかったのはクライアントの障害であることを示しています。
だから今私の質問に:
一部のAndroidデバイスでSSL検証が機能するのに、一部のデバイスでは機能しないのはなぜですか?
証明書が有効であり、証明書に記載されているホスト名が正しいものであるにもかかわらず、ホスト名を検証できなかったという例外が表示されるのはなぜですか?
リクエストを特定の暗号スイートにバインドするのは悪いことですか? ( これらのリスト を見ると、指定された暗号スイートは、必要なすべてのデバイスで利用できるはずですAndroidデバイス(4.1.0以降))
私はSSLのかなりの初心者であり、これを理解するのに役立つ可能性のある回答を楽しみにしています。
TLS(SSLとも呼ばれます)の背景-クライアントからサーバーへの安全な接続を確立しようとすると、サーバーはクライアントに証明書を送信し、サポートする暗号スイートのリストとともに、クライアントにその身元を証明します。クライアントは、接続先のドメインが証明書に記載されているドメインであること、および証明書が有効な 認証局 によって署名されていることを確認することにより、IDを確認します。これが行われた後、クライアントとサーバーは、鍵を導出するためのいくつかの共有秘密を確立し、暗号スイートについても合意します。
上で、暗号スイート(TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256など)がネゴシエートされることに気付くかもしれませんafterサーバーのアイデンティティが確立されます。つまり、ホスト名の検証に問題があった場合、暗号スイートがネゴシエートされたときではなく、サーバーがクライアントに証明書を送信したときに問題が発生します。つまり、このエラーは、暗号スイートが同意される前に発生するため、サーバーとクライアントが同意する暗号スイートにリンクされるべきではありません。
私の直感は、これはAndroidで使用されているSSLライブラリによって提供される誤解を招く例外メッセージである可能性があることです。 Android 5 "そのままで" SSLライブラリが付属している暗号スイートには詳しくありませんが、おそらくサーバーがクライアントにサポートされている暗号のリストを送信すると、クライアントはそれがサポートする暗号は表示されず、これはいくつかの誤解を招く例外ロジックにカスケードされます。サーバーがサポートするように構成されている暗号スイートと、サポートされているAndroid 5のドキュメントを参照してください。あなたが言ったことを考えると真実に思われることの1つは、証明書はここでは問題ではないということです。