10.

결론이 JDK 업그레이드라는 식으로 허무하게 나면 안되지!

실제 서비스 중인 상용 서버에서 업그레이드를 쉽게 할 수 있는 상황도 아니고.


그래서,

Windows 10에서는 TLS 통신에 EC, ECDHE, ECDH 알고리즘만 사용한단 말인가? 진짜로?

라는 의문에 집중해 봤다.


>> 참고: https://docs.microsoft.com/en-us/windows/desktop/secauthn/tls-cipher-suites-in-windows-10-v1709


위 글을 보면 Windows 10에서는 지원되는 TLS 중 높은 버전부터 먼저 적용된다는 얘기가 있는데,

그렇다면 우선 TLS 1.2가 지원되니까, 위 지원 목록을 보면 TLS 1.2 관련 알고리즘 중에 ECDHE 말고도

RSA, DHE 등도 포함이 되어 있는데 어째서 동작하지 않는 것일까?

무조건 EC, ECDHE, ECDH 알고리즘이 필수적으로 사용되는 것일까? 설마 그런 것은 아니겠지...

그럼, JDK 또는 Tomcat에서 지원하는 것과 일치하는 알고리즘 목록이 있긴 있겠지?


그런 생각에서, 

먼저, Windows 10 1709버전 TLS 지원 알고리즘 목록을 살펴 봤다.

SCH_USE_STRONG_CRYPTO 플래그가 설정된 TLS 1.2 지원 목록 중에서 EC, ECDH, ECDHE가 없는 것들을.
(Windows 10 1507 버전부터 SCH_USE_STRONG_CRYPTO 플래그가 설정되었다.
보안에 취약한 알고리즘 사용을 금지하는 옵션 정도로 이해하면 되겠다.)

그 중에서 Windows 7 목록에도 동일하게 있는 놈들로만 대략 추려봤더니 이 정도 나왔다.


// DHE-RSA w/ AES-GCM
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256

// DHE-RSA w/ AES-CBC
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
TLS_DHE_RSA_WITH_AES_128_CBC_SHA

// DHE-DSS w/ AES-CBC
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
TLS_DHE_DSS_WITH_AES_256_CBC_SHA
TLS_DHE_DSS_WITH_AES_128_CBC_SHA

// DHE-DSS w/ 3DES-EDE-CBC
TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA

// RSA w/ AES-GCM
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_GCM_SHA256

// RSA w/ AES-CBC
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA

// RSA w/ 3DES-EDE-CBC
TLS_RSA_WITH_3DES_EDE_CBC_SHA

위 목록을 알고리즘 유형별로 구체적으로 살펴 보자면

- 키(비대칭키) 암호화 알고리즘: DHE-RSA, DHE-DSS, RSA
- 대칭키 암호화 알고리즘: AES 256/128 및 3DES_EDE
- 패딩: GCM, CBC
- 서명 알고리즘: SHA 384/256/128

(이거 추려내느라 엄청 고생했다. 눈 빠지는 줄...)


이상의 목록을 JDK java.security에서 기본 지원하는 jdk.tls.legacyAlgorithms 목록과 비교해 보니

일치하는 것이 하나도 없다. 그러니 정상 접속이 되지 않았던 것.

이제야 Windows 10에서 접속이 되지 않았던 이유를 알았다.
(그런데... Windows 7에서도 역시 일치하는 목록이 없는데 왜 정상 접속이 되는 것인지 모르겠다.
Windows 7에서는 혹시 취약한 알고리즘도 사용되는 건가?
"_EXPORT"라고 정의된 설정이 뭔가 관련이 있을 것 같긴 한데... 알 수가 없다.
)



11.

다음으로, Tomcat 7 버전에서 지원되는 TLS 알고리즘 목록을 찾아 봤다.

역시 그 중에서 EC, ECDHE, ECDH가 없는 놈으로 추려냈다.


>> 참조: https://support.comodo.com/index.php?/Knowledgebase/Article/View/659/17/how-to----disable-weak-ciphers-in-tomcat-7--8


// DHE-DSS w/ AES-GCM
TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
TLS_DHE_DSS_WITH_AES_128_GCM_SHA256

// DHE-DSS w/ AES-CBC
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
TLS_DHE_DSS_WITH_AES_256_CBC_SHA
TLS_DHE_DSS_WITH_AES_128_CBC_SHA

// RSA w/ AES-GCM
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_GCM_SHA256

(헐... 몇 개 안된다.)


이 목록과 위에서 추린 Windows 10 목록의 교집합이 

실제 Windows 10에서 Tomcat 7 서버로 요청했을 때 정상 접속이 되는 알고리즘 목록일 것이다.


바로 이것들!


// DHE-DSS w/ AES-CBC
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
TLS_DHE_DSS_WITH_AES_256_CBC_SHA
TLS_DHE_DSS_WITH_AES_128_CBC_SHA

// RSA w/ AES-GCM
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_GCM_SHA256

(ECDHE 빼고 나니 6개 밖에 안된다!)


이것을 Tomcat의 server.xml에 있는 SSL Connector의 ciphers 속성에다 넣어봤다.

물론 java.security의 jdk.tls.disabledAlgorithms에는 여전히 EC, ECDHE, ECDH가 포함된 채로.


<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
                keystoreFile="/home/user/sslkeystore/keystore" keystorePass="password"
               clientAuth="false" sslProtocol="TLS" sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2"
               ciphers="TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,
TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_AES_256_GCM_SHA384,
TLS_RSA_WITH_AES_128_GCM_SHA256" />

(실제로는 Windows 10 지원 알고리즘 목록을 통째로 다 넣어줘도 된다. 그 중에서 Tomcat이 알아서
지원되는 알고리즘만 골라서 사용한다. 지원되는 것이 하나도 없으면 아래와 같이 경고가 뜬다.)

12월 19, 2018 8:49:04 오전 org.apache.tomcat.util.net.jsse.JSSESocketFactory getEnableableCiphers
경고: None of the ciphers specified are supported by the SSL engine : TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_DH_DSS_WITH_AES_256_CBCSHA256, TLS_DH_RSA_WITH_AES_256_CBCSHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, TLS_DH_anon_WITH_AES_256_CBC_SHA256



아무튼 이렇게 써 넣고 서비스 재시작.

...

...

...



오오오오오오오!



정상 동작한다!

이거다! 제대로 된 해결 방법이란 바로.



수정 결론: 

Windows 10에서 지원하는 TLS 알고리즘 중에서 ECDHE가 아닌 것들, 

즉, DHE와 RSA 목록을 명시적으로 ciphers 목록에 적어주면 제대로 동작한다.

JDK를 업그레이드하기 어려운 환경이라면 이렇게도 해결이 가능하다! (단, 박터짐 주의^^;;)





Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]