Android 4.0 以降で実行するエンタープライズ コミュニケーション アプリを開発しています。このアプリには、C/C++ で記述されたネイティブ トランスポート層があり、SIP サーバーとの SSL 接続を管理します。ネイティブ レイヤーは、SSL 接続に openSSL ライブラリを使用します。
アプリが SSL 接続を開くときに、サーバー証明書の検証を実装する必要があります。これには、利用可能なルート CA 証明書とホスト名の検証に対する証明書チェーンの検証が含まれます。私の問題は、Android のトラスト ストア CA 証明書に (私が認識している) アクセスがないことです。これは、組み込みの証明書 (Verisign など) とユーザーがインストールした信頼できる CA を意味します。
したがって、私がしなければならないことは、Java セキュリティ API を使用できるように、証明書チェーンを Java コードに渡すことです (これは実装され、機能しています)。基本的に、私が始めなければならないのは、PEM 形式の証明書 (サーバーから受け取ったチェーン) の配列です (それがより良い場合は DER である可能性があります)。
チェーンを Certificate オブジェクトに変換し、Certificate オブジェクトを CertPath オブジェクトに変換する方法を理解しています。CertPathValidator を使用して CertPath を検証できるようです。私は正しい軌道に乗っていますか?ここで私がつまずいたのは、CertPathValidator.validate(cp,params) が PKIXParameters オブジェクトを受け取ることです。これには、キーストアまたは TrustAnchors のセットが必要なようです。キーストアまたは TrustAnchors のセットは、cp (証明書パス) の検証に使用される信頼されたルート CA を表していると思いますが、正しいですか? その場合、PKIXParameters コンストラクターの入力パラメーターをどこでどのように取得しますか?
別の方法として、TrustManager を使用してサーバー証明書を検証できるかどうか、または使用する必要があるかどうかを調べ始めました。HTTPSUrlConnection を操作するときに TrustManagers がどのように適合し、使用されるかを理解していると思いますが、PEM 証明書の配列だけから始めた場合にこれをどのように行うかは明確ではありません。
誰かが私を正しい方向に向けることができますか?
ありがとう、
- ケン