TLS / SSL 소개 및 Tomcat 에 HTTPS 적용하는 방법

TLS / SSL 소개

  • TLS : Transport Layer Security
  • SSL : Secure Sockets Layer
  • 웹 브라우저와 웹 서버 간의 통신을 안전하게 보장하는 기술이다.
  • 데이터를 보낼 때 데이터를 암호화하고, 데이터를 받을 때 암호화된 데이터를 복호화 하는 식의 기본 구조를 갖는다.
  • 이 통신 구조는 양방향 이기 떄문에, 웹 브라우저와 웹 서버 모두 데이터를 내보낼 때 암호화를 진행한다.

TLS / SSL 인증

  • 웹 브라우저에서 암호화된 연결로 웹 서버와 통신하려고 하면, 웹 서버에서 브라우저에게 몇가지 증명서(Certificate)를 요구한다.
  • 이 증명서는 클라이언트 인증 (Client Authentication) 이라고 하며, 개인 사용자 간 보다는 B2B 형태에서 더 많이 사용된다.
  • 대부분의 SSL-enabled 웹 서버 는 클라이언트 인증을 요구하지 않는다.

Certicates 인증서

  • SSL 를 구현하려면 웹 서버에 Certificate이 있어야 하는데, 이 Certificate 은 암호화된 연결을 수용하는 외부 인터페이스를 보장해준다.
  • 이러한 SSL 설계 방식은 “서버에서 어떤 형태로든 내가 생각했던 상대방이 맞다” 라는 것을 서버에서 증명하는 것이다

따라서, Certificate 을 해당 인터넷 주소에 대한 Digital Passport 로 볼 수 있다.

  • Certificate 은 암호화되어 발급되는데, 최초 발급자 말고는 사실 발급하기가 매우 힘들다.
  • 방문자 브라우저에서 해당 사이트를 접근하면 보통 경고가 뜨는데, 이때 Certificate Authorities 라는 신뢰되는 3rd 파티에 서명하면 경고가 뜨지 않는다.
  • Java 에서는 상대적으로 단순한 keytool 커맨드라인 툴을 제공하고, 명령어로 self-signed Certificate 을 생성할 수 있다.
  • Self-signed Certificates 는 사용자가 간단하게 생성한 인증서이기 때문에 테스트 시나리오에 적합하고, 실제 상용제품에는 적합하지 않다.

SSL 구동시 팁

  • SSL 로 웹 사이트를 구성할 때는 모든 사이트 자원들울 SSL 로 제공해야 한다. 이렇게 하면 해커들이 자바스크립트 파일 등에 악성 컨텐츠를 넣을 수가 없어 보안을 우회할 수가 없다.
  • 웹 사이트의 보안을 강화하고 싶으면 HSTS header 를 사용하는 것도 고려해봐야 한다.
    • HSTS header : 브라우저에서 항상 HTTPS 통신으로 사이트를 접근하게 한다.

Tomcat 에서 인증서 설정하기

Certificate Keystore 준비하기

  • Tomcat 에서 수용하는 keystore 타입은 JKS, PKCS11 또는 PKCS12.
    • JKS : Java 표준 키스토어 형식. JDK 에 포함된 keytool 커맨드 라인툴로 생성 가능
    • PKCS12 : 인터넷 표준 형식. Open SSL 이나 Microsoft Key-Manager 로 조작 가능
  • keystore 의 목록들은 alias 의 문자열 값으로 구분할 수 있다. 대부분은 대소문자 구분을 하지 않지만, PKCS11 형식은 대소문자 구분을 한다.

  • OpenSSL 을 이용하여 당신의 CA로 서명된 Certificate 을 PKCS12 keystore 에 임포트하려면 아래 명령어를 사용한다.
    openssl pkcs12 -export -in mycert.crt -inkey mykey.key
    -out mycert.p12 -name tomcat -CAfile myCA.crt
    -caname root -chain
    
  • JKS keystore 를 새로 생성하려면 아래 명령어를 커맨드창에서 실행한다.
    Windows:
    "%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA
    
    Unix:
    $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA
    
  1. 위 명령어의 결과는 실행한 위치의 홈 디렉토리 아래에 .keystore 라는 이름의 새로운 파일을 생성한다.
  2. 만약 다른 위치나 파일이름을 지정하고 싶으면, -keystore 변수를 사용한다. (변경된 위치 또한 server.xml 에 반영해줘야 함)
    Windows:
    "%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA
    -keystore \path\to\my\keystore
    
    Unix:
    $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA
    -keystore /path/to/my/keystore
    
  3. 위 명령어를 실행하면 비밀번호를 입력하라는 창이 나오는 데 default 값은 changeit 으로 되어 있다. 원하는 비밀번호로 변경이 가능하고, 이 또한 server.xml 에 반영해줘야 한다.

  4. 비밀번호를 입력하고 나면, 회사 / 이름 등에 대한 일반적인 정보를 입력하라고 한다. 이 정보는 이후 사용자가 암호화된 페이지 접근시에 표시된다.
  5. 마지막으로, 인증서(Certificate) 에 대한 key password 를 입력한다. 별도로 비밀번호를 입력하지 않고 엔터를 치면 위 1번에서 사용한 keystore 의 암호와 동일하게 입력된다.

Tomcat Configuration 파일 변경하기

  • 톰캣은 SSL 통신 구현방법에는 JSSE, APR 2가지가 있다.
    • JSSE : Java 런타임에서 제공.
    • APR : OpenSSL 엔진을 기본값으로 사용.
  • 여기서 JSSE connector 를 정의하는 방법은

1

2

  • APR 을 사용하려면

3

  • Configuration 을 위한 최종 단계는 $CATALINA_BASE/conf/server.xmlConnector 를 설정하는 것이다.

4

  • 위 절차를 모두 마치면 브라우저에서 https://localhost:8443/ 를 입력했을 때 Tomcat 기본페이지를 볼 수 있다.