SSLv3에서 푸들(Padding Oracle On Downloaded Legacy Encryption: Poodle) 취약점이 발견되었다. SSLv3가 시장에 나온지 15~18년정도가 되었고, 이미 SSL/TLS1.0 ~ 1.2까지 개선된 대체기술이 나왔으므로, SSLv3 지원 옵션을 끄라는 권장사항이 많다.
푸들 취약점에 간략하게 소개하면, TLS 상위 버전부터 서버와 연결을 시도해서 실패한 경우 클라이언트는 하위버전으로 계속 내려가면서 시도할 수 있다. 클라이언트(이 그림에서는 브라우저)가 TLS 1.2 ~ 1.0까지 계속된 실패로 SSLv3로 시도하게 되면 이 때 취약점을 이용해 개인 정보를 훔친다.
그 밖에
권장안에 따라, 서버에서 SSLv3 끈 경우 안드로이드 클라이언트가 SSLv3를 통해 핸드쉐이크를 시도할 때 아래와 같은 에러가 날 수 있다.
Caused by: javax.net.ssl.SSLHandshakeException: Handshake failed at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:374) at com.android.okhttp.Connection.upgradeToTls(Connection.java:1253) at com.android.okhttp.Connection.connect(Connection.java:1184) at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:395) at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:298) at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:399) at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:110) at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:221) at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218) at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:25) at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:248) at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:218) at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:110) at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:93) ... 1 more Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0xb82aeef8: Failure in SSL library, usually a protocol error error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:765 0xa334aba5:0x00000000) at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method) at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:302) ... 14 more
만약 위와 같은 문제를 볼 경우, SSLv3를 끄는 것은 서버 운영자로서 정상적인 선택이므로, 그 이전에 통신에 문제가 있던 것은 아닌지 확인해볼 필요가 있다.
참조
핑백: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0xb82aeef8: Failure in SSL library, usually a protocol error | Dog발자
핑백: HttpsUrlConnection의 TLS Intolerance Support | Dog발자
혹시 안드에서 해결할 수 있는 방법이 있나요? 저도 okhttp를 사용하는데 https에 접속하니 저런 에러가 나와서요.
안녕하세요,
저는 이글을 참고하여 해결하였습니다.
간략히 요약하면, 재시도 시에 SSLv3는 사용하지 않도록 하는 것입니다.
더 좋은 방법이 있다면 나중에 공유해주세요 🙂
답변 달아주셔서 감사합니다.
혹시 okhttp를 사용하셔서 해결 하셨다면?
ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
.tlsVersions(TlsVersion.TLS_1_2)
.cipherSuites(
CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256)
.build();
이코드가 처럼 작성하신건가요? 링크걸어주신건 httpurlconnection일떄일거 같고 okhttpo는 ConnetionSpec클래스로 만들어서 넣어주어야 할거 같은데 조언줌 해주시기 바랍니다.
저는 HttpURLConnection을 사용해서요 ^^; 아쉽게도 아직 okhttp는 사용해 본적이 없네요.