Autenticación de WebService por Certificado SSL

El presente instructivo tiene como finalidad demostrar un ejemplo práctico de configuración de servidor Webservice con autenticación mediante certificados.
En el mismo se crearán:

  • Punto#1. Crear una autoridad certificadora (CA)
  • Punto#2. Generar las llaves autofirmas de la (CA)
  • Punto#3. Generar llaves del servidor WEB
  • Punto#4. Generar solicitud de firma (CA) de certificado SSL del servidor WEB
  • Punto#5. Firmar (CA) certificado SSL para servidor web
  • Punto#6. Adecuar servidor WEB para uso conexión segura (HTTPS)
  • Punto#7. Generar llaves Clientes
  • Punto#8. Generar solicitud de firma (CA) de certificados para la conexión de los clientes
  • Punto#9. Firmar (CA) certificados para la conexión de los clientes
  • Punto#10. Adecuar servidor WEB para conexión con certificados (SSL)
  • Punto#11. Revocar certificados de los clientes
  • Punto#12. Adecuar servidor WEB para verificar los certificados revocados

Si sólo desea generar un certificado SSL para servidor WEB, puede leer el instrutivo en el siguiente enlace: Generar Llaves OpenSSL 2048 bits. Certificado para SSL Web

Requisitos:

  • Se debe contar con suficiente privilegios para la configuración de aplicativos
  • Se debe tener instalado el aplicativo openSSL y servidor WEB apache en su versión 2.4

Plataforma:

  • Equipos de arquitectura 64 bits
  • Sistema operativo ‘GNU/Linux’ Debian versión 9.0 (actualmente estable)

Para el ejemplo se cuenta con:

– Un servidor para la configuracion de la Autoridad Certificadora (CA)

  • IP: 192.168.1.1
  • hostname: serverCA

– Un servidor para la configuracion del servidor WEB

  • IP: 192.168.1.2
  • hostname: serverWEB

– Un servidor para la configuracion del cliente(CA)

  • IP: 192.168.1.3
  • hostname: cliente

Nota: todo esto puede estar en un sólo servidor, pero se sugiere dividirlo.

Configuración:

Punto#1. Crear una autoridad certificadora (CA)
SERVIDOR AUTORIDAD CERTIFICADORA (CA):

1. Crear directorio de trabajo de la CA:

root@serverca:/opt/CA# mkdir -p /opt/CA

2. Crear directorio llave privada:

root@serverca:/opt/CA# mkdir -p /opt/CA/private

3. Crear directorio certificados:

root@serverca:/opt/CA# mkdir -p /opt/CA/certs

4. Copiar archivo de configuracion del openssl:

root@serverca:/opt/CA# cp /etc/ssl/openssl.cnf /opt/CA

5. Editar el archivo de configuración de openssl de la CA

root@serverca:/opt/CA# vim /opt/CA/openssl.cnf
   
    Efectuar el siguiente cambio:

    [ CA_default ]
    dir             = /opt/CA 
    certs           = /opt/CA/certs
    certificate     = /opt/CA/certs/CAcert.pem
    private_key     = /opt/CA/private/CAllave.pem

    [ req_distinguished_name ]
    countryName_default             = VE
    stateOrProvinceName_default     = Distrito Capital
    localityName_default            = Caracas

6. Crear archivo configservidor.cnf

root@serverca:/opt/CA# vim /opt/CA/configservidor.cnf

Incluir lo siguiente:

basicConstraints = critical,CA:FALSE
extendedKeyUsage = serverAuth

7. Crear archivo configclienter.cnf

root@serverca:/opt/CA# vim /opt/CA/configcliente.cnf

Incluir lo siguiente:

basicConstraints = critical,CA:FALSE
extendedKeyUsage = clientAuth

Punto#2. Generar las llaves autofirmas de la (CA)
8. Crear un certificado auto-firmado que será utilizado como el certificado de la CA. Este será utilizado para firmar las solicitudes de certificados

root@serverca:/opt/CA# openssl req -x509 -newkey rsa:2048 -days 3650 -keyout private/CAllave.pem -out certs/CAcert.pem -config openssl.cnf
Generating a 2048 bit RSA private key
........+++
...................................+++
writing new private key to 'private/CAllave.pem'
Enter PEM pass phrase: colocar contraseña
Verifying - Enter PEM pass phrase: repetir contraseña
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [VE]:VE
State or Province Name (full name) [Distrito Capital]:Distrito Capital
Locality Name (eg, city) [Caracas]:Caracas
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Empresa JuanTrucupei
Organizational Unit Name (eg, section) []:Proyecto Autoridad Certificadora Trucupei
Common Name (e.g. server FQDN or YOUR name) []:servidorca
Email Address []:root@trucupei.com.ve

