サーバー側で中間 CA 証明書が不足している可能性があります。
これを読んでみてください
ほとんどのパブリック CA は、サーバー証明書に直接署名しません。代わりに、ルート CA と呼ばれるメイン CA 証明書を使用して、中間 CA に署名します。これにより、ルート CA をオフラインで保存して侵害のリスクを軽減できます。ただし、Android などのオペレーティング システムは通常、ルート CA のみを直接信頼するため、中間 CA によって署名されたサーバー証明書とルート CA を認識している証明書検証者との間に短い信頼のギャップが残ります。これを解決するために、サーバーは SSL ハンドシェーク中に証明書だけをクライアントに送信するのではなく、信頼されたルート CA に到達するために必要な中間を介してサーバー CA から一連の証明書を送信します。
これが実際にどのように見えるかを確認するために、openssl s_client コマンドで表示される mail.google.com 証明書チェーンを次に示します。
$ openssl s_client -connect mail.google.com:443
証明書チェーン 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=mail.google.com i:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN= Thawte SGC CA 1 s:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
これは、サーバーが、中間 CA である Thawte SGC CA によって発行された mail.google.com の証明書と、Verisign CA によって発行された Thawte SGC CA の 2 番目の証明書を送信することを示しています。Verisign CA は、によって信頼されているプライマリ CA です。アンドロイド。
ただし、必要な中間 CA を含めないようにサーバーを構成することは珍しくありません。たとえば、Android ブラウザーでエラーを引き起こし、Android アプリで例外を引き起こす可能性のあるサーバーを次に示します。
$ openssl s_client -connect egov.uscis.gov:443
証明書チェーン 0 s:/C=US/ST=District Of Columbia/L=Washington/O=US Department of Homeland Security/OU=United States Citizenship and Immigration Services/OU=Terms of use at www.verisign.com/rpa (c)05/CN=egov.uscis.gov
i:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=利用規約https://www.verisign.com/rpa (c)10/CN=VeriSign Class 3 International Server CA - G3
ここで興味深いのは、ほとんどのデスクトップ ブラウザーでこのサーバーにアクセスしても、完全に不明な CA や自己署名サーバー証明書のようなエラーが発生しないことです。これは、ほとんどのデスクトップ ブラウザが、信頼できる中間 CA を時間の経過とともにキャッシュするためです。ブラウザーが 1 つのサイトにアクセスして中間 CA について学習すると、次回は中間 CA を証明書チェーンに含める必要はありません。
一部のサイトでは、リソースを提供するために使用されるセカンダリ Web サーバーに対して意図的にこれを行っています。たとえば、メインの HTML ページは完全な証明書チェーンを持つサーバーによって提供されますが、おそらく帯域幅を節約するために、画像、CSS、または JavaScript などのリソース用のサーバーには CA が含まれていません。残念ながら、これらのサーバーが、Android アプリから呼び出そうとする Web サービスを提供している場合がありますが、これはそれほど寛容ではありません。
この問題を解決するには、次の 2 つの方法があります。
サーバー チェーンに中間 CA を含めるようにサーバーを構成します。ほとんどの CA は、すべての一般的な Web サーバーに対してこれを行う方法に関するドキュメントを提供しています。少なくとも Android 4.2 まではデフォルトの Android ブラウザーでサイトを動作させる必要がある場合は、これが唯一の方法です。または、前の 2 つのセクションで行ったように、中間 CA を他の不明な CA と同様に扱い、それを直接信頼する TrustManager を作成します。