En algunas algunas distribuciones nos podemos encontrar que mod_ssl no soporta TLS 1.2, pero en cambio sí podremos instalar mod_nss que sí lo soporta. Vamos a ver como usar mod_nss
Primero deberemos cargarlo y definir algunas variables globales, por ejemplo en /etc/httpd/conf.d/nss.conf:
LoadModule nss_module modules/libmodnss.so
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
NSSPassPhraseDialog builtin
NSSPassPhraseHelper /usr/libexec/nss_pcache
NSSSessionCacheSize 10000
NSSSessionCacheTimeout 100
NSSSession3CacheTimeout 86400
NSSRandomSeed startup builtin
NSSRenegotiation off
NSSRequireSafeNegotiation off
NSSCipherSuite +rsa_rc4_128_md5,+rsa_rc4_128_sha,+rsa_3des_sha,-rsa_des_sha,-rsa_rc4_40_md5,-rsa_rc2_40_md5,-rsa_null_md5,-rsa_null_sha,+fips_3des_sha,-fips_des_sha,-fortezza,-fortezza_rc4_128_sha,-fortezza_null,-rsa_des_56_sha,-rsa_rc4_56_sha,+rsa_aes_128_sha,+rsa_aes_256_sha
NSSProtocol TLSv1.0,TLSv1.1,TLSv1.2
A continuación mediante certutil crearemos la base de datos que contendrá los certificados:
echo "ejemplopassword" > /etc/httpd/alias/pwdfile.txt
echo "internal:ejemplopassword" > /etc/httpd/alias/pin.txt
certutil -N -d /etc/httpd/alias -f /etc/httpd/alias/pwdfile.txt
Para el caso de CentOS, al instalar mod_nss se generará una base de datos con certificados autofirmados de ejemplo en /etc/httpd/alias
Mediante certutil deberemos generar la clave privada y el CSR que necesitamos para firmar el certificado, por ejemplo:
# certutil -R -s 'CN=systemadmin.es, O=systemadmin, OU=modnss, L=Barcelona, ST=Barcelona, C=RC' -o /etc/httpd/ssl/systemadmin.csr -a -g 2048 -d /etc/httpd/alias -f /etc/httpd/alias/pwdfile.txt
Podemos ver la clave privada generada mediante certutil -K:
# certutil -K -d /etc/httpd/alias/
certutil: Checking token "NSS Certificate DB" in slot "NSS User Private Key and Certificate Services"
< 0> rsa 37d35426e3a54d45c360be5727cc0f93be4dbeb4 NSS Certificate DB:alpha
< 1> rsa c2fb4ee7ebeedc5a8f0c0cb8d6d2d51581b9ef57 NSS Certificate DB:cacert
< 2> rsa 6c18f8803eb18ad6ad1930c3b4650eb3e8dc5b72 NSS Certificate DB:Server-Cert
< 3> rsa 67c0de3a88a738ffaaf3508d370b528b7976ab0e NSS Certificate DB:sudosueu
< 4> rsa 7b7276980ef037e4b6b37652a95e16376ea95e29 SelfSignedSP
< 5> rsa da7524dee9662362db91ff0b95e77c078e2c4ed5 (orphan)
Una vez la entidad certificadora nos devuelva el certificado firmado, deberemos importar primero el certificado intermedio, si existe. Por ejemplo, para importar el certificado presente en /etc/httpd/ssl/systemadmin_intermediate.crt a la clave GeoTrustGlobalCA haríamos:
# certutil -A -n 'geotrust' -t 'CT,,' -d /etc/httpd/alias -f /etc/httpd/alias/pwdfile.txt -a -i /etc/httpd/ssl/systemadmin_intermediate.crt
Finalmente, importaremos el certificado firmado mediante el siguiente comando. En este caso suponemos que el certificado esta en /etc/httpd/ssl/systemadmin_cert.crt y lo queremos importar con la clave systemadmin:
# certutil -A -n 'systemadmin' -t 'P,,' -d /etc/httpd/alias -f /etc/httpd/alias/pwdfile.txt -a -i /etc/httpd/ssl/systemadmin_cert.crt
Podemos verificar la cadena mediante certutil -O:
# certutil -O -n systemadmin -d .
"GeoTrustGlobalCA" [CN=GeoTrust DV SSL CA - G3,OU=Domain Validated SSL,O=GeoTrust Inc.,C=US]
"systemadmin" [CN=www.systemadmin.es]
Si volvemos a listar las claves privadas veremos que ya no se encuentra huérfana:
# certutil -K -d .
certutil: Checking token "NSS Certificate DB" in slot "NSS User Private Key and Certificate Services"
< 0> rsa 37d35426e3a54d45c360be5727cc0f93be4dbeb4 NSS Certificate DB:alpha
< 1> rsa c2fb4ee7ebeedc5a8f0c0cb8d6d2d51581b9ef57 NSS Certificate DB:cacert
< 2> rsa 6c18f8803eb18ad6ad1930c3b4650eb3e8dc5b72 NSS Certificate DB:Server-Cert
< 3> rsa 67c0de3a88a738ffaaf3508d370b528b7976ab0e NSS Certificate DB:sudosueu
< 4> rsa 7b7276980ef037e4b6b37652a95e16376ea95e29 SelfSignedSP
< 5> rsa da7524dee9662362db91ff0b95e77c078e2c4ed5 systemadmin
Para habilitar el virtualhost SSL con mod_nss, deberemos añadir las siguientes opciones:
<VirtualHost *:443>
(...)
NSSEngine on
NSSCipherSuite +rsa_rc4_128_md5,+rsa_rc4_128_sha,+rsa_3des_sha,-rsa_des_sha,-rsa_rc4_40_md5,-rsa_rc2_40_md5,-rsa_null_md5,-rsa_null_sha,+fips_3des_sha,-fips_des_sha,-fortezza,-fortezza_rc4_128_sha,-fortezza_null,-rsa_des_56_sha,-rsa_rc4_56_sha,+rsa_aes_128_sha,+rsa_aes_256_sha
NSSProtocol TLSv1.0,TLSv1.1,TLSv1.2
NSSNickname systemadmin
NSSCertificateDatabase /etc/httpd/alias
(...)
</VirtualHost>
Simplemente deberemos indicar la clave del certificado a usar mediante NSSNickname, en el caso de ejemplo sería systemadmin.
Tags: Apache