проблема
Я пытаюсь подключиться к локальному серверу через сокет SSL. Сервер использует сертификат SSL, который:
- Самоподписан.
- Имеет подпись MD5 с RSA (?)
Я знаю о последствиях для безопасности, но по независящим от меня причинам я не могу изменить или запросить изменения в этом сертификате, поэтому я вынужден работать с ним - или, скорее, с ним.
Чтобы преодолеть два вышеуказанных момента, я создал:
- A
TrustManager
, разрешающий все сертификаты.
-
AlgorithmConstraints
, который разрешает все алгоритмы.
Я получаю следующую ошибку:
Caused by: java.security.cert.CertPathValidatorException: Algorithm constraints check failed on signature algorithm: MD5withRSA
Кажется, что мой подход к ослаблению ограничений алгоритма неверен.
Примечание : я знаю, что алгоритм MD5withRSA
можно разрешить путем изменения конфигурации JVM или параметра командной строки, но мне нужно сделать это программно.
код
TrustManager
был создан следующим образом:
TrustManager[] trustManager = new TrustManager[] {
new X509TrustManager() {
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
}
};
AlgorithmConstraints
был создан следующим образом:
AlgorithmConstraints algorithmConstraints = new AlgorithmConstraints() {
@Override
public boolean permits(Set<CryptoPrimitive> primitives, String algorithm, AlgorithmParameters parameters) {
return true;
}
@Override
public boolean permits(Set<CryptoPrimitive> primitives, Key key) {
return true;
}
@Override
public boolean permits(Set<CryptoPrimitive> primitives, String algorithm, Key key, AlgorithmParameters parameters) {
return true;
}
}
И, наконец, код сокета выглядит следующим образом:
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManager, new java.security.SecureRandom());
SSLSocketFactory factory = sslContext.getSocketFactory();
SSLSocket sslsocket = (SSLSocket) factory.createSocket(server, port);
SSLParameters sslParameters = new SSLParameters();
sslParameters.setAlgorithmConstraints(algorithmConstraints);
sslsocket.setSSLParameters(sslParameters);
sslSocket.startHandshake();
Предложения