Tomcat crt 인증서 적용 - Tomcat crt injeungseo jeog-yong

Apache Http Server 나 Nginx 에서 사용하던 인증서를 Tomcat 에서 사용하려고 보니 바로 적용이 안되군요...
(pkcs12 형식으로 변환이 필요)

./chainca.crt
./mydomain.com.crt
./mydomain.com.key

위와 같이 체인인증서와 ROOT 인증서가 합쳐저 있는 chainca.crt 와 도메인의 인증서가 있는 mydomain.com.crt 를 하나의 파일로 합쳐 줍니다.

$ cat mydomain.com.crt chainca.crt > mydomain.com.chainca.crt

openssl 을 이용하여 pkcs12 형식으로 변환합니다.

$ openssl pkcs12 -export -in mydomain.com.chainca.crt -inkey mydomain.com.key -out mydomain.com.p12 -name tomcat
Enter Export Password: (key 파일 암호입력)
Verifying – Enter Export Password: (key 파일 암호입력)

정상적으로 변환을 확인하려면 아래 명령어를 이용합니다.

$ keytool -list -v -keystore mydomain.com.p12 -storetype pkcs12

$CATALINA_HOME/conf/server.xml

아래와 같이 커넥터를 추가합니다.

<Connector port="{SSL포트}" maxHttpHeaderSize="8192"
           maxThreads="150" enableLookups="false" acceptCount="100"
           connectionTimeout="20000" disableUploadTimeout="true"
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS"
           keystoreFile="{인증서 경로}"
           keystoreType="PKCS12" keystorePass="{인증서 패스워드}"/>

해당 포트로 정상적으로 접근하면 설정 완료입니다.

참고자료

  • https://idchowto.com/?p=13523
  • https://www.qtrustssl.com/board/view.php?code=faq&cat=&sq=27&page=1&s_fld=&s_txt=

사전 구성 환경

  • Java JDK or JRE http://www.java.com/ (Java 7 버전 이상, TLS 1.2 지원 필수)
  • TLS 1.2 / SHA-2(sha256RSA) 암호화 지원 모듈 구성/활성 확인 필수
  • SNI(Server Name Indication, 서버 이름 표시) 기능 지원하는 웹서버 버전 권장 (443공용)
  • MD5, RC4 등 국제 보안 기구에서 해제를 권장하는 취약한 암호화 모듈 비활성화
  • SSL 2.0, 3.0 및 TLS 1.0 1.1 프로토콜 접속 허용 해제. 최신 TLS 1.2 1.3 설정 권장

진행 과정

  1. 키스토어 생성
  2. CSR(Certificate Signing Request) 생성
  3. 인증서 발급 신청 제출
  4. 인증서 발급 완료 (발급내역서/파일설명서 PDF 참조)
  5. 인증서 설치 적용 - 신규,갱신,재발급,도메인추가
  6. 서버 정상 적용 완료 테스트
  7. 웹페이지에 https:// 링크 적용

키스토어 생성 예제

- SSL 인증서 발급 신청서 작성시, CSR 입력 단계에서 "CSR 자동생성" 선택시 현재 과정은 필요 없습니다. (권장)
- CSR 자동생성 발급 완료시, "개인키, 서버인증서, 체인인증서, 루트인증서" 의 pem, pfx, jks, p7b 파일이 포함되어 있습니다.
- FAQ : 개인키(private key) 생성/보관 관련 참고 사항

keytool -genkey -keyalg RSA -sigalg SHA256withRSA -alias SecureSign -keysize 2048 -keystore sslcert.co.kr.jks

  • -keyalg : 키알고리즘으로 RSA 을 지정합니다
  • -sigalg : 서명알고리즘으로 SHA256 을 지정합니다.
  • -alias : 대체 이름으로 영문 단어를 지정하며, 특수문자등은 사용하지 않아야 합니다.
  • -keystore : 개인키 파일
  • (예제에 사용된 옵션 값 등은 예제용이므로, 실제 해당 도메인 정보로 지정하시기 바랍니다)
    (keytool 에 대한 상세 사용법 설명은 자체 매뉴얼을 참조 바랍니다 - SecureSign 에서 설명불가)

