Apache Tomcat 연동

Prev Next

Apache Tomcat SSL용 인증 키를 HSM으로 관리하기 위해 HSM 클라이언트와 Apache Tomcat을 연동하는 방법을 설명합니다.

참고

이 문서는 Thales 공식 문서를 기반으로 작성되었습니다. 사용 가이드에서 안내하는 내용 외에 더 많은 내용을 살펴보려면 Luna HSM Apache Tomcat 연동 가이드를 참고해 주십시오.

지원 환경

HSM 클라이언트와 Apache Tomcat을 연동하기 위한 환경은 다음과 같습니다.

전제 조건

연동을 시작하기 전, 다음의 전제 조건을 준수해 주십시오.

  • HSM 클라이언트 서버에 Java, Apache Tomcat이 설치 및 구동되고 있음
  • HSM 클라이언트 서버는 VPC 상에 위치
  • HSM 클라이언트 서버 인스턴스와 HSM 파티션 간에 연결 생성 완료
  • HSM 파티션 초기 설정 완료

지원 운영체제

Apache Tomcat Java Version Platforms
Apache Tomcat 9.0.79 Open JDK 11 Red Hat Enterprise Linux 8
Apache Tomcat 10.0.6 (With Native Library) Open JDK 11 Red Hat Enterprise Linux 8 and OpenSSL 1.1.1
참고

이 문서는 Apache Tomcat 9.0.115, Java Version openjdk version 11.0.25, Red Hat Enterprise Linux 8.10 에서 실습된 내용으로 작성되었습니다.

Luna HSM을 위한 Java 설정

Apache Tomcat은 SSL/TLS 지원을 위해 Java JSSE(Java Secure Socket Extension)를 사용합니다. Apache Tomcat이 Luna HSM에 저장된 SSL 키와 인증서를 안전하게 사용하여 통신을 보호할 수 있도록, Java에 Luna Provider를 추가로 설정해야 합니다. Java 11 환경에서 Luna Provider를 설정하는 방법은 다음과 같습니다.

  1. JAVA_HOME 및 PATH 환경 변수가 설정되어 있는지 확인해 주십시오. 설정되어 있지 않은 경우, 다음과 같이 JAVA_HOME 및 PATH 환경 변수를 설정해야 합니다.
    # export JAVA_HOME=<JDK_installation_directory>
    # export PATH=$JAVA_HOME/bin:$PATH
    
  2. <JDK_installation_directory>/conf/security 디렉터리에 위치한 Java 보안 설정 파일인 java.security를 편집해 주십시오. 아래 예시와 같이 Luna Provider를 java.security 파일에 추가합니다.
    security.provider.1=SUN
    security.provider.2=com.safenetinc.luna.provider.LunaProvider
    security.provider.3=SunRsaSign
    security.provider.4=SunEC
    security.provider.5=SunJSSE
    security.provider.6=SunJCE
    security.provider.7=SunJGSS
    security.provider.8=SunSASL
    security.provider.9=XMLDSig
    security.provider.10=SunPCSC
    security.provider.11=JdkLDAP
    security.provider.12=JdkSASL
    security.provider.13=SunPKCS11
    
    주의

    security.provider.N 순서가 중요하므로 security.provider.1=SUN 뒤에 Luna Provider를 작성해야 합니다.

Luna HSM 에 키 생성

