Próbuję połączyć się z serwerem za pomocą certyfikatu z podpisem własnym. Używam tego kodu do akceptowania wszystkich certyfikatów.Nazwa hosta w certyfikacie nie jest zgodna?
public class CertificateAcceptor {
public void initializeTrustManager() {
try {
SSLContext context = SSLContext.getInstance("SSL");
context.init(null, createTrustManager(), new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
}
private TrustManager[] createTrustManager() {
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
// leave blank to trust all clients
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
// leave blank to trust all servers
for (X509Certificate c : chain) {
System.out.println(c.toString());
}
}
}
};
return trustAllCerts;
}
}
Niemniej jednak pojawia się następujący błąd:
javax.net.ssl.SSLException: hostname in certificate didn't match: <xyz.ch> != <localhost>
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:220)
at org.apache.http.conn.ssl.BrowserCompatHostnameVerifier.verify(BrowserCompatHostnameVerifier.java:54)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:149)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:130)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:339)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:123)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:147)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:108)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:576)
Jestem pewien, że mój kod certyfikatu jest wykonywana, więc co może być problemem?
Problem nie dotyczy menedżera zaufania. Weryfikacja nazwy hosta jest oddzielnym krokiem zabezpieczającym, który sprawdza domenę żądanego adresu URL pod nazwą (powinna to być nazwa domeny nazwa hosta serwera) zdefiniowana w certyfikacie serwera, który próbujesz trafić. W twoim przypadku nazwa w adresie URL, którego używasz, i nazwa w certyfikacie serwera nie są zgodne. –