Configuración de TLS con Apache2

Consejo

El mismo concepto descrito aquí puede ser utilizado para muchas aplicaciones que utilizan openssl como crypto-backend. El concepto se reduce principalmente a: reemplazar el archivo de claves (secreto) con la URL PKCS#11 que hace referencia a una clave en un token de seguridad (Nitrokey)

Preparación

  • asegúrese de que la versión de apache2 es al menos 2.4.42 para un correcto soporte de mod_ssl.

  • activar mod_ssl utilizando a2enmod ssl, si no se ha hecho ya

  • adicionalmente openssl es necesario y libengine-pkcs11-openssl ver PKCS#11 URL

Configurar Apache2 para usar una clave de seguridad

Básicamente lo único que hay que hacer es sustituir SSLCertificateFile por la URL PKCS#11 adecuada y eliminar cualquier otra referencia a claves o certificados. Por ejemplo, SSLCertificateKeyFile ya no es necesario.

Un ejemplo de directiva podría ser el siguiente:

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

La URL PKCS#11 adecuada puede extraerse como se documenta en Generación de la URL PKCS#11.

Asegúrese de colocar la directiva dentro de una configuración VirtualHost.

Proporcionar el PIN durante el arranque de Apache2

Usando el método descrito anteriormente, Apache2 pedirá el PIN de usuario en cada arranque, por lo que básicamente declina el arranque por lotes. Apache2 proporciona otra directiva para proporcionar el PIN durante el arranque.

SSLPassPhraseDialog     "|/bin/echo 123456"

Apache2 espera un ejecutable después de |, que se ejecutará durante el arranque y su salida (se espera una nueva línea al final) se utilizará como PIN. Obviamente, se pueden implementar métodos de recuperación de PIN arbitrarios y complejos utilizando este enfoque. Aunque aquí se ha elegido un ejemplo trivial para simplemente echo el PIN durante el arranque.

Además, SSLPassPhraseDialog es una directiva global, por lo que debe colocarse en el ámbito de configuración global de Apache2.

Advertencia

Este ejemplo mostrado no es un mecanismo seguro para pasar su PIN, ya que será escrito en texto plano dentro de su configuración

Consulte la Documentación sobre mod_ssl de Apache2 para obtener más detalles sobre esta función.

Ejemplo de configuración completa de Apache2

Un fragmento de configuración completo de Apache2 (VirtualHost) podría tener este aspecto:

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