호스팅 업체를 통해 웹사이트 및 워드프레스 등을 운영한다면 대부분 SSL인증서 제공 또는 별도로 구매해도 설치 및 설정까지 별 어려움 없이 진행할 수 있는데요.
이 글에서는 자체 서버에서 톰캣을 통해 웹 서비스를 운영 중 SSL인증서 구매부터 톰캣에 적용까지 여러 차례 실패 후 성공한 내용과 방법을 담고 있습니다.
SSL인증서 하는 일과 필요성
SSL인증서는 웹사이트와 방문하는 사용자 간 데이터 통신 환경을 암호화하여 보안을 강화해주는 역할을 합니다.
웹사이트 운영자는 SSL인증서 설치 후 방문자에게 보다 나은 보안 환경을 제공하고, 사용자는 자신의 데이터를 안전하게 지킬 수 있게 됩니다.
사이트 운영자 입장에서는 SSL인증서 없이 운영하는 경우 사이트 접속 시 사용자에게 경고 페이지가 나오게 되며 이는 사이트 이탈률을 크게 올리는 결과를 초래합니다.
제일 중요한 SEO 요소적으로도 매우 안 좋게 평가되어 검색 엔진에서 사이트 검색 순위가 현저히 낮아지게 됩니다.
결과적으로 사이트 운영 시 필수사항이라고 할 수 있겠습니다.
제 경우에는 스프링 부트 기반의 서비스에서 사용하고 있는 제브라 웹 라벨 출력 모듈이 SSL 인증서가 없는 경우 출력이 되지 않아 구매 후 설치하게 되었습니다.(제브라 라벨 프린터 웹 출력 기능 구현 방법 게시물)
SSL인증서 구매 및 설정
무료로 SSL인증서 제공해 주는 사이트는 찾아보면 몇 개 있는데 유명한 ZeroSSL 사이트에서는 90일 기한의 인증서를 계정 당 총 3번 갱신하여 사용할 수 있고 이후로는 유료로 구매해야 합니다.
한도인 3번을 다 채우고 유료로 구매하려고 보니, 국내 호스팅 업체보다 많이 비싸서 결국은 카페24에서 구매하게 되었습니다.
여러 도메인에 적용하거나 한개의 도메인에 여러 서브도메인으로 서비스를 운영 중이라면 모를까 일반 사이트의 경우에는 가장 저렴한 ‘Positive 라이트’ 인증서만으로 충분하다 생각됩니다.
1. 구매 페이지 작성 정보
- 도메인 – 인증서 적용 도메인 주소를 3차 도메인까지 적어줍니다. (예) ech.info-gateway.com
- 회사명 – 도메인정보 확인 버튼을 클릭해서 나오는 Registrant Name 정보 작성
- 부서명 – 도메인정보 확인 버튼을 클릭해서 나오는 Registrant Organization 정보 작성
- 인증서 비밀번호 – 나중에 필요하게 되니 꼭 기억 해둬야 합니다.
- 도메인 소유권 인증 – 인증서 구매 후 도메인 실 소유주인지를 인증하는 방법 선택
- 소유자 이메일 인증 – 도메인정보 확인에서 나오는 ‘Registrant Email’ 주소로 인증 이메일을 수신하여 인증하는 방법
- HTTP 인증 – 제공되는 텍스트 파일을 운영중인 웹 사이트에 업로드하여 인증
- 네임서버 인증 – 도메인 설정에서 레코드값을 추가하여 인증
2. 도메인 소유권 인증 방법
여기서 도메인 소유권 인증 방법 선택을 잘해야 인증할 때 수월하게 할 수 있습니다.
도메인에 등록된 이메일 주소로 이메일을 수신할 수 있다면 가장 편리한 방법일 수 있습니다.
다음으로 HTTP 인증으로 SSL인증서 설치 할 웹 서비스에 구매 후 제공되는 txt 파일을 업로드하여 인증하는 방법입니다.
참고로 스프링 부트 기반 서비스의 경우 프로젝트 static 하위 폴더를 생성하고 txt 파일을 넣어 배포하면 인증할 수 있습니다.
네임서버 인증의 경우에는 위에서 열거한 두 가지 방식이 되지 않을 때 시도해 볼 수 있고, 도메인을 구입한 업체 또는 관리하고 있는 업체의 관리 페이지의 레코드 설정에서 제공되는 값을 추가하여 설정할 수 있습니다.
그러나 소유권 인증까지 시간이 조금 걸린다는 단점을 가지고 있습니다.
3. SSL인증서 파일 다운로드
도메인 소유권 인증이 완료되면 이제 SSL 인증서 파일을 다운로드할 수 있게 됩니다.
카페24 기준 나의서비스관리 -> 인증서관리 -> 인증서 받기 경로에서 확인할 수 있으며, 총 4개의 파일이 제공되며, 각 인증서 파일의 의미는 아래와 같습니다.
- ssl.key – 개인키
- ssl.crt – 인증서
- chain_ssl.crt – 중개자인증서
- chain_all_ssl.crt – 체인인증서
4. SSL인증서 파일 톰캣용 전환
여기서부터 제가 좀 고생했던 부분입니다. 기존 ZeroSSL에서 받은 인증서의 경우 별도의 변환 과정 없이 제공된 인증서 파일로 인증이 되었는데요.
카페24에서 구매한 인증서의 경우에는 톰캣용으로 전환이 필요했으며, 사전에 준비해야 될 유틸리티가 있습니다.
인증서 파일을 통합하고 생성하는데 사용되는 OpenSSL과 자바 jdk에서 제공되는 keytool이 필요합니다.
각각 설치 후 명령프롬프트에서 작업을 수월하기 위해 시스템 환경 변수 Path에 등록해 놓는 게 좋아요.
인증서 파일은 한 폴더에 모아둔 후 작업해 주세요.
- 명령 프롬프트(cmd) 실행 후 인증서가 위치한 폴더 이동
- 아래 명령어를 이용하여 인증서와 키를 PKCS#12 형식의 .pfx 파일로 변환합니다.
- openssl pkcs12 -inkey ssl.key -in ssl.crt -certfile chain_ssl.crt -export -out ssl.pfx -name “패스워드”
- ssl.key와 ssl.crt, chain_ssl.crt 파일명은 가지고 기존 인증서 파일명으로 작성합니다.
- ssl.pfx 부분은 생성될 파일명 그리고 마지막 “패스워드” 부분은 사용할 패스워드를 기입합니다.
이 작업을 통해 인증서(ssl.crt), 개인 키(ssl.key) 그리고 중개자 인증서(chain_ssl.srt)를 사용해 하나의 pfx파일로 병합하였습니다.
이 pfx파일은 윈도우 서버나 일부 Java 환경 등에서 SSL인증서 설정 시 사용됩니다.
이어서 keytool 명령어를 이용해 jks 파일 추출 작업을 진행합니다.
- keytool -importkeystore -srckeystore ssl.pfx -srcstoretype pkcs12 -destkeystore ssl.jks -deststoretype jks -alias “패스워드”
위 명령어를 실행하면 jks 파일이 생성됩니다.
이 jks 파일은 자바 환경(톰캣 또는 스프링 부트)에서 SSL/TLS 인증서를 관리하기 위해 사용되는 표준키 저장소 형식을 말합니다.
톰캣 SSL인증서 설치 방법
톰캣에 SSL인증서를 설정하는 부분에서 제일 애먹었던 부분 중 하나입니다.
기본적으로 server.xml 파일에 SSL인증서 파일에 관한 정보를 입력해야 하는데요.
https 프로토콜에 사용되는 443 포트 관련 설정 부분을 보셔야 합니다.
아래는 443 port 설정에 관해 기본값으로 설정되어 있는 코드입니다.
<!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
This connector uses the NIO implementation. The default
SSLImplementation will depend on the presence of the APR/native
library and the useOpenSSL attribute of the AprLifecycleListener.
Either JSSE or OpenSSL style configuration may be used regardless of
the SSLImplementation selected. JSSE style configuration is used below.
-->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true"
maxParameterCount="1000"
>
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
certificateKeystorePassword="changeit" type="RSA" />
</SSLHostConfig>
</Connector>
-->
기본적으로 주석처리되어 있고, 주석을 해제하여 사용하면 됩니다.
포트 번호가 8443인 것은 보안을 위해 기본 포트인 443을 사용하지 않고 8443으로 작성한것이며, 8443으로 사용할 경우 웹 브라우저에서 도메인 주소 끝에 콜론(:)과 함께 포트 번호를 붙여줘야 합니다.
- 예시) ech.info-gateway.com:8443
SSL인증서 설치 적용을 위해 인터넷 검색을 해보면 거의 동일하게 아래와 같은 설정을 하라고 나옵니다.
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true" maxThreads="200"
scheme="https" secure="true"
keystoreFile="D:\apache-tomcat-10.1.16\cert\tomcat.jks"
keystorePass="인증서 패스워드"
keystoreType="JKS"
sslProtocol="TLS"/>
또는 아래와 같은 방법도 나오게 됩니다.
<Connector port="443"
protocol="HTTP/1.1"
SSLEnabled="true"
maxThreds="150"
scheme="https"
secure="true"
clientAuth="false"
keystoreFile="D:\apache-tomcat-10.1.16\cert\ssl.jks"
keystorePass="인증서 패스워드"
sslEnabledProtocols="TLSv1.1,TLSv1.2"
ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
,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"
처음에 위 두 가지 경우 설정으로 모두 해보았으나 전혀 인증이 되지 않았습니다. 뭐가 잘못된 건지 찾아본 끝에 톰캣 10 버전을 사용하는 경우에는 위 방법이 아닌 아래의 방법을 참고하여 설정해야 정상적으로 SSL인증서가 로드됩니다.
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="200" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="D:\apache-tomcat-10.1.16\cert\ssl.jks"
type="RSA" certificateKeystorePassword="인증서 패스워드" />
</SSLHostConfig>
</Connector>
<connector> 태그에 인증서 정보를 넣는 것이 아닌 하위에 <SSLHostConfig>를 작성하고 다시 그 하위에 인증서 정보를 입력해 주셔야 합니다.
SSL인증서 결론
이번에 SSL인증서 설치 적용 작업을 진행하면서 내가 사용되는 톰캣의 버전에 따라 설정하는 방법도 달라진다는 것을 알게 되었습니다.
기존 ZeroSSL의 경우 openssl을 이용해 별도로 jks 파일을 만들지 않고, 아래와 같이 별도 인증서 파일을 적용해도 정상적으로 인증이 되었으나, 카페24 SSL인증서 경우에는 개별적으로 server.xml에 등록하면 인증서 적용이 되지 않으며, jks 파일로 통합하는 과정이 필요했습니다.
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true" maxThreads="200"
scheme="https" secure="true">
<SSLHostConfig>
<Certificate certificateKeyFile="D:\apache-tomcat-10.1.16\cert\ssl.key"
certificateFile="D:\apache-tomcat-10.1.16\cert\ssl.crt"
certificateChainFile="D:\apache-tomcat-10.1.16\cert\chain_all_ssl.crt"
type="RSA" />
</SSLHostConfig>
</Connector>
아마 인증서 종류에 따라 적용하는 방법에 조금씩 차이가 있는 것으로 보이는데요. 위 방법으로 되지 않을 경우에는 위의 코드처럼 인증서 관련 파일을 개별로 등록해서 시도해 보시기 바랍니다.