Если вы хотите динамически импортировать сертификат, вам может потребоваться использовать пользовательский файл x509TrustManager
. Это делается при настройке SSLContext
. , который сам используется для создания SSLSocketFactory
или SSLEngine
.
jSSLutils – это библиотека, позволяющая обертывать существующие диспетчеры доверия и настраивать определенные параметры. Вам это не нужно, но может помочь.
Это будет происходить в следующих направлениях:
PKIXSSLContextFactory sslContextFactory = new PKIXSSLContextFactory();
sslContextFactory.setTrustManagerWrapper(new X509TrustManagerWrapper() {
@Override
public X509TrustManager wrapTrustManager(final X509TrustManager origManager) {
return new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return origManager.getAcceptedIssuers();
}
@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType)
throws CertificateException {
try {
// This will call the default trust manager
// which will throw an exception if it doesn't know the certificate
origManager.checkServerTrusted(chain, authType);
} catch (CertificateException e) {
// If it throws an exception, check what this exception is
// the server certificate is in chain[0], you could
// implement a callback to the user to accept/refuse
}
}
@Override
public void checkClientTrusted(X509Certificate[] chain,
String authType)
throws CertificateException {
origManager.checkClientTrusted(chain, authType);
}
};
}
});
SSLContext sslContext = sslContextFactory.buildSSLContext();
((PKIX)SSLContextFactory
и X509TrustManagerWrapper
взяты из jSSLutils, но остальные доступны с J2SE/J2EE.)
Есть несколько CertificateException
s, которые вы может захотеть поймать (см. подклассы). Если вы делаете обратный вызов пользователю, возможно, что соединение SSL/TLS не будет выполнено в первый раз из-за тайм-аута рукопожатия SSL/TLS (если ответ на обратный вызов занимает слишком много времени).
Затем вы можете использовать этот SSLContext
по умолчанию, используя SSLContext.setSSLContext(...)
(из Java 6), но это не обязательно хорошая идея. Если можете, передайте SSLContext
библиотеке, которая устанавливает соединение SSL/TLS. То, как это делается, различается, но, например, Apache HTTP Client 4.x имеет несколько вариантов настройки параметров SSL, один из которых — путем передачи KeyStore
s, а другой — путем передачи SSLContext
.
Вы также можете сделать что-то для каждого потока, а не для каждого объекта, который будет подключаться (зависит от библиотеки), проверив текущий поток в X509TrustManager
: это, вероятно, немного усложнит ситуацию с точки зрения синхронизации и управления потоками / «осведомленности» на доверительный управляющий.
person
Bruno
schedule
09.09.2010