ネットワークリクエスト時にhttpsを使用した場合、以下のエラーが発生し、証明書のパストラストアンカーが見つかりません
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: 証明書パスのトラスト アンカーが見つかりません。
このエラーも簡単に解決できます。最善の解決策は、正式かつ合法的な https 証明書を取得し、それをバックグラウンドでアップロードするか、アプリケーション検証のためにアセットに保存することです。これが最も根本的な解決策です。証明書がない場合は、証明書の検証を無視することしかできません。次のコードの実装です。
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[]{new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}}, new SecureRandom());
次に、OkHttpClient を参照してください。
client.setSslSocketFactory(sc.getSocketFactory());
client.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
このように、形式的な検証は無視されます。リクエスト全体のコードを見てみましょう。これは私が書いたツール クラスです。そのうちの 1 つだけを示します (リクエストの取得)。追加方法を理解する必要があるだけです。 。
public static void requestData(final String url, final HashMap<String, String> params, final RequestCallBack callBack) {
new Thread(new Runnable() {
@Override
public void run() {
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[]{new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}}, new SecureRandom());
final String allUrl = url + builderParams(params);
Log.e("---------------------", allUrl);
Request request = new Request.Builder()
.url(allUrl)
.addHeader("Accept-Encoding", "musixmatch")
.build();
final OkHttpClient client = new OkHttpClient();
client.setSslSocketFactory(sc.getSocketFactory());
client.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
client.setConnectTimeout(30, TimeUnit.SECONDS);
client.setWriteTimeout(30, TimeUnit.SECONDS);
client.setReadTimeout(30, TimeUnit.SECONDS);
client.setRetryOnConnectionFailure(false);
client.setConnectionPool(new ConnectionPool(MAX_IDLE_CONNECTIONS, KEEP_ALIVE_DURATION_MS));
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
if (callBack != null)
callBack.onFailure(e);
}
@Override
public void onResponse(Response response) throws IOException {
if (callBack == null) return;
if (!response.isSuccessful()) {
callBack.onFailure(null);
} else {
callBack.onSuccess(response.body().string());
}
}
});
} catch (Exception e) {
if (callBack != null) callBack.onFailure(null);
}
}
}).start();
}