Single

CN : sub.example.com 처럼 FQDN 도메인 형식 이어야 합니다.

Wildcard

CN : *.example.com 과 같은 패턴 이어야 합니다.

MultiDomain

CN : example.com 대표성을 가진 FQDN 도메인 1개만 입력 합니다.
SAN : 인증서에 포함될 나머지 FQDN 도메인은, 신청서 작성중 DCV 설정 단계에서 추가 입력합니다.

Multi-Wildcard

CN : example.com 대표 루트 도메인 1개을 CN으로 입력 합니다.
SAN : *.example.com 형식의 와일드카드 도메인은, 신청서 작성중 DCV 설정 단계에서 추가 입력합니다.

Result

keystore 암호를 입력하십시오: (6자이상)
새 암호를 다시 입력하십시오:
이름과 성을 입력하십시오. (인증서 도메인 입력)
[Unknown]: www.securesign.kr
조직 단위 이름을 입력하십시오.
[Unknown]: DevTeam
조직 이름을 입력하십시오.
[Unknown]: SecureSignKR
구/군/시 이름을 입력하십시오?
[Unknown]: Gangnam-gu
시/도 이름을 입력하십시오.
[Unknown]: Seoul
이 조직의 두 자리 국가 코드를 입력하십시오. (대문자)
[Unknown]: KR
CN=www.securesign.kr, OU=DevTeam, O=SecureSignKR, L=Gangnam-gu, ST=Seoul, C=KR(가) 맞습니까?
[아니오]: y

<SecureSign> (alias명)
에 대한 키 암호를 입력하십시오. enter (keystore 암호와 key 암호는 동일하게 설정 권장)
(keystore 암호와 같은 경우 Enter를 누르십시오):

CSR(Certificate Signing Request) 생성 예

- SSL 인증서 발급 신청서 작성시, CSR 입력 단계에서 "CSR 자동생성" 선택시 현재 과정은 필요 없습니다. (권장)
- FAQ : SSL 발급 신청시 CSR 생성 관련 참고 사항
- FAQ : SSL 발급 신청시 도메인 형식 예제 및 참고 사항

keytool -certreq -alias SecureSign -keyalg RSA -sigalg SHA256withRSA -file SecureSign.csr -keystore sslcert.co.kr.jks

  • -keyalg : 키알고리즘으로 RSA 을 지정합니다
  • -sigalg : 서명알고리즘으로 SHA256 을 지정합니다.
  • -alias : 대체 이름으로 영문 단어를 지정하며, 특수문자등은 사용하지 않아야 합니다.
  • -keystore : 개인키 파일
  • -file : CSR 저장할 파일

Result

keystore 암호를 입력하십시오: enter

생성된 CSR 예제

- SSL 인증서 발급 신청서 작성시, CSR 입력 단계에서 "CSR 자동생성" 선택시 현재 과정은 필요 없습니다. (권장)

-----BEGIN CERTIFICATE REQUEST-----
MIIC5TCCAc0CAQAwgZ8xCzAJBgNVBAYTAktSMQ4wDAYDVQQIEwVTZW91bDERMA8G
A1UEBxMIR2FuZy1uYW0xGDAWBgNVBAoTD1NlY3VyZUxheWVyIEluYzERMA8GA1UE
-- 중략 --
wxd+87gwsvAC2dyK8I4N1ttXDRJcDPCDe1BGqWvYYAZN7FbvnbHCM7y/SN++pxbS
jbnkoe8uStQvfCo6DW5MZHUli5+lRU/UpA==
-----END CERTIFICATE REQUEST-----

