원격 서버에 저장된 개인 키로 SSL 암호화를 사용하도록 Tomcat을 구성하는 방법은 무엇입니까?

원격 서버에 저장된 개인 키로 SSL 암호화를 사용하도록 Tomcat을 구성하는 방법은 무엇입니까?

server.xml서버에 원격으로 저장된 개인 키로 SSL 암호화를 사용하도록 Tomcat을 구성하는 방법이 있는지 알고 싶습니다. 서버 구성이 다음과 같을 것이라고 상상할 수 있습니다.

Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
proxyPort=""
keystoreFile="{./script-return}/keystore.jks"
keystorePass="12345"
keystoreType="jks"
truststorePass="12345"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />

그러나 keystoreFile원격 서버에서 개인 키를 추출하는 스크립트를 가리키는 지시어입니다.

Tomcat 구성에 키를 추출하기 위해 쉘 스크립트를 가리키도록 하는 방법이 있습니까?

내가 뭔가를 찾았어신뢰 관리자하지만 경로가 파일 시스템 경로를 가리켜야 한다는 것을 알 수 있는데, 이는 나에게 대안이 아닙니다.

답변1

"키 추출"은 HSM 사용의 요점을 완전히 무너뜨립니다. 이는 개인 키가 여전히 Tomcat의 메모리에 저장된다는 의미이며(예를 들어 Heartbleed를 사용하여 훔치는 것이 가능했을 것입니다), 이를 보는 사람은 누구나 server.xml여전히 그것을 훔칠 수 있습니다. ~에 의해단순히 똑같은 명령을 실행하는 것뿐입니다.Tomcat이 그렇듯.

당신의 아이디어는 Tomcat을 만들 수 있는 경우에만 의미가 있습니다.서명 요청 보내기HSM에. 이렇게 하면 (모든 단일 TLS 연결이 HSM에 도달해야 하기 때문에) 대기 시간이 약간 증가하지만 실제로 일부 보안을 추가하는 유일한 접근 방식입니다.

(실제 HSM일 필요도 없습니다. 동일한 시스템에서 실행되는 SoftHSM2일 수도 있으며, 한 사용자 계정에는 키를, 다른 사용자 계정에는 Tomcat을 단단히 유지하는 한 여전히 더 안전합니다.)

동일한 시스템에서 PKCS#11 모듈 사용

이 섹션을 빨리 감을 수 있지만 Tomcat에서 PKCS#11을 사용하는 기본 단계는 다음과 같습니다.

  1. 다음을 사용하여 파일을 만듭니다 ./etc/java-<name>.cfg
    이름 =<hsm_이름>
    라이브러리 = /usr/lib/p11-kit-proxy.so
    (배포판에 따라 라이브러리 경로를 조정하십시오. 이 구성 파일의 전체 문서는 다음에서 찾을 수 있습니다.Java PKCS#11 가이드.)
  2. 파일에 새 줄을 추가합니다 java.security.
    보안.공급자.NUM=sun.security.pkcs11.SunPKCS11 /etc/java-<이름>.cfg
  3. keytool을 실행하고 HSM 콘텐츠가 표시되는지 확인하세요.
    keytool --list --storetype PKCS11
  4. 마지막으로 PKCS#11을 사용하도록 Tomcat을 구성합니다.

    <Connector ...
               keystore="NONE"
               keystoreType="PKCS11"
               keystoreProvider="SunPKCS11-hsm_name"
               keystorePass="[HSM PIN here]" />
    

원격 서버에서 PKCS#11 모듈 사용

그만큼p11-키트패키지에는 이를 달성할 수 있는 두 가지 구성 요소가 함께 제공됩니다.

  1. p11-kit-proxy.so멀티플렉서 역할을 하며 구성에 따라 다양한 다른 모듈을 로드하도록 구성할 수 있는 PKCS#11 모듈입니다 . 무엇보다도 파이프를 통해 프로세스 외부 모듈과 통신할 수 있습니다.

  2. p11-kit remotep11-kit의 out-of-process 모듈 지원을 위한 다른 파이프 끝 역할을 하는 도구입니다 . SSH 또는 기타 터널을 통해 사용할 수 있습니다.

먼저 HSM 측에서:

  1. p11-kit을 설치하고 이를 사용할 사용자 계정을 선택하거나 생성하십시오.
  2. 해당 사용자 계정에 파일을 생성하여 p11-kit에 HSM PKCS#11 모듈에 대해 알립니다. 파일 내용은 한 줄로 구성됩니다.~/.config/pkcs11/modules/<name>.module
    모듈: /usr/lib/<hsm_pkcs11_name>.그래서
    (또는 시스템 전체 디렉터리에 만들 수도 있습니다 /usr/share/p11-kit/modules/.)
  3. HSM을 확인 p11-kit list하고 작업하세요.p11tool --list-tokens

참고: 이 계획에는 실제로 2~3단계가 필요하지 않습니다. 그들은 가능한 문제를 조기에 발견할 수 있도록 거기에 있을 뿐입니다. p11-kit이 HSM 모듈과 호환되지 않는 것으로 밝혀지면 작업이 줄어듭니다. (호환되면 p11tool관리에 사용할 수 있습니다.)

그런 다음 Tomcat 측에서:

  1. p11-kit도 설치하십시오.
  2. authorized_keysTomcat용 SSH 키 쌍을 생성하고 비밀번호 없는 SSH 사용을 위해 HSM 계정에 넣습니다 .
  3. 다시 Tomcat 사용자 계정의 홈 디렉터리에 파일을 만듭니다. 이번에는 파일 내용이 다음과 같아야 합니다.~/.config/pkcs11/modules/<name>.module
    원격: |ssh user@hsmserver p11-kit 원격 /usr/lib/<hsm_pkcs11_name>.그래서
  4. 다시 한 번 확인 p11-kit list하고 p11tool --list-tokens작업하세요. 마술처럼 SSH 연결을 설정하고 원격 HSM에 대한 정보를 표시하면 됩니다.
  5. 원격 액세스 속도를 높이려면 다음을 통해 SSH에서 연결 멀티플렉싱을 활성화하세요 ~/.ssh/config.
    주인hsm서버
    ControlPath ~/.ssh/S.%r@%h:%p
    ControlMaster 자동
    ControlPersist 1h

keytool모든 것이 작동하면 p11-kit-proxy PKCS#11 모듈과 함께 사용해 보십시오 :

  1. /etc/java-p11-kit.cfg다음을 사용하여 파일을 만듭니다 .
    이름 = p11-kit 
    라이브러리 = /usr/lib/p11-kit-proxy.so
    (배포판에 따라 라이브러리 경로를 조정하십시오. 이 구성 파일의 전체 문서는 다음에서 찾을 수 있습니다.Java PKCS#11 가이드.)
  2. 파일에 새 줄을 추가합니다 java.security.
    보안.공급자.NUM=sun.security.pkcs11.SunPKCS11 /etc/java-p11-kit.cfg
  3. keytool을 실행하고 HSM 콘텐츠가 표시되는지 확인하세요.
    keytool --list --storetype PKCS11
  4. 마지막으로 p11-kit-proxy PKCS#11 모듈을 사용하도록 Tomcat을 구성합니다.

    <Connector ...
               keystore="NONE"
               keystoreType="PKCS11"
               keystoreProvider="SunPKCS11-p11-kit"
               keystorePass="[HSM PIN here]" />
    

관련 정보