Configuração de TLS com Apache2#

(Nitrokey HSM 2 - macOS)

Dica

O mesmo conceito aqui descrito pode ser usado para muitas aplicações usando openssl como crypto-backend. O conceito resume-se principalmente a: substituir (secreto) ficheiro-chave por PKCS#11 URL referenciando uma chave num código de segurança (Nitrokey)

Preparação#

  • assegure-se de que a versão apache2 é pelo menos 2.4.42 para o próprio mod_ssl suporte

  • activar mod_ssl usando a2enmod ssl, se ainda não tiver sido feito

  • adicionalmente openssl` é necessário e `x id="41"></x>> ver PKCS#11 URL

Configurar o Apache2 para usar uma chave de segurança#

Basicamente a única coisa a fazer é substituir SSLCertificateFile com a URL PKCS#11 apropriada e apagar quaisquer outras referências a chaves ou certificados. Por exemplo, SSLCertificateKeyFile` já não é necessário.

Um exemplo de directiva pode parecer-se com isto:

SSLCertificateFile   "pkcs11:model=PKCS%2315%20emulated;manufacturer=www.CardContact.de;serial=DENK0123123;token=UserPIN%20%28SmartCard-HSM%29;id%01"

A URL apropriada PKCS#11 pode ser extraída como documentado em PKCS#11 URL Generation

Certifique-se de colocar a diretriz dentro de uma configuração VirtualHost.

Fornecer PIN durante a inicialização do Apache2#

Usando o método descrito anteriormente, o Apache2 irá perguntar em cada inicialização para o User-PIN, diminuindo assim basicamente a inicialização em lote. O Apache2 fornece outra diretiva para fornecer o PIN durante a inicialização.

SSLPassPhraseDialog     "|/bin/echo 123456"

O Apache2 espera um executável após |, que será executado durante a inicialização e a saída do Apache’s (espera-se uma nova linha de saída) será usada como PIN. Obviamente métodos complexos arbitrários de recuperação de PIN podem ser implementados usando esta abordagem. Embora aqui um exemplo trivial tenha sido escolhido para apenas echo o PIN durante a inicialização.

Além disso SSLPassPhraseDialog` é uma diretiva global, portanto tem que ser colocada no escopo de configuração global no Apache2.

Aviso

Este exemplo mostrado não é um mecanismo seguro para passar o seu PIN, pois ele será escrito em texto simples dentro da sua configuração

Veja a Apache2 mod_ssl documentation para mais detalhes sobre esta funcionalidade.

Exemplo de configuração completo do Apache2#

Um completo Apache2 (VirtualHost) pode ser parecido com isto:

<IfModule mod_ssl.c>
  SSLPassPhraseDialog     "|/bin/echo 123456"
  <VirtualHost _default_:443>
     ServerAdmin webmaster@localhost

     DocumentRoot /var/www/html

     ErrorLog ${APACHE_LOG_DIR}/error.log
     CustomLog ${APACHE_LOG_DIR}/access.log combined

     SSLEngine on

     SSLCertificateFile      "pkcs11:model=PKCS%2315%20emulated;manufacturer=www.CardContact.de;serial=DENK0105076;token=UserPIN%20%28SmartCard-HSM%29"

     #SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

     <FilesMatch "\.(cgi|shtml|phtml|php)$">
                     SSLOptions +StdEnvVars
     </FilesMatch>
     <Directory /usr/lib/cgi-bin>
                     SSLOptions +StdEnvVars
     </Directory>

  </VirtualHost>
</IfModule>