앞서 생성한 CSR 파일은 Base64 포맷의 PEM Text 이며, 텍스트 편집기를 이용하여 파일을 오픈합니다. -----BEGIN ~ REQUEST----- 까지 포함하여 내용 전체를 복사하여 신청서에 입력합니다. (----- 를 누락하거나, 새로운 빈출이 추가되지 않도록 주의하세요)

SSL 발급 신청

  • GoGetSSL Domain (Sectigo) (₩ 7,000)
  • Sectigo PositiveSSL (₩ 9,000) ▶ ₩ 7,000. 22% 할인 프로모션 진행중. 자세히보기
  • Sectigo PositiveSSL Wildcard (₩ 120,000)
  • Sectigo PositiveSSL Multi-Domain (₩ 49,000)
  • RapidSSL Standard (DigiCert) (₩ 24,000)
  • 최저가 SSL 인증서 타입 분류별 전체 보기

인증서 발급 완료 및 참고 사항

- 발급 완료 후에는, 메일첨부 또는 주문상세의 압축파일(zip)에 인증서 파일이 포함되어 있습니다.
- 서버 적용에 필요한 파일 정보는, zip 파일내 '발급내역서 및 루트/체인' PDF 에서 확인해야 합니다. (필수)
- 이후 과정 부터는, 서버에 SSL 인증서 설치/적용/확인 절차 입니다. (인터넷에 공개된 설정법과 차이 없음)
- 직접 설치/적용에 어려움이 있다면, 서버운영 전문업체 기술지원도 검토해 보시기 바랍니다 유료기술지원 확인하기

- 서버이름표시(SNI) 지원되는 서버의 경우, SSL 인증서 마다 각 포트 구분없이 모두 443 포트 적용가능합니다.
- SNI 설정으로 하는 경우, 사이트에 접속하는 클라이언트의 호환성을 미리 검토해야 합니다.

서버 인증서 jks 포맷 조합 예 (CSR 직접 생성한 경우)

- SSL 인증서 발급 신청서 작성시, CSR 입력 단계에서 "CSR 자동생성" 선택시 현재 과정은 필요 없습니다. (권장)

  • keytool -import -trustcacerts -alias AAARoot -file AAACertificateServices.Root.crt.pem -keystore sslcert.co.kr.jks
  • keytool -import -trustcacerts -alias USERTrustCA -file USERTrustRSACA.Chain1.crt.pem -keystore sslcert.co.kr.jks
  • keytool -import -trustcacerts -alias SectigoCA -file SectigoRSADVCA.Chain2.crt.pem -keystore sslcert.co.kr.jks
  • keytool -import -trustcacerts -alias SecureSign -file sslcert.co.kr_xxxxx.crt.pem -keystore sslcert.co.kr.jks
  • (예제에 사용된 옵션 값 등은 예제용이므로, 실제 해당 도메인 정보로 지정하시기 바랍니다)

* 개인키가 CSR 생성 서버에만 - CSR 직접 생성 - 존재하는 경우에, 개인키에 발급된 "서버/체인/루트" 인증서를 통합합니다.
* 루트/체인 인증서는 상품별로 차이가 있으므로, 발급 완료시 첨부된 파일 내역에서 확인 가능합니다.
* CSR 자동생성 신청의 경우, .pfx / .jks 포맷 파일을 제공해 드리며 파일에 모두 통합되어 있습니다. (조합 과정 불필요)
* 필요에 따라서 .pem 파일을 이용하여 조합하거나 .pfx, .jks 파일에서 추가/변경/분리/조합하면 됩니다. (변환매뉴얼참조)

Server.xml - Connector 확인

JSSE NIO : <Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8443" .../>
APR : <Connector protocol="org.apache.coyote.http11.Http11AprProtocol" port="8443" .../>

* 설치된 Tomcat 의 구동 Connector 종류를 확인 후, 해당 환경에 맞게 설정을 진행합니다.

Server.xml - JavaKeyStore 적용 예제 (CSR 자동 생성 이용 또는 jks 조합 후)

