Hay un script práctico distribuido junto a openssl, CA.sh
para hacer la mayoría de estas cosas. Su ubicación es de distribución específica. En Debian y sus derivados puedes localizarlo usando:
# apt-file search CA.sh
openssl: /usr/lib/ssl/misc/CA.sh
Y RedHat y sus derivados el equivalente (aproximado) es:
# yum provides */CA
1:openssl-1.0.1e-4.fc18.x86_64 : Utilities from the general purpose cryptography library with TLS implementation
Repo : @updates
Matched from:
Filename : /etc/pki/tls/misc/CA
Este es un script bash muy simple que facilita la creación de la estructura de directorios necesaria para administrar una CA (esto se describe en la sección [ CA_default ]
de openssl.cnf). Te recomiendo que lo uses y mires el código para saber qué está haciendo realmente.
# ./CA.sh -help
usage: ./CA.sh -newcert|-newreq|-newreq-nodes|-newca|-sign|-verify
Esta secuencia de comandos usará los valores predeterminados que se proporcionan en openssl.cnf, y / o puede proporcionar un archivo de configuración como argumento al openssl $command
usando el interruptor -config
si no usa CA.sh
.
La ubicación del archivo openssl.cnf
también es específica de la distribución, y puede usar los mismos comandos de arriba para encontrarlo. El que desea es el proporcionado por el paquete openssl
.
Probablemente quieras modificar las siguientes secciones:
[ CA_default ]
default_days = 365 # how long to certify for
default_crl_days= 30 # how long before next CRL
[ req ]
default_bits = 2048
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = AU
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Some-State
localityName = Locality Name (eg, city)
0.organizationName = Organization Name (eg, company)
0.organizationName_default = Internet Widgits Pty Ltd
#1.organizationName = Second Organization Name (eg, company)
#1.organizationName_default = World Wide Web Pty Ltd
organizationalUnitName = Organizational Unit Name (eg, section)
#organizationalUnitName_default =
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64
Una vez que haya editado openssl.cnf
para satisfacer sus necesidades, puede generar un certificado de CA. Dependiendo de si necesita esta CA firmada por una CA reconocida de terceros o no, puede generar una CA autofirmada o una CSR para su firma.
./CA.sh -newca
Se le pedirá interactivamente que haga algunas preguntas, los valores predeterminados aparecerán entre corchetes. Reconocerá las opciones que modificó en openssl.cnf
aquí.
- Generar un certificado para el servidor
Puede crear una solicitud de certificado para el servidor utilizando el mismo script:
./CA.sh -newreq
Nuevamente, se le pedirá que haga varias preguntas, la más importante es el nombre común del certificado, que debe coincidir con el nombre resoluble de DNS para la IP del servidor (o puede usar otros medios, como /etc/hosts
, no recomendado, difícil de mantener y escalar)
Lo que obtendrá es una solicitud de firma de certificado (CSR, por sus siglas en inglés). Esto estará firmado por la Autoridad de certificación (CA) que creó anteriormente.
./CA.sh -sign
- Generar certificados para los clientes
Repita los pasos para crear una CSR y hacer que la CA la firme. Al hacerlo, preste mucha atención a cómo rellena los campos de Nombre común, Organización y Unidad organizativa, ya que serán necesarios más adelante para configurar el servidor.
Una forma clara de distribuir los certificados de cliente junto con sus respectivas claves privadas y el certificado de CA está utilizando los paquetes p12:
openssl pkcs12 -export -in Certificates/client.pem -inkey client.key -certfile CA.pem
-out clientcert.p12
Supongamos que el servidor al que se refiere es un servidor web Apache. Una vez que tenga el certificado del servidor, configure el VHOST
apropiado para servir cualquier contenido que se va a proteger mediante la autenticación SSL mutua. Un ejemplo podría ser este phpmyadmin
de hosts virtuales. Esto funciona en un servidor Apache 2.4, así que no lo use tal como está y repáselo y pruébelo para adaptarlo a sus necesidades.
Listen 443 https
<VirtualHost 120.120.120.120:443>
DocumentRoot "/srv/www/html"
ServerAdmin [email protected]
SSLCACertificateFile /etc/pki/CA/cacert.pem
SSLCertificateFile /etc/pki/tls/private/phpmyadmin.company.com/newcert.pem
SSLCertificateKeyFile /etc/pki/tls/private/phpmyadmin.company.com/newkey.pem
SSLCARevocationCheck chain
SSLCARevocationFile /etc/pki/CA/crl/crl.pem
SSLEngine on
SSLStrictSNIVHostCheck on
SSLVerifyClient require
SSLVerifyDepth 5
ServerName phpmyadmin.company.com
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteCond %{HTTPS} !=on
RewriteRule . - [F]
Alias /console /usr/share/phpMyAdmin
ErrorLog "|/usr/sbin/rotatelogs -L /var/log/httpd/phpmyadmin/error.log -f /var/log/httpd/phpmyadmin/error.log.%Y%m%d 86400"
CustomLog "|/usr/sbin/rotatelogs -L /var/log/httpd/phpmyadmin/access.log -f /var/log/httpd/phpmyadmin/access.log.%Y%m%d 86400" logstash_json
<Directory /usr/share/phpMyAdmin/>
Require ssl
Require ssl-verify-client
SSLRequireSSL
SSLOptions +FakeBasicAuth +StrictRequire
SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 256
SSLRequire %{SSL_CLIENT_S_DN_O} eq "Awesome Company" \
and %{SSL_CLIENT_S_DN_OU} eq "Development" \
and %{SSL_CLIENT_S_DN_CN} in {"John Doe", "Jane Doe"}
SSLRenegBufferSize 131072
</Directory>
</VirtualHost>
Puede usar tantos controles de acceso por directorio como necesite, lo importante es que los certificados de cliente que se muestran deben cumplir con las restricciones impuestas por las directivas SSLRequire
, es decir, deben coincidir con la Organización, la Unidad organizativa y Condiciones comunes de nombre (u otros campos del certificado que considere oportunos). Estos campos se toman de los certificados de cliente.
- Generar una lista de revocación de certificados
Para poder revocar el acceso a un certificado de cliente, debe generar una CRL.
El comando para hacerlo (siempre que esté en la parte superior de la estructura de directorios de la CA):
openssl ca -config /path/to/openssl.cnf -gencrl -out crl/crl.pem
Después, revoca certificados de cliente según sea necesario mediante:
openssl ca -config /path/to/openssl.cnf -revoke clientcert.pem
Referencias:
OpenSSL documentación en línea y Apache documentación en línea.