자체 서명 된 인증서로 서버에 연결하려고합니다. 이 코드를 사용하여 모든 인증서를 수락합니다.인증서의 호스트 이름이 일치하지 않습니다?
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;
}
}
그러나 그럼에도 불구하고 나는 다음과 같은 오류 얻을 :
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)
내 인증 코드가 실행되어 있는지 확인 해요, 그래서 무슨 문제가 될 수 있을까?
문제는 trustmanager와 관련이 없습니다. 호스트 이름 확인은 히트하려는 서버의 인증서에 정의 된 이름 (서버의 도메인 일명 호스트 이름이어야 함)에 대해 요청한 URL의 도메인을 확인하는 별도의 보안 단계입니다. 귀하의 경우, 사용중인 URL의 이름과 서버 인증서의 이름이 일치하지 않습니다. –