Tomcat 4+ (NIO,BIO)

<Connector

port="443" scheme="https" secure="true" SSLEnabled="true"
keystoreFile="인증서경로/sslcert.co.kr_xxxxx.jks 파일" keystorePass=".jks 패스워드"
sslProtocol="TLS"

/>

* JavaKeyStore(.jks) 는, [CSR 자동생성] 신청시 개인키+서버인증서+체인인증서+루트인증서가 포함되어 있습니다.
* CN(일반이름) 과 Alias 가 다르면, Alias Property 를 별도로 지정 해주어야 합니다.
* CSR 자동 생성 이용시, 개인키에는 패스워드가 지정되지 않습니다. (별도 지정 필요시 변환 매뉴얼 참조)
* CSR 자동 생성 이용시, .pfx / .jks 패스워드는 발급내역서 PDF 또는 주문상세 페이지를 참조하시기 바랍니다.
* 예제에 포함되어 있지 않은 Property 는 공식 매뉴얼 기본값 또는 서버 자체 설정값을 사용하시기 바랍니다.

Server.xml - PFX 적용 예제 (CSR 자동 생성 이용 또는 pfx 변환 후)

Tomcat 4+ (NIO,BIO)

<Connector

port="443" SSLEnabled="true"
scheme="https" secure="true" sslProtocol="TLS"
keystoreFile="인증서경로/sslcert.co.kr_xxxxx.pfx" keystorePass="pfx암호" keystoreType="PKCS12"

/>

* pfx 포맷은, [CSR 자동생성] 신청시 개인키+서버인증서+체인인증서+루트인증서가 포함되어 있습니다.
* CN(일반이름) 과 Alias 가 다르면, Alias Property 를 별도로 지정 해주어야 합니다.
* CSR 자동 생성 이용시, 개인키에는 패스워드가 지정되지 않습니다. (별도 지정 필요시 변환 매뉴얼 참조)
* CSR 자동 생성 이용시, .pfx / .jks 패스워드는 발급내역서 PDF 또는 주문상세 페이지를 참조하시기 바랍니다.
* 예제에 포함되어 있지 않은 Property 는 공식 매뉴얼 기본값 또는 서버 자체 설정값을 사용하시기 바랍니다.

Server.xml - APR 환경 적용 예제 Apache Portable Runtime / PEM 직접 적용

Tomcat 5.5+ (APR)

<Connector

port="443" SSLEnabled="true"
scheme="https" secure="true" SSLProtocol="TLSv1.2"
SSLPassword="개인키 암호" (*CSR 수동 생성시에 설정 또는 인증서 변환 매뉴얼 참조)
SSLCertificateKeyFile=/인증서파일경로/개인키 ex. sslcert.co.kr_xxxxx.key.pem
SSLCertificateFile=/인증서파일경로/서버인증서 ex. sslcert.co.kr_xxxxx.crt.pem
SSLCertificateChainFile=/인증서파일경로/체인인증서ex. chain-bundle.pem
SSLCACertificateFile=/인증서파일경로/루트인증서 ex. AAACertificateServices.Root.crt.pem

/>

* 루트/체인 인증서는 상품별로 차이가 있으므로, 발급 완료시 첨부된 파일 내역에서 확인 가능합니다.
* AprLifecycleListener 리스너 구성 및 SSLEngine 활성화가 되어 있는지 미리 확인하시기 바랍니다.
* CSR 자동 생성 이용시, 개인키에는 패스워드가 지정되지 않습니다. (별도 지정 필요시 변환 매뉴얼 참조)
* 예제에 포함되어 있지 않은 Property 는 공식 매뉴얼 기본값 또는 서버 자체 설정값을 사용하시기 바랍니다.

설치 적용 확인

- SSL 설정 적용 후, Tomcat 서버를 재시작하여 정상 구동이 되는지 확인이 필요합니다.

