web-dev-qa-db-ja.com

SSL:Androidはホスト名を検証できない可能性があり、暗号スイートを定義しています

私は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のかなりの初心者であり、これを理解するのに役立つ可能性のある回答を楽しみにしています。

6
Florian Mötz

TLS(SSLとも呼ばれます)の背景-クライアントからサーバーへの安全な接続を確立しようとすると、サーバーはクライアントに証明書を送信し、サポートする暗号スイートのリストとともに、クライアントにその身元を証明します。クライアントは、接続先のドメインが証明書に記載されているドメインであること、および証明書が有効な 認証局 によって署名されていることを確認することにより、IDを確認します。これが行われた後、クライアントとサーバーは、鍵を導出するためのいくつかの共有秘密を確立し、暗号スイートについても合意します。

上で、暗号スイート(TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256など)がネゴシエートされることに気付くかもしれませんafterサーバーのアイデンティティが確立されます。つまり、ホスト名の検証に問題があった場合、暗号スイートがネゴシエートされたときではなく、サーバーがクライアントに証明書を送信したときに問題が発生します。つまり、このエラーは、暗号スイートが同意される前に発生するため、サーバーとクライアントが同意する暗号スイートにリンクされるべきではありません。

私の直感は、これはAndroidで使用されているSSLライブラリによって提供される誤解を招く例外メッセージである可能性があることです。 Android 5 "そのままで" SSLライブラリが付属している暗号スイートには詳しくありませんが、おそらくサーバーがクライアントにサポートされている暗号のリストを送信すると、クライアントはそれがサポートする暗号は表示されず、これはいくつかの誤解を招く例外ロジックにカスケードされます。サーバーがサポートするように構成されている暗号スイートと、サポートされているAndroid 5のドキュメントを参照してください。あなたが言ったことを考えると真実に思われることの1つは、証明書はここでは問題ではないということです。

2
puzzlepalace
  • 証明書に署名しているCAは一部ではありませんAndroid証明書ストアなので、検証されません。いくつかの方法を参照してください 更新方法
  • 証明書は、完全な信頼パス(your_cert->中間CA1->中間CA2 ..->ルートCA)を確立できる場合にのみ有効と見なされます(0以上の中間CAが存在する可能性がありますが、ルートCAはAndroidバージョンの証明書ストア。 ssllabs を使用して、サーバー側の問題(中間証明書を送信しないなど)を確認する必要があります(「A」を目的とし、オレンジ/赤は使用しないでください)警告)および/または htbridge 。デバイスは中間証明書をキャッシュするため、暗号を変更しなくてもアプリが機能した可能性があります。または、特定の暗号がバグがある可能性がありますAndroidバージョン。
  • それは悪いです。おすすめは随時変更され、すべての人がアプリを常に更新するわけではありません。あなたはそれを自動機に任せるべきです。最高のSSL暗号セキュリティが必要な場合は、クライアントではなく、自動的に推奨/必須 サーバー側 にする必要があります。 Androidバージョンに応じて、既存のサポートのさまざまなレベルで役立ちます。簡単に言うと、サーバーとAndroidアプリはデフォルトを使用します。
1
Matija Nalis