Sie könnten ein ähnliches Muster verwenden wie in einer früheren Antwort (für ein anderes Problem).
Besorgen Sie sich im Wesentlichen den Standard-Vertrauensmanager und erstellen Sie einen zweiten Vertrauensmanager, der Ihren eigenen Vertrauensspeicher verwendet. Schließen Sie beide in eine benutzerdefinierte Trust Manager-Implementierung ein, die den Aufruf an beide delegiert (bei einem Ausfall auf den anderen zurückgreifen).
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init((KeyStore) null);
X509TrustManager defaultTm = null;
for (TrustManager tm : tmf.getTrustManagers()) {
if (tm instanceof X509TrustManager) {
defaultTm = (X509TrustManager) tm;
break;
}
}
FileInputStream myKeys = new FileInputStream("truststore.jks");
KeyStore myTrustStore = KeyStore.getInstance(KeyStore.getDefaultType());
myTrustStore.load(myKeys, "password".toCharArray());
myKeys.close();
tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(myTrustStore);
X509TrustManager myTm = null;
for (TrustManager tm : tmf.getTrustManagers()) {
if (tm instanceof X509TrustManager) {
myTm = (X509TrustManager) tm;
break;
}
}
final X509TrustManager finalDefaultTm = defaultTm;
final X509TrustManager finalMyTm = myTm;
X509TrustManager customTm = new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return finalDefaultTm.getAcceptedIssuers();
}
@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
try {
finalMyTm.checkServerTrusted(chain, authType);
} catch (CertificateException e) {
finalDefaultTm.checkServerTrusted(chain, authType);
}
}
@Override
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
finalDefaultTm.checkClientTrusted(chain, authType);
}
};
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[] { customTm }, null);
SSLContext.setDefault(sslContext);
Sie müssen diesen Kontext nicht als Standardkontext festlegen. Wie Sie es verwenden, hängt von der Client-Bibliothek ab, die Sie verwenden (und woher es seine Socket-Fabriken bezieht).
Grundsätzlich müssten Sie den Truststore jedoch ohnehin immer nach Bedarf aktualisieren. Das Java 7 JSSE-Referenzhandbuch enthielt einen "wichtigen Hinweis", der jetzt in Version 8 desselben Handbuchs auf nur einen "Hinweis" herabgestuft wurde :
Das JDK wird mit einer begrenzten Anzahl vertrauenswürdiger Stammzertifikate in der Datei java-home / lib / security / cacerts ausgeliefert. Wie auf den Keytool-Referenzseiten dokumentiert, liegt es in Ihrer Verantwortung, die in dieser Datei enthaltenen Zertifikate zu verwalten (dh hinzuzufügen und zu entfernen), wenn Sie diese Datei als Truststore verwenden.
Abhängig von der Zertifikatkonfiguration der Server, mit denen Sie Kontakt aufnehmen, müssen Sie möglicherweise zusätzliche Stammzertifikate hinzufügen. Beziehen Sie die erforderlichen spezifischen Stammzertifikate vom entsprechenden Anbieter.