본문 바로가기

카테고리 없음

[Android] HostnameVerifier에 대한 Warning이 떴을 경우

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

구글 플레이에 앱을 등록할 때 아래와 같은 보안 알림을 받을 수도 있다.

이것이 무엇인가??



HostnameVerifier를 안전하게 사용하고 있지 않다는 건데 

혹시 소스가 아래와 같은 형태로 되어 있지 않나 확인해보자.



try {
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
X509Certificate[] myTrustedAnchors = new X509Certificate[0];
return myTrustedAnchors;
}

@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}

@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}};

SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
});
} catch (Exception e) {
}

위 소스에서 setDefaultHostnameVerifier 부분이 문제 이다.

어떤 hostname이든 승인을 시켜주는 형태 이기 때문이다.


이것을 안전하게 변경 시키기 위해서 특정 hostname만 승인을 해주는 형태가 아래와 같다.


HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession arg1) {
        if (hostname.equalsIgnoreCase("api.my.com") || 
            hostname.equalsIgnoreCase("api.crashlytics.com") || 
            hostname.equalsIgnoreCase("settings.crashlytics.com")) {
            return true;
        } else {
            return false;
        }
    }
});

https://stackoverflow.com/a/41393328


원래 setDefaultHostnameVerifier를 수정하지 않고 정상적인 동작이 이뤄져야 한다.

위 소스 자체를 삭제하고 정상적으로 동작 한다면 그게 맞는 것이다.


만약 그대로 안된다면 위 내용을 참조하자.


아래 내용은 메일로 함께 온 내용이다.


2017년 3월 1일 부러 HostnameVerifier를 강화 한다는 내용이다.

참고하기 바란다.