Como configurar o Tomcat para usar criptografia SSL com a chave privada armazenada em um servidor remoto?

Como configurar o Tomcat para usar criptografia SSL com a chave privada armazenada em um servidor remoto?

Quero saber se existe uma maneira de configurar o Tomcat server.xmlpara usar a criptografia SSL com uma chave privada armazenada remotamente em um servidor. Posso imaginar que a configuração do servidor seria algo assim

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" />

Mas a keystoreFilediretiva aponta para um script que extrai a chave privada do servidor remoto.

Existe uma maneira na configuração do Tomcat de apontar para um script de shell para extrair a chave?

Eu encontrei algo sobreTrustManagermas posso ver que o caminho deve apontar para um caminho do sistema de arquivos, o que não é uma alternativa para mim.

Responder1

"Extrair a chave" anula completamente o objetivo de usar um HSM - significa que a chave privada ainda estaria armazenada na memória do Tomcat (portanto, seria possível roubar usando, por exemplo, Heartbleed), e qualquer pessoa que olhasse para ela server.xmlainda poderia roubá-la porsimplesmente executando exatamente o mesmo comandocomo o Tomcat faz.

Sua ideia só faz sentido se você conseguir fazer o Tomcatenviar solicitações de assinaturapara o HSM. Isso aumentará um pouco a latência (devido ao fato de cada conexão TLS ter que atingir o HSM), mas é a única abordagem que realmente adiciona alguma segurança.

(Ele nem precisa ser um HSM real; pode até ser o SoftHSM2 rodando no mesmo sistema, e ainda seria mais seguro, desde que mantivesse firmemente a chave em uma conta de usuário e o Tomcat na outra.)

Usando um módulo PKCS#11 no mesmo sistema

Você pode avançar nesta seção, mas as etapas básicas para usar o PKCS#11 com o Tomcat são:

  1. Crie um arquivo com:/etc/java-<name>.cfg
    nome =<hsm_nome>
    biblioteca = /usr/lib/p11-kit-proxy.so
    (Ajuste o caminho da biblioteca de acordo com sua distribuição. A documentação completa deste arquivo de configuração pode ser encontrada noGuia Java PKCS#11.)
  2. Adicione uma nova linha ao seu java.securityarquivo:
    provedor.de.segurança.NUM=sun.security.pkcs11.SunPKCS11 /etc/java-<nome>.cfg
  3. Execute o keytool e certifique-se de que ele mostra o conteúdo do seu HSM:
    keytool --list --storetype PKCS11
  4. Por fim, configure o Tomcat para usar o PKCS#11:

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

Usando um módulo PKCS#11 de um servidor remoto

Okit p11O pacote vem com dois componentes que podem conseguir isso:

  1. O p11-kit-proxy.somódulo PKCS#11, que atua como multiplexador e pode ser configurado para carregar diversos outros módulos conforme configuração. Entre outras coisas, ele pode se comunicar com um módulo fora de processo através de um tubo.

  2. A p11-kit remoteferramenta, que atua como a outra extremidade do tubo para suporte ao módulo fora de processo do kit p11. Ele pode ser usado por SSH ou qualquer outro túnel.

Então, primeiro no lado do HSM:

  1. Instale o p11-kit e escolha ou crie uma conta de usuário que o utilizará.
  2. Crie um arquivo nessa conta de usuário para informar ao p11-kit sobre seu módulo HSM PKCS#11. O conteúdo do arquivo consiste em uma linha:~/.config/pkcs11/modules/<name>.module
    módulo: /usr/lib/<hsm_pkcs11_name>.então
    (Como alternativa, você pode criar isso no diretório de todo o sistema /usr/share/p11-kit/modules/.)
  3. Certifique-se p11-kit liste p11tool --list-tokenstrabalhe com o HSM.

Observação: as etapas 2 a 3 não são realmente necessárias para este plano; eles estão lá apenas para que possíveis problemas possam ser percebidos desde o início. Se descobrir que o p11-kit é incompatível com o módulo HSM, você economizará algum trabalho. (E se for compatível, você poderá usá-lo p11toolpara gerenciá-lo.)

Então, do lado do Tomcat:

  1. Instale o p11-kit também.
  2. Crie um par de chaves SSH para Tomcat e coloque-o na conta HSM authorized_keyspara uso SSH sem senha.
  3. Crie novamente um arquivo no diretório inicial da conta do usuário Tomcat, mas desta vez o conteúdo do arquivo deve ser semelhante a este:~/.config/pkcs11/modules/<name>.module
    remoto: |ssh usuário@hsmserver p11-kit remoto /usr/lib/<hsm_pkcs11_name>.então
  4. Mais uma vez, certifique-se p11-kit liste p11tool --list-tokenstrabalhe. Eles deveriam estabelecer magicamente uma conexão SSH e mostrar informações sobre o HSM remoto.
  5. Para agilizar o acesso remoto, habilite a multiplexação de conexão em SSH via ~/.ssh/config:
    Hospedarservidor hsm
    ControlPath ~/.ssh/S.%r@%h:%p
    ControlMaster auto
    ControlPersist 1h

Se tudo funcionar, tente usar keytoolcom o módulo p11-kit-proxy PKCS#11:

  1. Crie um /etc/java-p11-kit.cfgarquivo com:
    nome = biblioteca p11-kit 
    = /usr/lib/p11-kit-proxy.so
    (Ajuste o caminho da biblioteca de acordo com sua distribuição. A documentação completa deste arquivo de configuração pode ser encontrada noGuia Java PKCS#11.)
  2. Adicione uma nova linha ao seu java.securityarquivo:
    provedor.de.segurança.NUM=sun.security.pkcs11.SunPKCS11 /etc/java-p11-kit.cfg
  3. Execute o keytool e certifique-se de que ele mostra o conteúdo do seu HSM:
    keytool --list --storetype PKCS11
  4. Por fim, configure o Tomcat para usar o módulo p11-kit-proxy PKCS#11:

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

informação relacionada