Android アプリのクライアント証明書通信を実装しようとしていますが、これまでのところあまり成功していません。この機能は、可能であれば非常に難しいようです。私が実装している完全なフローは、前の質問に記載されています。
そこのコードとこのブログ投稿のコードに従い、多かれ少なかれ同じシナリオを説明しましたが、結果はありませんでした。
うまくいかないこと: Android クライアントとサーバーの間でSSL 接続 () を開くHttpsURLConnection
と、サーバーが403 ステータス コードを返します。
私の知る限り、この 403 は、サーバーが取得したクライアント証明書を取得していないか信頼していないためであり、デバッグ方法がわかりません。
何が機能しますか:
- PKCS#10 リクエストを作成して CA に送信し、署名付き PKCS#7 ( P7B )を取得する
- 受信したP7Bを秘密鍵とともに KeyStore に格納し、PKCS#12 にエクスポート ( P12 )
- (最も厄介なこと)デバイスからP12を選択し、Windowsにインストールし、サーバーに接続して、一貫した(200 HTTP-OK)応答を取得します。
変更したこと: 入手したコード サンプル (こことここから) から、いくつか変更する必要がありました。私は HttpsURLConnection を使用しており、そこで使用されている @Than のように OkHttpClient を使用していません (しかし、それは問題ではありません)。Rich Freedman が行ったように証明書を提供することはできません (彼は証明書を持っていて、PKCS#10 経由で取得しています。 #7)、サーバーの証明書を信頼するCustomTrustManagerを作成しました。このため、SpongyCastle(問題がある場合はv1.5.0.0、0に挿入されたプロバイダーとして設定)を使用し、証明書ですが、すべてがメモリ内で行われます。
問題は次に何をするかです:
- サーバーが何を期待しているのか (クライアント証明書に関して) どうすればわかりますか?
- サーバーに送信されているクライアント証明書 (存在する場合) を確認するにはどうすればよいですか?
- このシナリオを一般的にデバッグする方法は? (Fiddler などのプロキシは、基盤となる SSL には役に立ちません)
ありがとう!