Autenticación Apache2 (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 SSL.

Esto autenticación permitirá consultar una página web, sólo aquellos clientes que tengan un certificado Válido y activo.

Puntos a Tratar en el Instructivo:

  • 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 recibir sólo conexiones que posean certificados(SSL) válidos
  • 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: Las funcionalidades Autoridad Certificadora (CA) y Servidor WEB, pueden ser instaladas y configuradas en un mismo servidor, pero por medidas de seguridad se sugiere dividirlas.

Configuración:

Punto#1. Crear una autoridad certificadora (CA)

SERVIDOR AUTORIDAD CERTIFICADORA (CA):

1. Crear directorio de trabajo de la CA, para la llave privada y para los certificados:

root@serverca:~# mkdir -p /opt/CA/{private,certs,clientes,revocados}

2. Copiar archivo de configuracion del openssl:

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

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

root@serverca:~# vim /opt/CA/openssl.cnf

Efectuar el siguiente cambios:

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

4. Crear archivo configservidor.cnf

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

Efectuar el siguiente cambios:

basicConstraints = critical,CA:FALSE
extendedKeyUsage = serverAuth

5. Crear archivo configclienter.cnf

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

Efectuar el siguiente cambios:

basicConstraints = critical,CA:FALSE
extendedKeyUsage = clientAuth

Punto#2. Generar las llaves autofirmas de la (CA)

6. Crear un certificado auto-firmado para la CA, el cual 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

7. Verificar los pemisos:

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

Punto#3. Generar llaves del servidor WEB

SERVIDOR WEB:

1. Crear directorio para almacenar las llaves en el servidor WEB:

root@serverca:~# mkdir -p /opt/SSL/{private,certs,keyCA,revocados}

2. Generar llave privada servidor WEB

operador@servidorweb:/opt# openssl genrsa -out private/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

3. Generar solicitud de firma de certificado:

operador@servidorweb:/opt# openssl req -new -key private/serverwebkey.pem -out certs/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)

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

root@cliente:~# scp /opt/SSL/certs/serverweb-solicitud.pem root@192.168.1.1:/opt/CA/clientes

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 clientes/serverweb-solicitud.pem -days 1095 -CAcreateserial -sha1 -out clientes/serverwebssl.pem

2. Copiar el archivo serverwebssl.pem generado al servidor WEB

root@cliente:~# scp /opt/CA/clientes/serverwebssl.pem root@192.168.1.2:/opt/SSL/certs

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

SERVIDOR WEB:

1. Activar modulo SSL

operador@servidorweb:~# a2enmod ssl

2. Editar el archivo de configuración de su site(por defecto apache utiliza 000-default-ssl.conf):

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

Agregar la siguiente linea:

SSLEngine on
SSLCertificateFile /opt/SSL/certs/serverwebssl.pem
SSLCertificateKeyFile /opt/SSL/private/serverwebkey.pem

3. Activar site:

operador@servidorweb:~# a2ensite default-ssl.conf

4. Reiniciar servidor apache2

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

5. Efectuar pruebas con Navegador WEB:
https://192.168.1.2

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. Enviar o Copiar la solicitud de firma de certificado “trucupei-solicitud.pem” al servidor CA:

root@cliente:/# scp trucupei-solicitud.pem root@192.168.1.1:/opt/CA/clientes

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 clientes/trucupei-solicitud.pem -days 730 -extfile configcliente.cnf -CAcreateserial -sha1 -out clientes/trucupei-certificado.pem

2. Convertir certificado en formato válido para navegador:

root@serverca:/opt/CA# openssl pkcs12 -export -in clientes/trucupei-certificado.pem -inkey clientes/trucupeikey.pem -certfile certs/CAcert.pem -out trucupei-navegador.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 o enviar el certificado “trucupei-navegador.p12” al cliente:

root@serverca:/# scp trcupei-navegador.p12 root@192.168.1.3:/home/operador

4. Instalar el certificado trucupei-navegador.p12 en el navegador WEB(firefox)
En el navegador WEB Firefox: Opciones -> preferencias -> Privacidad y Seguridad -> Certificados -> Ver Certificados

4.1. Ubicar el boton “importar”:

4.2 Seleccionar la ruta donde se encuentra el certificado (“/home/operador/”):

4.3 Certificado se encuentra disponible para efectuar pruebas:

Punto#10. Adecuar servidor WEB para recibir sólo conexiones que posean certificados(SSL) válidos

SERVIDOR WEB:

1. Copiar certificado firmado de la CA al servidor WEB

operador@servidorweb:~# scp root@192.168.1.1:/opt/CA/certs/CAcert.pem /opt/SSL/keyCA/

2. Editar el archivo de configuración del site de la página:

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

Agregar la siguiente linea:

SSLCACertificateFile /opt/SSL/keyCA/CAcert.pem
SSLVerifyClient require

3. Reiniciar servidor apache2

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

4.- En éste punto sólo podrán consultar el servidor web (https://192.168.1.2), sólo los que tengan certificado válidos (trucupei-navegador.p12)

Punto#11. Revocar Certificados de los Clientes

SERVIDOR AUTORIDAD CERTIFICADORA (CA):

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

root@serverca:~# 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 clientes/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/revocados.crl -crldays 1095 -config openssl.cnf

5. Copiar el archivo revocados.crl al servidor web

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

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 /opt/SSL/revocados
SSLCARevocationFile /opt/SSL/revocados/revocados.crl
SSLCARevocationCheck chain

2. Reiniciar servidor apache2

operador@servidorweb:~# /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 /opt/SSL/certs/serverwebssl.pem
                SSLCertificateKeyFile /opt/SSL/private/serverwebkey.pem

                SSLCACertificatePath /opt/SSL/keyCA/
                SSLCACertificateFile /opt/SSL/keyCA/CAcert.pem

                SSLCARevocationPath /opt/SSL/revocados/
                SSLCARevocationFile /opt/SSL/revocados/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:~# openssl x509 -noout -dates -in /opt/SSL/certs/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 )

Google+ photo

Estás comentando usando tu cuenta de Google+. 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 )

Conectando a %s