Java가 Luna Provider를 사용하도록 구성되면, Luna HSM 파티션을 참조하는 키스토어를 통해 키와 인증서를 생성할 수 있습니다. 생성하는 방법은 다음과 같습니다.

  1. Luna HSM 파티션을 참조하는 키스토어 설정 파일을 생성해 주십시오. lunastore라는 이름의 키스토어 설정 파일을 생성하고, 아래와 같이 항목을 추가합니다. <partition_label>에는 사용할 Luna HSM 파티션의 레이블을 입력합니다.

    tokenlabel:<partition_label>
    
    • 파일을 저장하며, <Tomcat_Installation>/conf 디렉터리에 저장하는 것을 권장합니다.
    • 생성한 파일명은 앞으로 사용할 keytool 명령어의 옵션 keystore의 storename 이 됩니다.
  2. Java keytool 유틸리티를 사용하여 키스토어에 키 쌍을 생성해 주십시오.

    keytool -genkeypair \
     -alias {alias} \
     -keyalg {keyalg} \
     -keysize {keysize} \
     -sigalg {sigalg} \
     -keystore {storename} \
     -storetype Luna \
     -storepass {partition crypto officer password} \
     -providerclass com.safenetinc.luna.provider.LunaProvider \
     -providerpath /usr/safenet/lunaclient/jsp/lib/LunaProvider.jar \
     -J-Djava.library.path=/usr/safenet/lunaclient/jsp/lib
    
    • 이때 생성되는 키 쌍은 등록된 Luna HSM 파티션 내에 저장됩니다.
    • 프롬프트가 표시되면 키 및 인증서 생성을 위한 정보를 입력합니다.
    • 입력 완료 후, 키 쌍과 인증서는 Luna HSM 내에 생성됩니다.
    • 예시는 다음과 같습니다.
      [root@s1939023af75 conf]# keytool -genkeypair \
        -alias tomcat-key \
        -keyalg RSA \
        -keysize 2048 \
        -sigalg SHA256withRSA \
        -keystore lunastore \
        -storetype Luna \
        -storepass ********** \
        -providerclass com.safenetinc.luna.provider.LunaProvider \
        -providerpath /usr/safenet/lunaclient/jsp/lib/LunaProvider.jar \
        -J-Djava.library.path=/usr/safenet/lunaclient/jsp/lib
      What is your first and last name?
        [Unknown]:  ■■■■■
      What is the name of your organizational unit?
        [Unknown]:  ■■■■■
      What is the name of your organization?
        [Unknown]:  ■■■■■
      What is the name of your City or Locality?
        [Unknown]:  ■■■■■
      What is the name of your State or Province?
        [Unknown]:  ■■■■■
      What is the two-letter country code for this unit?
        [Unknown]:  ■■■■■ 
      Is CN=■■■■■, OU=■■■■■, O=■■■■■, L=■■■■■, ST=■■■■■, C=■■■■■ correct?
        [no]:  yes
      
      Enter key password for <tomcat-key>
              (RETURN if same as keystore password):  
      Re-enter new password: 
      
  3. 다음 명령을 사용하여 생성된 키 자료를 확인하고, 요청 시 키스토어 비밀번호를 입력해 주십시오. (선택)

    keytool -list -v \
     -keystore {storename} \
     -storetype Luna \
     -providerpath "/usr/safenet/lunaclient/jsp/lib/LunaProvider.jar" \
     -providerclass com.safenetinc.luna.provider.LunaProvider \
     -J-Djava.library.path=/usr/safenet/lunaclient/jsp/lib
    
    • 예시는 다음과 같습니다.
      [root@s1939023af75 conf]# keytool -list -v \
       -keystore lunastore \
       -storetype Luna \
       -providerpath "/usr/safenet/lunaclient/jsp/lib/LunaProvider.jar" \
       -providerclass com.safenetinc.luna.provider.LunaProvider \
       -J-Djava.library.path=/usr/safenet/lunaclient/jsp/lib
      
      Enter keystore password:  
      Keystore type: LUNA
      Keystore provider: LunaProvider
      
      Your keystore contains 1 entry
      
      Alias name: tomcat-key
      Creation date: Jan 29, 2026
      Entry type: PrivateKeyEntry
      Certificate chain length: 1
      Certificate[1]:
      Owner: CN=■■■■■, OU=■■■■■, O=■■■■■, L=■■■■■, ST=■■■■■, C=■■■■■
      Issuer: CN=■■■■■, OU=■■■■■, O=■■■■■, L=■■■■■, ST=■■■■■, C=■■■■■
      Serial number: 62e19031
      Valid from: Thu Jan 29 13:13:31 KST 2026 until: Wed Apr 29 13:13:31 KST 2026
      Certificate fingerprints:
               SHA1: 9C:BD:29:7B:EE:43:5F:57:E1:43:B7:49:46:55:76:0D:06:01:9A:90
               SHA256: 45:9C:C7:DF:0A:91:68:B2:85:0A:D2:05:5C:12:D2:BF:14:BE:2D:D5:D7:58:45:A8:1D:8A:EE:7D:11:F2:8B:B3
      Signature algorithm name: SHA256withRSA
      Subject Public Key Algorithm: 2048-bit RSA key
      Version: 3
      
      
      *******************************************
      *******************************************
      
  4. 키스토어에 저장된 키를 사용하여 인증서 요청(CSR)을 생성해 주십시오. 이 과정에서 시스템은 키스토어 비밀번호 입력을 요청합니다.

    keytool -certreq \
     -alias {alias} \
     -sigalg {sigalg} \
     -file {output file} \
     -keystore {storename} \
     -storetype Luna \
     -providerpath "/usr/safenet/lunaclient/jsp/lib/LunaProvider.jar" \
     -providerclass com.safenetinc.luna.provider.LunaProvider \
     -J-Djava.library.path=/usr/safenet/lunaclient/jsp/lib/ \
     -J-cp -J/usr/safenet/lunaclient/jsp/lib/LunaProvider.jar
    
    • 예시는 다음과 같습니다.
      [root@s1939023af75 conf]# keytool -certreq \
       -alias tomcat-key \
       -sigalg SHA256withRSA \
       -file certreq_file \
       -keystore lunastore \
       -storetype Luna \
       -providerpath "/usr/safenet/lunaclient/jsp/lib/LunaProvider.jar" \
       -providerclass com.safenetinc.luna.provider.LunaProvider \
       -J-Djava.library.path=/usr/safenet/lunaclient/jsp/lib/ \
       -J-cp -J/usr/safenet/lunaclient/jsp/lib/LunaProvider.jar
       Enter keystore password:  
      
  5. 생성된 CSR 파일을 인증기관(CA)에 제출해 주십시오.

    • CA는 요청을 검증한 후 서명된 인증서 또는 인증서 체인을 반환합니다. 반환받은 인증서 응답 파일과 CA의 루트 인증서를 현재 작업 디렉터리에 저장합니다.
    • 이 문서에서는 인증서 파일을 signed.cert, 루트 인증서 파일을 root.cert 로 저장하여 사용합니다.
  6. CA의 루트 인증서와 서명된 인증서 또는 인증서 체인을 키스토어로 가져와 주십시오. CA 루트 인증서를 가져오기 위해 다음 명령을 실행합니다.

    keytool -trustcacerts \
     -importcert \
     -alias {root ca alias} \
     -file {root ca file} \
     -keystore {storename} \
     -storetype Luna \
     -providerpath "/usr/safenet/lunaclient/jsp/lib/LunaProvider.jar" \
     -providerclass com.safenetinc.luna.provider.LunaProvider \
     -J-Djava.library.path=/usr/safenet/lunaclient/jsp/lib/ \
     -J-cp -J/usr/safenet/lunaclient/jsp/lib/LunaProvider.jar
    
    • 예시는 다음과 같습니다.
      [root@s1939023af75 conf]# keytool -trustcacerts \
       -importcert \
       -alias rootca \
       -file root.cert \
       -keystore lunastore \
       -storetype Luna \
       -providerpath "/usr/safenet/lunaclient/jsp/lib/LunaProvider.jar" \
       -providerclass com.safenetinc.luna.provider.LunaProvider \
       -J-Djava.library.path=/usr/safenet/lunaclient/jsp/lib/ \
       -J-cp -J/usr/safenet/lunaclient/jsp/lib/LunaProvider.jar
      
      Enter keystore password:  
      Owner: CN=■■■■■, OU=■■■■■, O=■■■■■, L=■■■■■, ST=■■■■■, C=■■■■■
      Issuer: CN=■■■■■, OU=■■■■■, O=■■■■■, L=■■■■■, ST=■■■■■, C=■■■■■
      Serial number: 52a988ddebff14347fbd1993e7dd7a9075d66aa8
      Valid from: Wed Mar 12 11:52:51 KST 2025 until: Sat Mar 10 11:53:20 KST 2035
      Certificate fingerprints:
               SHA1: 31:EE:65:76:59:52:6F:D7:6D:76:82:0F:19:C7:E9:CC:A9:B6:02:82
               SHA256: 90:D9:AE:6B:04:E8:10:6D:06:CA:13:A3:50:D1:27:51:89:91:E2:2B:31:FA:A2:C8:B7:D4:A4:B9:BA:F6:8D:F1
      Signature algorithm name: SHA256withRSA
      Subject Public Key Algorithm: 2048-bit RSA key
      Version: 3
      
      Extensions: 
      
      #1: ObjectId: 2.5.29.35 Criticality=false
      AuthorityKeyIdentifier [
      KeyIdentifier [
      0000: E9 0E 63 49 CB 2D 76 CB   12 BE 6E C5 CC 6B 02 56  ..cI.-v...n..k.V
      0010: 84 B4 29 6E                                        ..)n
      ]
      ]
      
      #2: ObjectId: 2.5.29.19 Criticality=true
      BasicConstraints:[
        CA:true
        PathLen:2147483647
      ]
      
      #3: ObjectId: 2.5.29.15 Criticality=true
      KeyUsage [
        Key_CertSign
        Crl_Sign
      ]
      
      #4: ObjectId: 2.5.29.14 Criticality=false
      SubjectKeyIdentifier [
      KeyIdentifier [
      0000: E9 0E 63 49 CB 2D 76 CB   12 BE 6E C5 CC 6B 02 56  ..cI.-v...n..k.V
      0010: 84 B4 29 6E                                        ..)n
      ]
      ]
      
      Trust this certificate? [no]:  yes
      Certificate was added to keystore
      
  7. 루트 인증서와 서명된 인증서를 체인 형태로 생성해 주십시오.

    openssl crl2pkcs7 \
       -nocrl \
       -certfile {signed cert file} \
       -certfile {root ca cert file} \
       -out {output file}
    
    • 예시는 다음과 같습니다.
      [root@s1939023af75 conf]# openssl crl2pkcs7 \
         -nocrl \
         -certfile signed.cert \
         -certfile root.cert \
         -out certchain.p7b
      
  8. 서명된 인증서 응답 파일 또는 인증서 체인을 가져오기 위해 다음 명령을 실행해 주십시오.

    keytool -importcert -trustcacerts -noprompt \
      -alias {alias} \
      -file {chain file}  \
      -keystore {storename} \
      -storetype Luna \
      -providerclass com.safenetinc.luna.provider.LunaProvider \
      -providerpath /usr/safenet/lunaclient/jsp/lib/LunaProvider.jar \
      -J-Djava.library.path=/usr/safenet/lunaclient/jsp/lib
    
    • 예시는 다음과 같습니다.
      [root@s1939023af75 bin]# keytool -importcert -trustcacerts -noprompt \
        -alias tomcat-key \
        -file certchain.p7b  \
        -keystore lunastore \
        -storetype Luna \
        -providerclass com.safenetinc.luna.provider.LunaProvider \
        -providerpath /usr/safenet/lunaclient/jsp/lib/LunaProvider.jar \
        -J-Djava.library.path=/usr/safenet/lunaclient/jsp/lib
      Enter keystore password:    
      Certificate reply was installed in keystore
      
    주의

    생성한 키 쌍에 인증서를 등록해야 하므로 단계 2에서 생성한 alias와 동일한 alias를 전달해야 합니다.

  9. <JDK_installation_directory>/conf/security 디렉터리에 위치한 Java 보안 설정 파일 java.security를 편집해 주십시오. 아래 예시와 같이 Luna Provider를 java.security 파일에 추가합니다.

    security.provider.1=SUN
    security.provider.2=SunEC
    security.provider.3=SunJSSE
    security.provider.4=SunJCE
    security.provider.5=SunJGSS
    security.provider.6=SunSASL
    security.provider.7=XMLDSig
    security.provider.8=SunPCSC
    security.provider.9=JdkLDAP
    security.provider.10=JdkSASL
    security.provider.11=SunPKCS11
    security.provider.12=com.safenetinc.luna.provider.LunaProvider
    security.provider.13=SunRsaSign
    
    주의

    security.provider.N 순서가 중요하므로 security.provider.11 이후에 Luna Provider를 작성합니다.