- 서버 데몬 시작시 SSL 설정 관련 오류,경고가 있는지 콘솔/데몬/이벤트 로그 확인이 필요합니다.
- 서버 로컬에서 설정한 HTTPS 포트가 활성화 되어 있는지 netstat 등으로 확인해야 합니다.
- 외부에서 HTTPS 포트 접속이 되지 않는 다면 보안설정(방화벽등) 허용을 확인해야 합니다.
- L4 분산 환경은, HTTPS 패킷을 수신하는 모든 노드 웹서버에 SSL 적용이 필요합니다.
- L7 라우팅 환경은, L7 에도 HTTPS 활성 및 SSL 인증서 설정이 필요합니다. (장비별 자체 매뉴얼 참조)

- SSL 발급 도메인 웹페이지에 https:// 링크 적용을 별도 진행해야 최종적으로 SSL 암호화가 적용됩니다. (개발자,웹디자이너)
- PC 및 스마트폰의 "Chrome / Firefox / IE / Edge" 각 웹브라우져에서 "루트,체인,SSL,TLS" 경고가 발생 하는지 확인해야 합니다.

SSL 설치/적용 트러블슈팅 SSL 설치 적용 확인 하기 체인인증서 적용 여부 확인 인증서 포맷 변환 방법

관련 주요 이슈 사항

  • SSL 인증서 적용시, 서버 이름 표시 (SNI) 지원 서버 및 클라이언트
  • 서버에 보안이 약한 임시 Diffie-Hellman 공개 키가 있습니다
  • 연결이 비공개로 설정되어 있지않습니다
  • ERR_SSL_VERSION_OR_CIPHER_MISMATCH
  • 페이지에 안전하지 않은 다른 리소스, 혼합된 콘텐츠 차단, 자물쇠 표시 없음
  • Apache, NginX 등 웹서버 SSL Cipher Suite 권장 값
  • OpenSSLContext.init Error initializing SSL context 오류
  • Alias name tomcat does not identify a key entry 오류
  • SSLCertificateFile must be defined when using SSL with APR 오류
  • Java 기반에서 SSL 접속시, PKIX path building failed 오류
  • 주요 웹브라우져 SSL v2 v3 및 TLS 1.0, 1.1 지원 삭제

참고 추가 자료

  • Apache Tomcat 7.0 - SSL Configuration HOW-TO (공식매뉴얼)
  • Apache Tomcat 8.0 - SSL Configuration HOW-TO (공식매뉴얼)
  • Apache Tomcat 9.0 - SSL Configuration HOW-TO (공식매뉴얼)
  • moz://a SSL Configuration Generator (SSL/TLS 환경설정 생성기)
  • Tomcat 에서 SNI 방식 SSL 인증서 Server.xml 설정 예제
  • 보안서버 구축 가이드 (정부 배포 PDF 모음)
  • 웹페이지 html 소스에 https 링크 적용 가이드

설치 적용 관련 FAQ

  • SSL 인증서를 새로 발급 받아 적용했는데, 기존 인증서가 계속 보입니다?
  • 443 포트 충돌 접속 오류가 발생합니다. 이유(원인)가 무엇인가요?
  • SSL 발급 완료시, 어떤 파일이 제공(포함) 되나요? (pem,key,crt,pfx,jks,p7b)
  • 개인키 암호가 없어서 설치 적용이 안되고 있습니다?
  • 체인(중개) 인증서를 꼭 적용해야 하나요?
  • SSL 설치 적용할 웹서버 종류가 2가지 이상일 경우에는?
  • 웹페이지에 https 링크 적용/접속시 웹브라우져 경고창 관련 (점검사항)

CA 기술 자료

  • Sectigo https://support.sectigo.com/Com_KnowledgeMainPage
  • DigiCert https://www.digicert.com/kb/ssl-certificate-installation.htm
  • GlobalSign https://support.globalsign.com/ssl/ssl-certificates-installation/install-ssl-certificate-overview