Configurar la autenticación mutua SSL (bidireccional)

24

Muchos tutoriales, muchas páginas, muchas preguntas y difieren en la implementación de este problema " Configurar SSL Mutual (Bidireccional) Autenticación ". Tengo que hacerlo con Linux, y no sé por dónde empezar ni qué instrucciones seguir.

Lo que tengo que hacer es:

  • Tengo un servidor y muchos clientes, pueden acceder al código solo en el servidor si tienen un certificado firmado del servidor.
  • el servidor puede generar esos certificados y deshabilitarlos servidor principal sería la CA .. eso significa que tiene que generar certificados para otros y luego firmarlos.

Me había imaginado qué hacer

  1. generar certificado de CA
  2. generar certificados para otros usuarios.
  3. dar certificado a los usuarios.
  4. firmar certificados.
  5. verificar el certificado.
  6. regenerar certificado para usuario o deshabilitado.
  7. el usuario solo puede firmar desde un dispositivo. (el certificado no debe ser copiado)

¿Me he perdido algo? ¿Tengo que ser un usuario root? hay algun bash listo para esto? ¿Dónde puedo encontrarlo? ¿Por qué hay más de un archivo openssl.cnf en Linux? donde debería colocar el certificado de CA, cualquier información sería apreciada.

    
pregunta SafeY 26.04.2013 - 16:26
fuente

1 respuesta

16

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
  • Genera el CA

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

  • Configurar el servidor

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            admin@company.com
  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.

    
respondido por el dawud 27.04.2013 - 13:46
fuente

Lea otras preguntas en las etiquetas