9. Verificar los pemisos:

root@serverca:/opt/CA# chmod 400 /opt/CA/private/CAllave

Punto#3. Generar llaves del servidor WEB
SERVIDOR WEB:

1. Generar llave privada servidor WEB

operador@servidorweb:/opt# openssl genrsa -out serverwebkey.pem 2048 -days 3650
Generating RSA private key, 2048 bit long modulus
....................................+++
...........+++
e is 65537 (0x10001)

Punto#4. Generar solicitud de firma (CA) de certificado SSL del servidor WEB
2. Generar solicitud de firma de certificado:

operador@servidorweb:/opt# openssl req -new -key serverwebkey.pem -out serverweb-solicitud.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:VE
State or Province Name (full name) [Some-State]: Distrito Capital
Locality Name (eg, city) []:Caracas
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Compañia Juan Trucupei
Organizational Unit Name (eg, section) []: Proyecto WS Juan Trucupei
Common Name (eg, YOUR name) []: serverweb
Email Address []: root@juantrucupei.com.ve
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: (Dejar en blanco)

3. Copiar el archivo serverweb-solicitud.pem al servidor CA

root@cliente:/# scp serverweb-solicitud.pem root@192.168.1.1:/ruta/a

Punto#5. Firmar (CA) certificado SSL para servidor WEB
SERVIDOR AUTORIDAD CERTIFICADORA (CA):

1. Firmar el certificado del servidor WEB

root@serverca:/opt/CA#  openssl x509 -CA certs/CAcert.pem -CAkey private/CAllave.pem -req -extfile configservidor.cnf -in /ruta/a/serverweb-solicitud.pem -days 1095 -CAcreateserial -sha1 -out /ruta/a/serverwebssl.pem

2. Copiar el archivo serverwebssl.pem al servidor WEB

root@cliente:/# scp serverwebssl.pem root@192.168.1.2:/ruta/a

Punto#6. Adecuar servidor WEB para uso conexión segura (HTTPS)
SERVIDOR WEB:

1. Editar el archivo de configuración de virtualhost:

operador@servidorweb:/opt# vim /etc/apache/site-enabled/000-default-ssl.conf

Agregar la siguiente linea:

SSLEngine on
SSLCertificateFile /ruta/a/serverwebssl.pem
SSLCertificateKeyFile /ruta/a/serverwebkey.pem

2. Reiniciar servidor apache2

operador@servidorweb:/opt# /etc/init.d/apache2 restart

Punto#7. Generar llaves Clientes
EN EL EQUIPO CLIENTE:

1. Generar una llave privada

root@cliente:/# openssl genrsa -out trucupeikey.pem 2048

Nota: si desea colocar contraseña a la llave privada, debe adicionar el siguiente argumento “-des3”

Punto#8. Generar solicitud de firma (CA) de certificados para la conexión de los clientes
2. Generar solicitud de firma de certificado

root@cliente:/# openssl req -new -key trucupeikey.pem -out trucupei-solicitud.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:VE
State or Province Name (full name) [Some-State]:Distrito Capital
Locality Name (eg, city) []:Caracas
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Compañia Juan Trcupei
Organizational Unit Name (eg, section) []:Cliente Ws Juan Trucupei
Common Name (e.g. server FQDN or YOUR name) []:clientews
Email Address []:cliente@juantrucupei.com.ve

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

3. Copiar el archivo trucupei-solicitud.pem al servidor CA

root@cliente:/# scp trucupei-solicitud.pem root@192.168.1.1:/ruta/a

Punto#9. Firmar (CA) certificados para la conexión de los clientes
SERVIDOR AUTORIDAD CERTIFICADORA (CA):

1. Firmar el certificado del servidor del cliente

root@serverca:/opt/CA#  openssl x509 -CA certs/CAcert.pem -CAkey private/CAllave.pem -req -in /ruta/a/trucupei-solicitud.pem -days 730 -extfile configcliente.cnf -CAcreateserial -sha1 -out /ruta/a/trucupei-certificado.pem

2. Convertir certificado en formato válido para navegador

root@serverca:/opt/CA# openssl pkcs12 -export -in trucupei-certificado.pem -inkey trucupeikey.pem -certfile certs/CAcert.pem -out trucupeinavegador.p12
Enter Export Password:
Verifying - Enter Export Password:

