Uygulamamın yerel ağda kullanmak için güvenilir kendinden imzalı sertifikalar içeren kişisel bir anahtar deposu var: - mykeystore.jks
. Yerel ağda bulunan yerel web sitelerinin yanı sıra yerel sitelere bağlanmış kendinden imzalı sertifikalar kullanarak herkese açık sitelere (google.com) bağlanmayı diliyorum.Bir TrustManagerFactory'yi birden çok güven kaynağıyla nasıl başlatırım?
sorun burada https://google.com bağlandığınızda kendi deposunu ayarı
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Ancak istisna raporlama, JRE ile birlikte kök CA'larını içeren varsayılan anahtar deposunu kıldığından, yol bina, eğer başarısız olmasıdır Kendi anahtar depomuma (mykeystore.jks
) bir CA sertifikası alıyorum, iyi çalışıyor. Her ikisini de destekleyecek bir yolu var mı? Bu amaçla kendi TrustManger var
,
public class CustomX509TrustManager implements X509TrustManager {
X509TrustManager defaultTrustManager;
public MyX509TrustManager(KeyStore keystore) {
TrustManagerFactory trustMgrFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustMgrFactory.init(keystore);
TrustManager trustManagers[] = trustMgrFactory.getTrustManagers();
for (int i = 0; i < trustManagers.length; i++) {
if (trustManagers[i] instanceof X509TrustManager) {
defaultTrustManager = (X509TrustManager) trustManagers[i];
return;
}
}
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
try {
defaultTrustManager.checkServerTrusted(chain, authType);
} catch (CertificateException ce) {
/* Handle untrusted certificates */
}
}
}
Sonra SSLContext, TrustManager [] trustManagers = başlatmak yeni TrustManager [] {yeni CustomX509TrustManager (deposu)}; SSLContext customSSLContext = SSLContext.getInstance ("TLS"); customSSLContext.init (null, trustManagers, null); Kendi güven yöneticileri set yoksa
ve soket fabrika set
,HttpsURLConnection.setDefaultSSLSocketFactory(customSSLContext.getSocketFactory());
ana program,
URL targetServer = new URL(url);
HttpsURLConnection conn = (HttpsURLConnection) targetServer.openConnection();
, gayet https://google.com bağlanır. Varsayılan anahtar deposuna işaret eden bir "varsayılan güven yöneticisi" nasıl alabilirim?
Olası yinelenen (http://stackoverflow.com/questions/1793979/registering-multiple-keystores-in-jvm) – OrangeDog