我試圖固定我的服務器的自簽名證書。 我OkHttpClient有兩個參數,第一個是SSL套接字工廠:Okhttp3 - 接受所有證書並使用certificatePinner
final TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}
@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
};
// Install the all-trusting trust manager
SSLContext sslContext;
try {
sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
} catch (NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
FirebaseCrash.report(e);
return null;
}
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
二是證書平納:
new CertificatePinner.Builder()
.add("bogus.com", "sha1/BOGUS")
.build()
注:如果我不加certificatePinner,則一切正常精細。問題是,該請求被執行時,CertificatePinner.check()被調用:
if (pins.isEmpty()) return;
顯然,如果我設置一個(非空)certificatePinner,該方法不會停在那裏,並會繼續。然後它繼續檢查「至少一個固定我的主機名的證書是可信證書」。
問題是我在我的TrustManager中傳遞了getAcceptedIssuers中的空數組 - 意味着自簽名證書將觸發異常,因爲它在「getAcceptedIssues」中沒有被明確信任。似乎不可能在「getAcceptedIssuers」中明確表示不可信任的證書。
有什麼辦法可以解決這個問題嗎?它是否由設計?
這是我建立我的OkHttpClient:
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0])
.certificatePinner(certPinner)
.readTimeout(10, TimeUnit.SECONDS)
.connectTimeout(10, TimeUnit.SECONDS)
.build();
你提供的代碼絕對幫了我,雖然它不完全回答我原來的問題。感謝您的幫助,我最終創建了一個有效的TrustManager。 – geecko
是的,我試圖回答我認爲你正在嘗試做的事情,添加一個自簽名證書,以便你有一個安全的連接,但針對這一點。接受所有證書然後嘗試安裝並不是典型的用例。 –