관리하는 사이트로부터 SSL에 적용되는 암/복호화 알고리즘을 몇개 빼달라는 요청을 받았다. (SSL 적용된 Apache, Tomcat)

개발&테스트사이트 정도만 구축했던 상태라 이런 디테일한 부분은 알지 못하는데...

제외대상 Cipher명(일부) : DHE-RSA-AES128-GCM-SHA256, ....., ECDHE-RSA-AES256-GCM-SHA384

실제 적용방법은 간단하다.

Apache2.4.x ( conf.d/ssl.conf )

SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ALL:!DHE-RSA-AES128-GCM-SHA256:... :!ECDHE-RSA-AES256-GCM-SHA384:!RC4:HIGH:!MD5:!aNULL:!EDH

Tomcat8.x ( conf/server.xml )

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
    ... 중략 ...
     clientAuth="false" sslProtocol="TLS"
 ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
  TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,
  TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA"/>

하지만 이를 실제 테스트하기위한 과정이 만만치 않았다. 크게 3개의 과정으로 진행됨.

OpenSSL SSL인증서 발급 => Apache, Tomcat 설치 => 로그 및 Packet검사를 통한 적용사항 확인

1. OpenSSL 발급 ( 참고 : https://www.lesstif.com/pages/viewpage.action?pageId=6979614 )

참고한 블로그가 참 자세히 기술되어 있어 아무생각없이 그대로 따라함. 오호... 도메인만 test를 위한 임의 도메인으로 변경 (어차피 hosts 파일 수정해서 테스트할꺼임)

추가 : 위 링크를 통해 생성된 인증서는 아파치용이다. 이를 톰캣용으로 생성하는 과정은 아래와 같이 진행했다

openssl]# openssl pkcs12 -export -in /root/openssl/test-rootca.crt -inkey /root/openssl/private/test-rootca.key -out /root/openssl/tomcat/test.com.keystore -name tomcat 

 

2. Apache 및 Tomcat 설치

워낙 블로그나 참고자료가 많고, 또 개발/테스트를 위해 자주 설치하던거라 별 문제없이 패스.

apache는 yum으로 설치하고, Tomcat은 archive형태로 다운받아서 압출해제 형태로 설치완료.

하지만 여기서도 한가지 문제. 설치된 OS가 CentOS 7.0 이었고, 방화벽이 오픈되지 않아 또 구글링하여 방화벽 설정완료.

설정과정에서 처음 설정을 하다보니 시간이 오래 걸림. 특히 Apache의 ssl.conf에서 SSLCipherSuite 의 설정법을 어찌해야하는지 나와 있지 않아 느낌으로 설정. ㅎㅎㅎ(내가 봐도 참 개발자스럽지 못하다)

그중에서 처음 SSL 인증서 파일의 위치를 처음 생성한곳에 그대로 두고 진행했더니 apache가 이를 인식하지 못해 apache 설치디렉토리 내부로 옮김.
오류내용이

3. 로그확인

Apache 로그 확인을 위해서는 디폴트 설정에서 다음과 같이 변경해줘야한다.

Apache_home/conf.d/ssl.conf 설정내용

LogLevel debug
CustomLog logs/example.com-ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

정상적으로 설정이 되면 아파치 SSL요청로그는 아래와 같이 나온다.

logs/example.com-ssl_request_log내용 일부

[29/Oct/2018:08:28:00 -0700] 192.168.0.12 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 "GET / HTTP/1.1" 4897
[29/Oct/2018:08:28:00 -0700] 192.168.0.12 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 "GET /noindex/css/bootstrap.min.css HTTP/1.1" -
[29/Oct/2018:08:28:00 -0700] 192.168.0.12 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 "GET /noindex/css/open-sans.css HTTP/1.1" -
[29/Oct/2018:08:28:00 -0700] 192.168.0.12 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 "GET /images/apache_pb.gif HTTP/1.1" -

Tomcat로그를 위해서는 catalina.sh 파일의 JAVA_OPTS 부분에 -Djavax.net.debug=ssl을 추가한다.

변경된 catalina.sh 파일의 일부는 아래와 같다.

# Register custom URL handlers
# Do this here so custom URL handles (specifically 'war:...') can be used in the security policy
JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Djavax.net.debug=ssl"
# Set juli LogManager config file if it is present and an override has not been issued
if [ -z "$LOGGING_CONFIG" ]; then
... 생략 ... 

재시작 후 브라우져를 통해 호출하면 아래와 같은 로그를 확인할수 있다.

... 생략 ...
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
Compression Method: 0
Extension renegotiation_info, renegotiated_connection: <empty>
Extension extended_master_secret
***
Cipher suite:  TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
https-jsse-nio-8443-exec-10, WRITE: TLSv1.2 Application Data, length = 84
https-jsse-nio-8443-exec-7, READ: TLSv1.2 Change Cipher Spec, length = 1
https-jsse-nio-8443-exec-7, READ: TLSv1.2 Handshake, length = 96
*** Finished
verify_data:  { 192, 181, 216, 241, 42, 135, 60, 93, 75, 149, 214, 205 }
***
CONNECTION KEYGEN:
... 이하 생략... 

다른 테스트 방법을 더 알아봐야겠으나 1차적으로 Apache, Tomcat 모두 handshake과정에서 고객사에서 요구한 알고리즘을 사용하지 않고있는것을 확인할수 있다.

Apache_tomcat Connector에서 사용하는 Protocol종류는 3가지이다.

(참고 : https://tomcat.apache.org/tomcat-8.0-doc/ssl-howto.html )

<!-- Define a HTTP/1.1 Connector on port 8443, JSSE NIO implementation -->
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
           port="8443" .../>

<!-- Define a HTTP/1.1 Connector on port 8443, JSSE NIO2 implementation -->
<Connector protocol="org.apache.coyote.http11.Http11Nio2Protocol"
           port="8443" .../>

<!-- Define a HTTP/1.1 Connector on port 8443, JSSE BIO implementation -->
<Connector protocol="org.apache.coyote.http11.Http11Protocol"
           port="8443" .../>