Nota: En este punto, ya se cuenta con un certificado “trcupeinavegador.p12” firmado y que puede instalarse en el navegador WEB para tener acceso a los recursos del servidor.

3. Copiar el archivo trcupeinavegador.p12 al cliente

root@serverca:/# scp trcupeinavegador.p12 root@192.168.1.3:/ruta/a

Punto#10. Adecuar servidor WEB para conexión con certificados (SSL)
SERVIDOR WEB:

1. Editar el archivo de configuración del virtualhost de Apache:

operador@servidorweb:/opt# vim /etc/apache/site-enabled/000-default-ssl.conf

Agregar la siguiente linea:

SSLCACertificateFile /ruta/a/CAcert.pem
SSLVerifyClient require

2. Reiniciar servidor apache2

operador@servidorweb:/opt# /etc/init.d/apache2 restart

Punto#11. Revocar certificados de los clientes
SERVIDOR AUTORIDAD CERTIFICADORA (CA):

1. Para evitar error, es necesario crear el siguiente archivo:

root@serverca:/opt/CA# touch /opt/CA/index.txt

2. En caso de error “error while loading CRL number”, se debe efectuar el siguiente paso:

root@serverca:/opt/CA# echo "01" > /opt/CA/crlnumber

3. Revocar el certificado

root@serverca:/opt/CA# openssl ca -revoke trucupei-certificado.pem -config openssl.cnf
Using configuration from openssl.cnf
Enter pass phrase for /opt/CA/CAllave.pem:
Adding Entry with serial number BB0734F67EBF6CBF to DB for /C=VE/ST=Distrito Capital/L=Caracas/O=Compañia Juan Trucupei OU=Cliente WS Juan Trucupei/CN=clientews/emailAddress=root@juantrucupei.com.ve
Revoking Certificate BB0734F67EBF6CBF.
Data Base Updated

4. Generar lista de revocados

root@serverca:/opt/CA# openssl ca -gencrl -out revocados.crl -crldays 1095 -config openssl.cnf

5. Copiar el archivo revocados.crl al servidor web

root@serverca:/opt/CA# scp revocados.crl root@192.168.1.2:/ruta/a/

Punto#12. Adecuar servidor WEB para verificar los certificados revocados
SERVIDOR WEB:

1. Editar el archivo de configuración del virtualhost de Apache:

operador@servidorweb:/opt# vim /etc/apache/site-enabled/000-default-ssl.conf

Agregar las siguientes lineas:

SSLCARRevocationPath /ruta/a
SSLCARevocationFile /ruta/a/revocados.crl
SSLCARevocationCheck chain

2. Reiniciar servidor apache2

operador@servidorweb:/opt# /etc/init.d/apache2 restart

Ejemplo de configuración site SSL servidor WEB
SERVIDOR WEB:

<IfModule mod_ssl.c>
           <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost

                DocumentRoot /ruta/a/www/html
                Alias /wstrucupei /ruta/a/www/html/wstrucupei

               <Directory /ruta/a/www/html/wstrucupei>
                    Options -Indexes -MultiViews -ExecCGI -FollowSymLinks +SymLinksIfOwnerMatch
                    AllowOverride All
                    Require all granted
                </Directory>

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

                SSLEngine on

                SSLCertificateFile /ruta/a/serverwebssl.pem
                SSLCertificateKeyFile /ruta/a/serverwebkey.pem

                SSLCACertificatePath /ruta/a/
                SSLCACertificateFile /ruta/a/CAcert.pem

                SSLCARevocationPath /ruta/a/
                SSLCARevocationFile /ruta/a/revocados.crl
                SSLCARevocationCheck chain

                SSLVerifyClient require
                #SSLVerifyDepth  10

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

                BrowserMatch "MSIE [2-6]" \
                                nokeepalive ssl-unclean-shutdown \
                                downgrade-1.0 force-response-1.0
                # MSIE 7 and newer should be able to use keepalive
                BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
        </VirtualHost>
</IfModule>

3. Verificar la fecha de caducidad de cualquier certificado:

operador@servidorweb:/opt# openssl x509 -noout -dates -in /ruta/a/serverwebssl.pem

Enlaces:
Usando certificados SSL de cliente como sistema de autenticación web
SSL – Certificado firmado por nuestra propia entidad certificadora
Apache SSL certificado cliente, configurar Apache para permitir solo accesos SSL con certificado instalado en cliente
Cómo crear tu propia autoridad certificante (CA)

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s