[解決済み] okHttpですべての証明書を信頼する
質問
テスト目的のために、私はプロキシが設定されている間すべてを信頼するソケットファクトリを私のokHttpクライアントに追加しようとしています。これは何度も繰り返されてきましたが、信頼するソケット ファクトリーの私の実装は、何かが欠けているようです。
class TrustEveryoneManager implements X509TrustManager {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { }
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { }
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
}
OkHttpClient client = new OkHttpClient();
final InetAddress ipAddress = InetAddress.getByName("XX.XXX.XXX.XXX"); // some IP
client.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ipAddress, 8888)));
SSLContext sslContext = SSLContext.getInstance("TLS");
TrustManager[] trustManagers = new TrustManager[]{new TrustEveryoneManager()};
sslContext.init(null, trustManagers, null);
client.setSslSocketFactory(sslContext.getSocketFactory);
私のアプリからリクエストが送信されることはなく、例外も記録されないので、okHttp の中で静かに失敗しているようです。さらに調査したところ、okHttp の
Connection.upgradeToTls()
の中で飲み込まれている例外があるようです。私が受けている例外は
javax.net.ssl.SSLException: SSL handshake terminated: ssl=0x74b522b0: SSL_ERROR_ZERO_RETURN occurred. You should never see this.
次のコードでは
SSLContext
を生成し、例外を発生させない SSLSocketFactory を作成するのに魅力的に動作します。
protected SSLContext getTrustingSslContext() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
final SSLContextBuilder trustingSSLContextBuilder = SSLContexts.custom()
.loadTrustMaterial(null, new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
return true; // Accepts any ssl cert whether valid or not.
}
});
return trustingSSLContextBuilder.build();
}
問題は、私のアプリからすべてのApache HttpClientの依存性を完全に削除しようとしていることです。Apache HttpClient を使用した基礎となるコードで
SSLContext
を生成する Apache HttpClient の基本的なコードは十分に単純に見えますが、私は明らかに何かを見逃しているようです。
SSLContext
を設定することができないので、明らかに何かを見逃しています。
Apache HttpClient を使用せずに、私が望むことを行う SSLContext の実装を作成できる方はいらっしゃいますか?
どのように解決するのですか?
誰かがここに落ちる念のために、私のために働いた(唯一の)解決策は、作成されています。
OkHttpClient
を作成することです。
ここで
.
以下はそのコードです。
private static OkHttpClient getUnsafeOkHttpClient() {
try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
OkHttpClient okHttpClient = builder.build();
return okHttpClient;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
関連
-
[解決済み】このアクティビティでは、Theme.AppCompatテーマ(またはその子孫)を使用する必要があります。
-
armeabi-v7a armeabi arm64-v8a パラメータの意味説明
-
Gradle の同期に失敗しました。com.android.tools.build:gradle が見つかりませんでした。
-
を作ってください。*** makeするルールがない エラーの原因、分析、解決策
-
WeChatとQQは、他のアプリのオープンリストに自分のアプリを追加し、ファイルパスを取得することができます
-
view.getRootView()の本当の意味とテストについて
-
Androidの美しいSeekBarスタイルのカスタマイズ
-
Androidカスタムドロップダウンリストボックスコントロール
-
[解決済み] HttpClient over HTTPSを使用してすべての証明書を信頼する
-
[解決済み】OkHttpで接続タイムアウトを設定する方法
最新
-
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エミュレーターのADBサーバーがACKしない問題
-
cygwinのダウンロード、インストールチュートリアル、およびCDTの「makeプログラムがパスに見つからない」バグの解消
-
GIF、Lottie、SVGA
-
RuntimeException: アクティビティを開始できません ComponentInfo solution
-
プロセス 'command 'F:\sdkbuild-tools', 26.0.2 AAAPT.exe' finished with non-zero exit value 1
-
アンドロイドリストビュー
-
Androidカスタムドロップダウンリストボックスコントロール
-
Android Studio常见错误之:Rendering Problems/The following classes could not be instantiated
-
アンドロイドにおけるトークンの利用
-
Android studio 制約レイアウト ConstraintLayout