관리하는 사이트로부터 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" .../>

 

 



기본적으로 윈도우용 아파치를 구하기가 쉽지 않다.

아래 사이트에서 아파치와 톰캣연동을 위한 mod_jk를 구한다.

 

64비트용으로 다운받음

https://www.apachelounge.com/download/win64/

 

Apache2.x 를 설치한다.

다운받은 아파치를 적당한위치에 풀고 압축을 해제한다.

윈도우 서비스에 등록한다. : 서비스하지 않고 테스트용이라면 무시

 

~bin> httpd -k install

 

설치하려는 아파치가 2개이상이거나 별도의 서비스이름으로 서비스등록하고자 하다면  -n <service_name> 을 추가한다.

apache_2.4_server 라는 service 이름으로 등록하고자 한다면

~bin> httpd -k install -n apache_2.4_server

와 같이 입력한다.

 

기본 아파치가 설정정보에서 경로정도만 변경한다.

 

--------------------------  httpd.conf ----------------------------

 

 - ServerRoot "C:/ADMIN_UIS/Server/Apache24"

 - Listen 80

 - ServerName admin.domain.com:80

 - <Directory "C:/Server/Apache24/htdocs">

 - ScriptAlias /cgi-bin/ "C:/Server/Apache24/cgi-bin/"

 - <Directory "c:/Server/Apache24/cgi-bin">


#####  MOD_JK 설정 추가 ####
LoadModule jk_module modules/mod_jk.so
<IfModule mod_jk.c>
  JkWorkersFile conf/workers.properties
  JkLogFile logs/mod_jk.log
  JkLogLevel info
</IfModule>

 

#vhost는 미사용이므로 일단 주석처리

 

 

------------------------------  workers.properties ---------------------------------

worker.list=tomcat_admin
worker.tomcat_admin.type=ajp13
worker.tomcat_admin.host=admin.domain.com
worker.tomcat_admin.port=8009

 

------------------------------  uriwokermap.properties ----------------------------

/*=tomcat_admin

 

https를 적용하기 위한 처리

 

------------------------------ httpd-ssl.conf  -----------------------------

Listen 443
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5

SSLPassPhraseDialog  builtin


SSLSessionCache none
SSLSessionCacheTimeout  300

<VirtualHost *:443>

#   General setup for the virtual host
DocumentRoot "C:/Server/Apache24/htdocs"
ServerName admin.domain.com:443
ServerAdmin admin@domain.com
ErrorLog "logs/error.log"
TransferLog "logs/access.log"

#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine on

SSLCertificateKeyFile "conf/cerFiles/key.pem"
SSLCertificateFile "conf/cerFiles/cert.pem"
SSLCertificateChainFile "conf/cerFiles/caChain.pem"
SSLCACertificateFile "conf/cerFiles/ca.pem"

 

#<FilesMatch "\.(cgi|shtml|phtml|php)$">
#    SSLOptions +StdEnvVars
#</FilesMatch>
<Directory "c:/Server/Apache24/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

BrowserMatch "MSIE [2-5]" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

#   Per-Server Logging:
#   The home of a custom SSL log file. Use this when you want a
#   compact non-error SSL logfile on a virtual host basis.
CustomLog "logs/ssl_request.log" \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

</VirtualHost>                                 

 

 

 



Nexus를 사용하기 위해 공유기에서 외부로 포트포워딩을 설정하여 사용해 왔습니다. 

그러다가 Redmine이 도입되고 각각의 포트포워딩보단 하나로 합쳐야할 필요가 생겼습니다.

Nexus를 설치하는 방법은 두가지입니다.

첫째는 jetty를 포함한 설치, 두번째는 war 형태의 프로젝트로 기존 설치된 was에 추가하는 방법.

저는 첫번째 jetty를 포함한 설치로 진행했습니다.


1. Redmine ==> /

2. SVN    ==> /svn

3. Nexus  ==> /nexus


설정 및 연동해야할 부분은 위와 같습니다.


이렇게 되면 공유기 포트포워딩은 하나만 설정해도 끝납니다.


1. Redmine설치 및 SVN 연동에 대한 부분은 이전 포스팅을 참고하면 됩니다.


==> http://gubok.tistory.com/351

 ==> http://gubok.tistory.com/352

 ==> http://gubok.tistory.com/370



2. Nexus 연동

우선 nexus설치는 특별한 이상이 없는한 한번에 설치가 끝나기 때문에 이에 대한 설명은 Pass~

apache-jetty 연동방법은 크게 세가지가 있습니다. (jetty wiki 사이트에 나왔있습니다.)


1. Using Apache mod_proxy and an normal Jetty HTTP connector. 

2. Using Apache mod_proxy_ajp and the Jetty AJP connector. 

3. Using Apache mod_jk and the Jetty AJP connector. 


이중에서 첫번째 proxy를 이용한 연동방법으로 설정하도록 하겠습니다. (권장이라고 하네요.)

아래 링크는 apache 사이트에서 제공하는 mod_proxy 설정방법입니다.
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html



1번의 과정을 정상적으로 거쳤다면 연동에 필요한 xxx.so 파일은 모두 로딩되어 있다는 전제로 진행합니다.


Proxy설정을 별도의 파일로 저장해서 생성합니다.


ProxyPass /nexus http://127.0.0.1:8787/nexus

ProxyRequests On

ProxyVia On


<Proxy *>

 Order deny,allow

 Allow from all

</Proxy>


ProxyPreserveHost On

ProxyStatus On


httpd.conf 에 위의 설정파일을 include해줍니다.


# Proxy Setting for Jetty

Include conf/extra/httpd-proxy-jetty.conf



/nexus로 들어오는 요청을 :8787/nexus로 처리하겠다는 의미입니다.






« PREV : 1 : 2 : 3 : NEXT »