OpenSSL (Parte 2). Creación de una Autoridad Certificadora Raíz, ‘rootCA’.
Una Autoridad Certificadora CA es una entidad que firma certificados digitales. Si tienes un website en Internet necesitas que tus clientes vean que tienen una conexión segura, entonces tendrás que pagar a una Autoridad Certificadora Internacional, CA, de confianza como (VeriSign, DigiCert, Startssl,..) para que te firme tus dominios, máquinas y clientes.
En otros casos, por ejemplo Intranets, OpenVpn, no es necesario pagar para que una CA certifique nuestro dominio, podemos ejercer nosotros mismos de Autoridad Certificadora CA.
Introducción
El par de claves consiste en una clave privada, ‘fichero.key’, y una pública, ‘fichero.crt’. Este par de ficheros forman la identidad de nuestra CA.
‘fichero.key’: Este fichero es imprescindible que esté seguro pues es el que firma las claves públicas de sus dominios, máquinas y usuarios de confianza. Si alguien se hiciera con él podría ir firmando sitios de malware o fraudulentos en nuestro nombre.
Normalmente, la Autoridad Raíz ‘rootCA’ no es la que firma directamente los servidores o clientes. La Autoridad Raíz se usa para crear una o varias Entidades Certificadoras Intermedias, las cuales son de confianza para la Autoridad Raíz. Esta práctica es muy buena porque permite tener fuera de juego y a buen recaudo los ficheros de la Autoridad Raíz. Otro punto a favor es que de esta forma si una Autoridad Intermedia se ve comprometida, se puede revocar y no tenemos que deshacernos de nuestra Autoridad Raíz ‘rootCA’.
Preparar la estructura de archivos y directorios
Todas las llaves y certificados se guardarán en ‘/root/ca/’.
mkdir -p ~/ca/{certs,crl,csr,newcerts,private} chmod 700 ~/ca/private touch ~/ca/index.txt echo 1000 > ~/ca/serial
Los ficheros ‘index.txt’ y ‘serial’ son ficheros de texto plano que tienen el papel de ‘base de datos’ para seguir la pista a los certificados firmados.
Preparar el fichero de configuración ‘/root/ca/openssl.cnf’
En los comentarios del fichero están explicadas todas las opciones que se van pasando.
# Esta sección es mandatoria # le dice a OpenSSL que use las opciones de la sección [ CA_default ] [ ca ] # `man ca` default_ca = CA_default # Hay que asegurarse que las rutas aquí definidas existen antes de ejecutar Openssl [ CA_default ] # Localización de ficheros y directorios dir = /root/ca certs = $dir/certs crl_dir = $dir/crl new_certs_dir = $dir/newcerts database = $dir/index.txt serial = $dir/serial RANDFILE = $dir/private/.rand # la clave y certificado raíz private_key = $dir/private/ca.key.pem certificate = $dir/certs/ca.cert.pem # Para la lista de revocación de certificados crlnumber = $dir/crlnumber crl = $dir/crl/ca.crl.pem crl_extensions = crl_ext default_crl_days = 30 # SHA-1 está obsoleto, usar SHA2 en su lugar default_md = sha256 name_opt = ca_default cert_opt = ca_default default_days = 365 preserve = no policy = policy_strict # política estricta: la autoridad raíz es la única usada para crear # certificados intermedios # Esta política se usará en las firmas que realice al Autoridad Raíz # Esta política requiere que: # - El país, la provincia y el nombre de la organización, deben coincidir # con los del certificado Raíz # - El nombre ON, CN y email son obligatorios [ policy_strict ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = supplied commonName = supplied emailAddress = supplied # política relajada: Permite a las Autoridades Intermedias # firmar certificados de terceras partes # Esta política se usará en las firmas que realice la Autoridad Intermedia # Esta política requiere que: # - Se exige la introducción de todos los campos # - El ON debe coincidir con la Autoridad Certificadora Intermedia [ policy_loose ] countryName = supplied stateOrProvinceName = supplied localityName = supplied organizationName = match organizationalUnitName = supplied commonName = supplied emailAddress = supplied # Estas opciones se aplican cuando se crean certificados # o hay peticiones de firmas de certificados [ req ] # Opciones para la herramienta `req` (`man req`). default_bits = 4096 distinguished_name = req_distinguished_name string_mask = utf8only # SHA-1 está obsoleto, usar SHA2 en su lugar default_md = sha256 # Extensión a añadir cuando se usa la opción -x509 x509_extensions = v3_ca # Información requerida y por defecto cuando se firma un certificado [ req_distinguished_name ] countryName = Nombre del país (Código de 2 letras) stateOrProvinceName = Provincia o Estado localityName = Nombre de la localidad 0.organizationName = Nombre de la organización organizationalUnitName = Nombre de la unidad organizativa commonName = Nombre Común emailAddress = Correo electrónico # Opcionalmente se pueden especificar algunos valores por defecto countryName_default = ES stateOrProvinceName_default = Sevilla localityName_default = Dos Hermanas 0.organizationName_default = GrupoCSAD Ltd. organizationalUnitName_default = GrupoCSAD Autoridad Certificadora del Gonzalo Nazareno emailAddress_default = domainmaster@grupocsad.gonzalonazareno.org # Estas extensiones se aplican cuando se firman certificados # hay que pasar `-extensions v3_ca` para aplicar esta opciones [ v3_ca ] # Extensiones para una típica CA (`man x509v3_config`). subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign # Esta sección se aplicará en la creación del certificado intermedio. # pathlen:0 <<-- Se asegura que el certificado intermedio no puede # emitir otras autoridades intermedias [ v3_intermediate_ca ] # Extensiones típicas para una CA Intermedia (`man x509v3_config`). subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true, pathlen:0 keyUsage = critical, digitalSignature, cRLSign, keyCertSign # Esta sección se aplicará al firmar certificados de clientes [ usr_cert ] # Extensiones para los certificados clientes (`man x509v3_config`). basicConstraints = CA:FALSE nsCertType = client, email nsComment = "OpenSSL Generated Client Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth, emailProtection # Esta sección se aplicará al firmar certificados de servidores [ server_cert ] # Extensiones para certificados de servidores (`man x509v3_config`). basicConstraints = CA:FALSE nsCertType = server nsComment = "OpenSSL Generated Server Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer:always keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth # esta sección lo único que hace es firmar y asegurarse que # lleva los atributos que yo estimo oportunos [ only_sign ] basicConstraints = CA:FALSE nsComment = "OpenSSL Generated Server Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer:always # esta sección se aplica al crear listas de certificados de revocación [ crl_ext ] # Extension for CRLs (`man x509v3_config`). authorityKeyIdentifier = keyid:always # Esta sección se aplicará cuando se firmen certificados de # Protocolo de Estado de Certificados en línea # Online Certificate Status Protocol [ ocsp ] # Extensión para firma de certificados OCSP (`man ocsp`). basicConstraints = CA:FALSE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer keyUsage = critical, digitalSignature extendedKeyUsage = critical, OCSPSigning
Crear la clave raíz
Mantener en lugar fresco, seco y alejado de la luz del sol este fichero ‘ca.key.pem’ 😀
.
Se cifrará la clave raíz con el protocolo ‘AES 256-bit’ y una contraseña fuerte.
root@servidor:~# cd ca root@servidor:~/ca# openssl genrsa -aes256 -out private/ca.key.pem 4096 Generating RSA private key, 4096 bit long modulus ....................................................................................++ .....................................++ e is 65537 (0x10001) Enter pass phrase for private/ca.key.pem: Verifying - Enter pass phrase for private/ca.key.pem: root@servidor:~/ca# chmod 400 private/ca.key.pem
Crear el certificado raíz
Ahora hay que usar la clave anterior para crear el certificado ‘ca.cert.pem’. Le daré 20 años porque una vez que expire el certificado raíz todos los certificados firmados por la CA Raíz no serán válidos.
Este es el certificado que deben tener los que quieran entrar en nuestra web, así todos los certificados firmados con la Autoridad Intermedia serán válidos.
root@servidor:~/ca# openssl req -config openssl.cnf \ -key private/ca.key.pem \ -new -x509 -days 7300 -extensions v3_ca \ -out certs/ca.cert.pem Enter pass phrase for private/ca.key.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. ----- Nombre del país (Código de 2 letras) [ES]: Provincia o Estado [Sevilla]: Nombre de la localidad [Dos Hermanas]: Nombre de la organización [GrupoCSAD Ltd.]: Nombre de la unidad organizativa [GrupoCSAD Autoridad Certificadora del Gonzalo Nazareno]: Nombre Común []:GrupoCSAD Autoridad Raíz Correo electrónico [domainmaster@grupocsad.gonzalonazareno.org]: root@servidor:~/ca#
Comentarios recientes