Apache Tomcat SSL 설정

Apache Tomcat 서버는 SSL 통신을 위해 키스토어에 저장된 SSL 키와 인증서를 사용합니다. Apache Tomcat은 <Tomcat_installation_directory>/conf 디렉터리에 위치한 server.xml 파일을 통해 SSL 커넥터 설정을 정의합니다. 설정하는 방법은 다음과 같습니다.

  1. 서버가 실행 중인 경우, 우선 서버를 중지해 주십시오. <Tomcat_installation_directory>/bin 디렉터리에 제공된 shutdown.sh 스크립트를 실행하여 Apache Tomcat 서버를 종료할 수 있습니다.
  2. Tomcat 서버의 server.xml 파일을 편집해 주십시오. 기존에 주석 처리된 커넥터 설정을 해제하고 수정할 수 있으며, 또는 기존 설정을 그대로 유지한 상태에서 아래 예시의 커넥터 설정을 새로 추가할 수도 있습니다.
        <Connector port="8443" 
            protocol="org.apache.coyote.http11.Http11NioProtocol"
            sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
            maxThreads="150" 
            scheme="https" 
            secure="true" 
            SSLEnabled="true"
            clientAuth="false" 
            sslProtocol="TLS"
            keystoreType="Luna" 
            keystoreFile="conf/lunastore" 
            keyAlias="tomcat-key"
            keystorePass="**********" />
    
    • server.xml 파일을 저장하고 닫습니다.
    • 키스토어 설정 값이 현재 사용 중인 환경에 맞게 올바르게 구성되어 있는지 확인합니다.
  3. $CATALINA_HOME/bin 디렉터리에 setenv.sh 파일을 생성하고, 다음 항목을 추가해 주십시오.
    #!/bin/sh
    export CLASSPATH=/usr/safenet/lunaclient/jsp/lib/LunaProvider.jar
    export CATALINA_OPTS=-Djava.library.path=/usr/safenet/lunaclient/jsp/lib/
    
  4. <Tomcat_installation_directory>/bin 디렉터리에 있는 startup.sh 배치 파일을 실행하여 Tomcat 서버를 시작해 주십시오.
  5. Tomcat 서버가 정상적으로 기동되면, 웹 브라우저에서 HTTPS와 포트 8443을 사용하여 Tomcat 기본 페이지에 접근할 수 있습니다.
    hsm-apach-tomcat-done
    • Apache Tomcat과 Luna HSM 간의 연동 구성이 완료되며, SSL 인증서의 개인 키는 HSM 파티션 내에 안전하게 보호됩니다.
    • SSL 페이지는 HSM 파티션이 Apache Tomcat 서버에서 접근 가능하고 정상적으로 사용 가능한 경우에만 접근할 수 있습니다.
  6. 다음 명령을 사용하여 저장된 키 자료를 확인할 수 있습니다. 요청 시 키스토어 비밀번호를 입력합니다. (선택)
     keytool -list -v \
      -keystore {storename} \
      -storetype Luna \
      -providerpath "/usr/safenet/lunaclient/jsp/lib/LunaProvider.jar" \
      -providerclass com.safenetinc.luna.provider.LunaProvider \
      -J-Djava.library.path=/usr/safenet/lunaclient/jsp/lib
    
    • 예시는 다음과 같습니다.
      [root@s1939023af75 conf]# keytool -list -v \
        -keystore lunastore \
        -storetype Luna \
        -providerpath "/usr/safenet/lunaclient/jsp/lib/LunaProvider.jar" \
        -providerclass com.safenetinc.luna.provider.LunaProvider \
        -J-Djava.library.path=/usr/safenet/lunaclient/jsp/lib
      Enter keystore password:  
      Keystore type: LUNA
      Keystore provider: LunaProvider
      
      Your keystore contains 2 entries
      
      Alias name: rootca
      Creation date: Jan 29, 2026
      Entry type: trustedCertEntry
      
      Owner: CN=■■■■■, OU=■■■■■, O=■■■■■, L=■■■■■, ST=■■■■■, C=■■■■■
      Issuer: CN=■■■■■, OU=■■■■■, O=■■■■■, L=■■■■■, ST=■■■■■, C=■■■■■
      Serial number: 52a988ddebff14347fbd1993e7dd7a9075d66aa8
      Valid from: Wed Mar 12 11:52:51 KST 2025 until: Sat Mar 10 11:53:20 KST 2035
      Certificate fingerprints:
               SHA1: 31:EE:65:76:59:52:6F:D7:6D:76:82:0F:19:C7:E9:CC:A9:B6:02:82
               SHA256: 90:D9:AE:6B:04:E8:10:6D:06:CA:13:A3:50:D1:27:51:89:91:E2:2B:31:FA:A2:C8:B7:D4:A4:B9:BA:F6:8D:F1
      Signature algorithm name: SHA256withRSA
      Subject Public Key Algorithm: 2048-bit RSA key
      Version: 3
      
      
      *******************************************
      *******************************************
      
      
      Alias name: tomcat-key
      Creation date: Jan 29, 2026
      Entry type: PrivateKeyEntry
      Certificate chain length: 2
      Certificate[1]:
      Owner: CN=■■■■■
      Issuer: CN=■■■■■, OU=■■■■■, O=■■■■■, L=■■■■■, ST=■■■■■, C=■■■■■
      Serial number: 1c45e08d2986e75bc926150a3210b74621fecd2e
      Valid from: Thu Jan 29 13:50:27 KST 2026 until: Sat Mar 10 11:53:08 KST 2035
      Certificate fingerprints:
               SHA1: 26:E8:65:9F:B5:8F:0B:AD:4F:41:4E:01:FC:08:AA:96:B5:3F:B9:A2
               SHA256: 2D:7C:7E:5A:41:CC:71:3D:DD:A5:FA:69:10:2A:BF:B3:C6:27:C2:13:65:DB:BA:44:55:A6:CB:D4:DD:92:3D:95
      Signature algorithm name: SHA256withRSA
      Subject Public Key Algorithm: 2048-bit RSA key
      Version: 3
      Certificate[2]:
      Owner: CN=aasdd, OU=aasdd, O=aasdd, L=aasdd, ST=aasdd, C=KR
      Issuer: CN=aasdd, OU=aasdd, O=aasdd, L=aasdd, ST=aasdd, C=KR
      Serial number: 52a988ddebff14347fbd1993e7dd7a9075d66aa8
      Valid from: Wed Mar 12 11:52:51 KST 2025 until: Sat Mar 10 11:53:20 KST 2035
      Certificate fingerprints:
               SHA1: 31:EE:65:76:59:52:6F:D7:6D:76:82:0F:19:C7:E9:CC:A9:B6:02:82
               SHA256: 90:D9:AE:6B:04:E8:10:6D:06:CA:13:A3:50:D1:27:51:89:91:E2:2B:31:FA:A2:C8:B7:D4:A4:B9:BA:F6:8D:F1
      Signature algorithm name: SHA256withRSA
      Subject Public Key Algorithm: 2048-bit RSA key
      Version: 3
      
      
      *******************************************
      *******************************************
      
주의

keytool error: com.safenetinc.luna.exception.LunaException: PIN is incorrect 발생 시 다음과 같이 해결해 주십시오.

  • 원인: 키스토어의 keylabel 파티션의 Crypto Officer 암호가 올바르지 않음
  • 해결 방법: 키스토어의 keylabel 확인 후 올바른 Crypto Officer 암호 입력