[解決済み] OkHttpは自己署名SSL証明書の受理をサポートしていますか?
質問
私は、自己署名SSL証明書を持つサーバーを持っている顧客のために働いています。
Retrofit + CustomClientでOkHttpクライアントをラップして使っています。
RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(Config.BASE_URL + Config.API_VERSION)
.setClient(new CustomClient(new OkClient(), context))
.build();
OkHttpはデフォルトで自己署名SSL証明書サーバを呼び出すことをサポートしていますか?
ちなみに Retrofitはどのクライアントがデフォルトで使っているのでしょうか?私はOkHttpだと思っていたのですが、もう少し調べるとOkHttpの依存関係をインポートする必要があることに気づきました
解決方法は?
はい、解決しました。
Retrofitは、あなたのニーズに合わせて設定された、カスタムHTTPクライアントを設定することができます。
自己署名SSL証明書に関しては、以下の議論があります。
ここで
. このリンクには、自己署名SSLをAndroidの
DefaultHttpClient
に自己署名SSLを追加し、このクライアントをRetrofitに読み込ませるためのコードサンプルが含まれています。
もしあなたが
OkHttpClient
が自己署名SSLを受け入れるために必要であれば、それをカスタム
javax.net.ssl.SSLSocketFactory
インスタンスを
setSslSocketFactory(SSLSocketFactory sslSocketFactory)
メソッドを介して
ソケットファクトリを取得する最も簡単な方法は、ソケットファクトリを
javax.net.ssl.SSLContext
で説明したように
ここで
.
OkHttpClientを設定するためのサンプルです。
OkHttpClient client = new OkHttpClient();
KeyStore keyStore = readKeyStore(); //your method to obtain KeyStore
SSLContext sslContext = SSLContext.getInstance("SSL");
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, "keystore_pass".toCharArray());
sslContext.init(keyManagerFactory.getKeyManagers(),trustManagerFactory.getTrustManagers(), new SecureRandom());
client.setSslSocketFactory(sslContext.getSocketFactory());
okhttp3のコードを更新(builderを使用)。
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(sslContext.getSocketFactory())
.build();
は
client
の証明書を使用するように設定されています。
KeyStore
. しかし、信頼できるのはあなたの
KeyStore
の中の証明書しか信用せず、それ以外のものは信用しません。たとえシステムがデフォルトで信用していたとしてもです。(自己署名証明書だけを
KeyStore
に自己署名証明書だけを記述し、HTTPS で Google のメインページに接続しようとすると、次のようになります。
SSLHandshakeException
).
を取得することができます。
KeyStore
のインスタンスを取得できます。
ドキュメント
:
KeyStore readKeyStore() {
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
// get user password and file input stream
char[] password = getPassword();
java.io.FileInputStream fis = null;
try {
fis = new java.io.FileInputStream("keyStoreName");
ks.load(fis, password);
} finally {
if (fis != null) {
fis.close();
}
}
return ks;
}
アンドロイドの場合、このファイルを
res/raw
フォルダから取得し
Context
のインスタンスから
fis = context.getResources().openRawResource(R.raw.your_keystore_filename);
鍵ストアの作成方法については、いくつかの議論があります。たとえば ここで
関連
-
実行中にEclipseがポップアップする A Java Exception has occurred
-
[解決済み] SSLハンドシェイクで「Could not generate DH keypair」例外が発生するのはなぜですか?
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
が 'X-Frame-Options' を 'sameorigin' に設定したため、フレーム内に存在する。
-
-bash: java: コマンドが見つからない 解決方法
-
java.sql.SQLException: 結果セットの開始前
-
XXX型を囲むインスタンスがJavaでアクセスできない
-
テストが空であるかどうかを判断するためのオプションの処理
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] スクエア後付サーバーのテスト用モック
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】AndroidのSSL接続でトラストアンカーが見つからない
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
ブートレイヤーの初期化中にエラーが発生しました java.lang.module.FindException: モジュールが見つかりません
-
Git Pull Failed マージされていないファイルがあるため、Pull できません。
-
java -jarコマンドでパッケージを実行すると、無効または破損したjarfile xxxx.jarが表示される。
-
java.sql.SQLException: 結果セットの開始前
-
FindBugの使用概要
-
アノテーション「@Retention」の役割
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
[解決済み] okHttpですべての証明書を信頼する