Los servicios de una autoridad de certificación, son principalmente utilizados para garantizar la seguridad de las comunicaciones digitales vía el protocolo TLS (Transport Layer Security), utilizados en las comunicaciones web (HTTPS) o las comunicaciones de correos electrónicos (SMTP, POP3, IMAP), así como para resguardar documentos digitales (por ejemplo, utilizando firmas electrónicas avanzadas con el sistema PAdES para documentos PDF, o vía el protocolo S/MIME para los correos electrónicos). (tomado de wikipedia)
Una autoridad de certificación ( [glossary]CA[/glossary]) es una entidad que firma certificados digitales. Muchos sitios web deben informar a sus clientes que la conexión es segura, por lo que pagan a una CA de confianza internacional (por ejemplo, VeriSign, DigiCert) para firmar un certificado para su dominio. En algunos casos, puede tener más sentido actuar como su propia CA, en lugar de pagar a una CA como DigiCert. Los casos comunes incluyen la protección de un sitio web de intranet o la emisión de certificados a los clientes para que puedan autenticarse en un servidor (por ejemplo, Apache, OpenVPN).
¿Qué hay en una CA?
Una autoridad de certificación es una combinación de las siguientes cosas:
- Una clave privada
- Un certificado autofirmado para esa clave privada
- Una lista de todos los certificados que han sido emitidos
- Una lista de todos los certificados que han sido revocados (CRL)
- Una política de emisión de certificados
- Servicios para publicar los certificados de validación de CRL (OCSP).
Solo la clave privada necesita estar altamente protegida. Todas las demás cosas en la lista anterior se pueden manejar como cualquier otro servicio de datos que proporcionamos.
Como se mencionó, la clave privada de la AC necesita un alto nivel de seguridad. Más seguridad usualmente significa menos comodidad. La clave privada debe almacenarse en un lugar seguro, pero se utiliza para firmar certificados por otro lado. Para hacer las cosas más seguras y fáciles, la clave privada, que debe estar altamente protegida, nunca se usa directamente para firmar los certificados de los usuarios finales y los servidores. En su lugar, se crea una CA intermedia, un nivel por debajo de la CA raíz. La clave privada de la CA raíz se usa solo una vez para firmar el certificado de la CA intermedia y luego se almacena en su lugar seguro. Después de eso, los certificados para personas y dispositivos pueden ser firmados por la CA intermedia con su propia clave privada. En caso de que la clave privada intermedia sea robada, perdida o comprometida, puede descartarla y crear una nueva CA intermedia, sin perder todo, como sería el caso si esto sucediera con la clave CA raíz. Aún es aconsejable proteger la clave privada de los intermediarios con una contraseña y no dejarla en un servidor desprotegido todo el tiempo.
Cuando brindamos servicios para el público en general, utilizamos certificados firmados por un tercero "confiable". Las personas que no nos conocen (nosotros tampoco los conocemos) pueden confiar en la firma de la CA pública (que ambos sabemos), para iniciar un canal de comunicación seguro y "confiable". Esto les asegura que, de hecho, hablan con nuestro servidor y que nadie puede escuchar o leer ninguna comunicación. La información y los servicios que brindamos en estos servidores aún están abiertos al público en general y no son secretos en absoluto.
En este tutorial les mostrare como crear nuestro propio certificado autofirmado y no depender de un tercero para lograrlo. Este tutorial es una traducción de este link, con agregados y mejoras para su uso. Gracias a @yoandymg por sus aportes.
Instalar OpenSSL
apt install opensslUna vez instalado, está listo para crear su propio certificado autofirmado. Actuar como una autoridad de certificación (CA) significa tratar con pares criptográficos de claves privadas y certificados públicos. El primer par criptográfico que crearemos es el par raíz. Consiste en la clave raíz (cakey.pem) y el certificado raíz (cacert.pem). Este par forma la identidad de su CA. Si usamos SHA1, obtendremos la página Su conexión no es privada en Chrome.Por lo que usaremos una codificacion más fuerte, como SHA256.
Creando tu ambiente de trabajo
Usaremos el directorio raíz de su perfil de usuario (root en mi caso) para hacer este trabajo. Si usa algo más, puede que necesite personalizar el contenido de caconfig.cnf y certs_escfg.cnf a continuación.
cd ~/ && mkdir myCA && mkdir -p myCA/signedcerts && mkdir myCA/private && cd myCAEsto creará los siguientes directorios en la carpeta raíz de su perfil de usuario:
Contenidos del directorio
~/myCA contiene certificado de CA, base de datos de certificados, certificados generados, claves y solicitudes
~/myCA/signedcerts contiene copias de cada certificado firmado
~/myCA/private contiene la clave privada
Crear la base de datos de certificados
echo '01' > serial && touch index.txtCrear archivo de configuración de autoridad de certificados
Cree caconfig.cnf utilizando vim o nano o el editor de texto de Linux que elija.
nano ~/myCA/caconfig.cnfEl contenido debe ser así:
# My sample caconfig.cnf file.
#
# Default configuration to use when one is not provided on the command line.
#
[ ca ]
default_ca = local_ca
#
#
# Default location of directories and files needed to generate certificates.
#
[ local_ca ]
dir = /root/myCA
certificate = $dir/cacert.pem
database = $dir/index.txt
new_certs_dir = $dir/signedcerts
private_key = $dir/private/cakey.pem
serial = $dir/serial
#
#
# Default expiration and encryption policies for certificates
#
default_crl_days = 365
default_days = 1825
# sha1 is no longer recommended, we will be using sha256
default_md = sha256
#
policy = local_ca_policy
x509_extensions = local_ca_extensions
#
#
# Copy extensions specified in the certificate request
#
copy_extensions = copy
#
#
# Default policy to use when generating server certificates.
# The following fields must be defined in the server certificate.
#
# NO CAMBIAR EL VALOR "supplied" DEBAJO CON NADA.
# It is the correct content.
#
[ local_ca_policy ]
commonName = supplied
stateOrProvinceName = supplied
countryName = supplied
emailAddress = supplied
organizationName = supplied
organizationalUnitName = supplied
#
#
# x509 extensions to use when generating server certificates
#
[ local_ca_extensions ]
basicConstraints = CA:false
#
#
# The default root certificate generation policy
#
[ req ]
default_bits = 2048
default_keyfile = /root/myCA/private/cakey.pem
#
# sha1 is no longer recommended, we will be using sha256
default_md = sha256
#
prompt = no
distinguished_name = root_ca_distinguished_name
x509_extensions = root_ca_extensions
#
#
# NOMBRE DE LA AUTORIDAD DE CERTIFICACION RAIZ
#
# CAMBIE EL CONTENIDO DE ESTOS VALORES PARA QUE COINCIDAN
# CON LOS DE SU EMPRESA!
#
[ root_ca_distinguished_name ]
commonName = Entidad Certificadora EMPRESTUR Cienfuegos
stateOrProvinceName = Cienfuegos
countryName = CU
emailAddress = [email protected]
organizationName = EMPRESTUR SUCURSAL CIENFUEGOS
organizationalUnitName = MINTUR
#
[ root_ca_extensions ]
basicConstraints = CA:trueAdvertencias para caconfig.cnf:
En la sección [local_ca], asegúrese de reemplazar con la ruta completa de nuestro perfil. NOTA: NO USE ~/myCA. No funciona.
Del mismo modo, cambie la configuración del archivo de clave predeterminado en la sección [req] para que sea la misma.
Deje la sección [local_ca_policy] sin modificar. commonName = supplied, etc. Son correctos y no deben sobrescribirse.
En la sección [root_ca_distinguished_name], reemplaza todos los valores a tu propia configuración.
Generar el certificado de Autoridad de Certificación (CA):
Ejecute el siguiente comando para que openssl elija las configuraciones automáticamente:
export OPENSSL_CONF=~/myCA/caconfig.cnfSeguido generamos los certificados raíces.
openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825Ingrese y vuelva a escribir la contraseña que desea usar para importar/exportar el certificado.
El certificado esta generado para una duracion de 5 años (1825 dias). Usted puede cambiar esos valores a su gusto.
NOTA: Recuerde esta contraseña, la necesitará a lo largo de este recorrido.
Una vez que haya terminado, debe tener los siguientes archivos:
Contenido del archivo
~/myCA/cacert.pem CA certificado público
~/myCA/private/cakey.pem clave privada de CA
En Windows, usaremos el archivo .crt en su lugar, así que cree uno usando el siguiente comando:
openssl x509 -in cacert.pem -out cacert.crtCreación de su certificado autofirmado con nombre alternativo del titular Subject Alternative Name (SAN)
Ahora que tiene su CA, puede crear el certificado SSL autofirmado real. Pero primero, necesitamos crear el archivo de configuración para ello. Así que de nuevo, usa vim o nano, etc. para crear el archivo. En este ejemplo, llamaré a mío certs_escfg.cnf ya que ese es mi dominio. Puedes llamarlo como quieras. Solo asegúrate de usar el nombre de archivo correcto en el comando de exportación (export) más adelante.
nano ~/myCA/certs_escfg.cnfA continuación se muestra el contenido de ~/myCA/certs_escfg.cnf:
#
# certs_escfg.cnf
#
[ req ]
prompt = no
distinguished_name = server_distinguished_name
req_extensions = v3_req
[ server_distinguished_name ]
commonName = escfg.tur.cu
stateOrProvinceName = Cienfuegos
countryName = CU
emailAddress = [email protected]
organizationName = EMPRESTUR SUCURSAL CIENFUEGOS
organizationalUnitName = MINTUR
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = localhost
DNS.2 = *.escfg.tur.cu
IP.1 = 10.122.193.1Advertencias para certs_escfg.cnf.
Cambie los valores en la sección [server_distinguished_name] para que coincida con su propia configuración.
En la sección [alt_names], cambie el valor de DNS.0 y DNS.1 a lo que necesite. Puede agregar tantos nombres DNS alternos como necesite siguiendo la secuencia, DNS.3 .4 etc. En mi caso configure todos los servicios webs que poseo usando wildcards.Tambien puede agregar Ip especificas de esos servidores, no es obligatorio.
NOTA: Es posible incrustar el rango de direcciones IP en el campo SubjectAltNames. Pero ninguno de los navegadores modernos confiaría en este tipo de certificado.
Una vez que haya creado el archivo de configuración, debe exportarlo:
export OPENSSL_CONF=~/myCA/certs_escfg.cnfAhora genera el certificado y la clave:
openssl req -newkey rsa:2048 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEMDe nuevo, proporcione la contraseña que ingresó anteriormente y espere a que finalice el comando.
A continuación, ejecute lo siguiente para crear el archivo de clave sin cifrar:
openssl rsa < tempkey.pem > server_key.pemDe nuevo, proporcione la contraseña que ingresó anteriormente y espere a que se complete el comando.
Ahora cambie la exportación a caconfig.cnf para que podamos firmar la nueva solicitud de certificado con la CA:
export OPENSSL_CONF=~/myCA/caconfig.cnfY firmela:
openssl ca -in tempreq.pem -out server_crt.pemDe nuevo, proporcione la contraseña que ingresó anteriormente y espere a que se complete el comando y simplemente escriba Y cuando le pida [y/n].
Ahora debes tener tu certificado autofirmado y la clave.
~/myCA/server_crt.pem Certificado SSL autofirmado
~/myCA/server_key.pem Clave privada del certificado SSL autofirmado
Despliegue de los certificados en los diferentes equipos y servicios.
Conversión de los archivos .pem a .pfx para uso de Windows modo local
En Windows, usamos principalmente archivos .pfx y .crt. Por lo tanto, necesitamos convertir el archivo .pem a .pfx. Usaremos cat para combinar server_key.pem y server_crt.pem en un archivo llamado hold.pem. Luego haremos la conversión usando el comando openssl pkcs12 como se muestra a continuación. Puede usar el texto que desee para describir su nuevo archivo .pfx en el parámetro -name.
cat server_key.pem server_crt.pem > hold.pem
openssl pkcs12 -export -out certs_escfg.pfx -in hold.pem -name "Certificado SSL autofirmado EMPRESTUR"De nuevo, proporcione la contraseña que ingresó anteriormente y espere a que se complete el comando.
Ahora debería tener los siguientes archivos que usaremos en la siguiente sección.
~/myCA/certs_escfg.pfx Certificado SSL autofirmado en formato PKCS # 12
~/myCA/cacert.crt Certificado de CA utilizado para firmar el certificado autofirmado
Instalar la nueva CA y certificados autofirmados en Windows.
Copiar certs_escfg.pfx y cacert.crt para su PC con windows. Para instalar la CA y los certificados autofirmados, todo lo que necesita hacer es hacer doble clic en el archivo desde donde los copió.
Una vez que hayas hecho clic, solo sigue los pasos de Instalar certificado. Para el Certificado de CA (cacert.crt), asegúrese de instalarlo en el Equipo Local, Entidades de Certificación raíz de confianza. Para el certificado autofirmado (certs_escfg.pfx), instálelo en Equipo local, ingrese la contraseña como anteriormente y guárdelo en Personal.
Desplegando el certificado raíz de nuestra CA en formato p7b (PKCS #7)
Ahora vamos a convertir nuestra CA para desplegarlo en Windows, hay que convertirlo al formato PKCS #7(.p7b):
openssl crl2pkcs7 -nocrl -certfile cacert.pem -out cacert_escfg.p7bAhora lo siguiente es meterlo para nuestro PCD y de ahí hacer el despliegue por GPO, para ello hacemos lo siguiente:
1- Abrir la consola de Administración de directivas de grupo.
2- Crear o editar una GPO.
3- Ir a Directivas -> Configuración de Windows -> Configuración de Seguridad -> Directivas de clave pública -> Entidades de certificación raíz de confianza
4- Clic derecho -> Importar
5- Siguiente
6- Examinar y buscamos cacert_escfg.p7b [en tipos de certificado poner Certificados PKCS #7]
7- Terminamos y cerramos la consola de administración
Desplegar nuestra CA en nuestros entornos GNU/Linux
cp cacert.pem /usr/local/share/ca-certificates/CA_ESCFG.crt
update-ca-certificatesDesplegando opciones para Firefox
Algunos navegadores pueden usar los certificados del repositorio del sistema operativo como Internet Explorer, Chrome y el Chromium, Firefox también tiene esa opción pero por defecto no está activada, como esto es para despliegue mostraré método para el Firefox versión FrontMotion y desplegando un .js y un .cfg para las versiones normales.
- Para la versión modificada por FrontMotion
Si usamos esta variante ya tendremos nuestro fichero de configuración mozilla.cfg por lo que solo tendremos que agregar al final de dicho fichero la línea.
lockPref("security.enterprise_roots.enabled", true);- Para la versión normal de Firefox
Tendremos que crear una carpeta en nuestro servidor compartida y en la cual pondremos el fichero mozilla.cfg que debe tener:
lockPref("security.enterprise_roots.enabled", true);Y otro llamado autoconfig.js y debe tener:
pref("general.config.filename", "mozilla.cfg");
pref("general.config.obscure_value", 0);Después hay que crear una GPO y editarla, y para ello hacemos lo siguiente:
1- Abrir la consola de Administración de directivas de grupo.
2- Crear o editar una GPO.
3- Ir a Preferencias -> Configuración de Windows -> Archivos
4- Clic derecho -> Nuevo -> Archivo
5- En acción seleccionamos Reemplazar
6- En Archivos de origen ponemos nuestro archivo autoconfig.js
7- En Archivo de destino pondremos %programfiles%\Mozilla Firefox\Defaults\Pref\autoconfig.js
8- Marcamos Suprimir errores en acciones de archivos individuales
Ahora empezamos de nuevo desde el paso 4
1- Clic derecho -> Nuevo -> Archivo
2- En acción seleccionamos Reemplazar
3- En Archivos de origen ponemos nuestro archivo enableroot.js
4- En Archivo de destino pondremos %programfiles%\Mozilla Firefox\mozilla.cfg
5- Marcamos Suprimir errores en acciones de archivos individuales
6- Aceptamos y cerramos la consola de administración
Haciendo que Android reconozca nuestra CA
Para esto tendremos que hacer una copia de nuestro cacert.pem y cambiarle la extensión a .crt
cp cacert.pem CA_ESCFG.crtAhora lo copiamos para nuestro Android o podemos ponerla en una web y acceder desde un navegador, de cualquier manera, ejecutamos CA_ESCFG.crt
nos pedirá ingresar nuestro PIN después le pondremos el nombre de la CA y en Uso de credenciales seleccionamos VPN y aplicaciones.
Ahora les mostrare mi aporte en este tutorial. Expondré los pasos para usar los certificados autofirmados en los servicios webs más comunes que usamos en nuestro quehacer diario. Empezamos con:
PFSENSE
En la web de pfsense ir a:
System/Certificate Manager/Certificates
Luego agregar un certificado (add/sing). En la opción método, escoger importar un certificado existente. Lo nombramos como queramos. Editamos nuestro server_crt.pem y copiamos todo desde:
-----BEGIN CERTIFICATE-----
hasta
-----END CERTIFICATE-----
incluyendo esas etiquetas. Y lo pegamos en el cuadro de datos del certificado.
Hacemos el proceso similar, pero usando server_key.pem y copiamos todo desde:
-----BEGIN CERTIFICATE-----
hasta
-----END CERTIFICATE-----
incluyendo esas etiquetas.Y lo pegamos en el cuadro de los datos de la llave. Y salvamos.
Ahora tenemos que configurar PFSense para que use el nuevo certificado. Para ello vamos a:
System/Advanced/Admin Access
Marcamos el protocolo https y debajo escogemos el certificado creado. Salvamos la configuración y la web se refrescará sola.
PROXMOX
Aqui es muy sencillo solo seria copiarlos al lugar correspondiente y reinciar el servicio web.
cp server_crt.pem /etc/pve/nodes/<node>/pveproxy-ssl.pem
cp server_key.pem /etc/pve/nodes/<node>/pveproxy-ssl.key
systemctl restart pveproxyFREENAS
Es muy parecido a como se procedió en el PFSense.En la web de FreeNas ir a:
Sistema/Certificados
Escoger importar certificado. Editamos nuestro server_crt.pem y copiamos todo desde:
-----BEGIN CERTIFICATE-----
hasta
-----END CERTIFICATE-----
incluyendo esas etiquetas. Y lo pegamos en el cuadro de datos del certificado.
Hacemos el proceso similar, pero usando server_key.pem y copiamos todo desde:
-----BEGIN CERTIFICATE-----
hasta
-----END CERTIFICATE-----
incluyendo esas etiquetas. Y lo pegamos en el cuadro de los datos de la llave. Y salvamos.
Luego vamos a:
Sistema /General
y donde dice certificado, escogemos el que acabamos de crear. Refrescamos la web.
PMG
Proxmox Mail Gateway usa claves y certificados para hacer conexiones seguras. La aplicación utiliza las claves y certificados almacenados en:
/etc/pmg/pmg-api.pem - Clave y certificado (combinados) utilizados por el servidor HTTPs (API)
/etc/pmg/pmg-tls.pem - Clave y certificado (combinados) para cifrar el tráfico de correo (TLS)
Como es la combinación de clave(key) y certificado(crt) editamos nuestra certificado (server_crt.pem):
nano server_crt.pem
Al final del fichero copiamos el contenido ENTERO de server_key.pem que es nuestra llave
cp server_crt.pem /etc/pmg/pmg-api.pem
systemctl restart pmgproxyNGINX
Para cualquier sitio web publicado con NGINX solo debemos agregar nuestra configuración SSL. Editamos el fichero de configuración de nuestro sitio que esta en /etc/nginx/sites-available/ y agregamos nuestra configuracion SSL.
# <- your SSL Settings here!
ssl_certificate /etc/ssl/nombre_del _sitio/server_crt.pem;
ssl_certificate_key /etc/ssl/nombre_del _sitio/server_key.pem;
ssl_trusted_certificate /etc/ssl/nombre_del _sitio/server_crt.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;Podemos guardar los certificados donde queramos, solo hay que especificar el camino a ellos. Luego de editado reinicamos nuestro NGINX.
service nginx restartAPACHE 2 (ZABBIX)
Primero, crearemos un fragmento de configuración de Apache para definir algunas configuraciones SSL. Esto configurará a Apache con un conjunto de cifrado SSL sólido y permitirá algunas características avanzadas que ayudarán a mantener nuestro servidor seguro.
nano /etc/apache2/conf-available/ssl-params.conf
Agregar esto:
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
# Disable preloading HSTS for now. You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets OffA continuación, modifiquemos /etc/apache2/sites-available/default-ssl.conf, el archivo predeterminado de Host Virtual de Apache SSL.
cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak
nano /etc/apache2/sites-available/default-ssl.conf
Borramos todo y agregamos esto:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin [email protected]
ServerName zabbix.mi.dominio.cu
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/server_crt.pem
SSLCertificateKeyFile /etc/ssl/private/server_key.pem
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>Copiamos nuestros certificados autofirmados donde corresponden
cp server_crt.pem /etc/ssl/certs/server_crt.pem
cp server_key.pem /etc/ssl/private/server_key.pemModificando el archivo host HTTP para redirigir a HTTPS
nano /etc/apache2/sites-available/000-default.conf
Entre las etiquetas de virtualhost agregar:
<VirtualHost *:80>
. . .
Redirect "/" "https://your_domain_or_IP/"
. . .
</VirtualHost>
En el caso de zabbix
Redirect "/" "https://zabbix.mi.dominio.cu/"Ahora que hemos realizado nuestros cambios, podemos habilitar los módulos de encabezados y SSL en Apache, habilitar nuestro Host virtual listo para SSL y luego reiniciar Apache para que estos cambios entren en vigor.
a2enmod ssl
a2enmod headers
a2ensite default-ssl
a2enconf ssl-params
Probamos:
apache2ctl configtest
service apache2 restartYa podemos acceder a nuestro sitio publicado con apache usando HTTPS o sin él ya que nos redirigía a el mismo.
Aun me quedan más web y servicios por explicar cómo agregarle el certificado autofirmado. A medida que vaya implementándolos iré poniéndolos aquí.
Espero que esta guía les sirva a todos. Sobre todo a aquellos que no quieren depender de entidades certificadoras de terceros.
alex out







No comments yet