¿Me estoy perdiendo de algo? ¿Es esta la forma correcta de crear un certificado autofirmado?
Es fácil crear un certificado autofirmado. Solo usa el openssl req
comando. Puede ser complicado crear uno que pueda ser consumido por la mayor selección de clientes, como navegadores y herramientas de línea de comandos.
Es difícil porque los navegadores tienen sus propios requisitos y son más restrictivos que el IETF . Los requisitos utilizados por los navegadores están documentados en los foros de CA / Navegador (ver referencias a continuación). Las restricciones surgen en dos áreas clave: (1) anclas de confianza y (2) nombres DNS.
Los navegadores modernos (como el warez que estamos usando en 2014/2015) quieren un certificado que se encadene a un ancla de confianza, y quieren que los nombres DNS se presenten de manera particular en el certificado. Y los navegadores se mueven activamente contra certificados de servidor autofirmados.
Algunos navegadores no facilitan la importación de un certificado de servidor autofirmado. De hecho, no puedes con algunos navegadores, como el navegador de Android. Entonces, la solución completa es convertirse en su propia autoridad.
En ausencia de convertirse en su propia autoridad, debe obtener los nombres DNS correctos para dar al certificado la mayor posibilidad de éxito. Pero te animo a que te conviertas en tu propia autoridad. Es fácil convertirse en su propia autoridad, y evitará todos los problemas de confianza (¿en quién mejor confiar que usted?).
¡Probablemente este no sea el sitio que estás buscando!
Certificado de seguridad del sitio no es de confianza!
Esto se debe a que los navegadores usan una lista predefinida de anclas de confianza para validar los certificados del servidor. Un certificado autofirmado no se encadena a un ancla de confianza.
La mejor manera de evitar esto es:
- Cree su propia autoridad (es decir, conviértase en CA )
- Crear una solicitud de firma de certificado (CSR) para el servidor
- Firme el CSR del servidor con su clave CA
- Instale el certificado del servidor en el servidor
- Instale el certificado de CA en el cliente
Paso 1: crear su propia autoridad solo significa crear un certificado autofirmado con CA: true
un uso adecuado de la clave. Eso significa que el Sujeto y el Emisor son la misma entidad, CA se establece en verdadero en Restricciones básicas (también debe marcarse como crítico), el uso de la clave es keyCertSign
y crlSign
(si está utilizando CRL), y el Identificador de clave del sujeto (SKI) es lo mismo que el Identificador de clave de autoridad (AKI).
Para convertirse en su propia autoridad de certificación, consulte * ¿Cómo firma una solicitud de firma de certificado con su autoridad de certificación? en desbordamiento de pila. Luego, importe su CA al Trust Store que utiliza el navegador.
Los pasos 2 a 4 son más o menos lo que hace ahora para un servidor público cuando contrata los servicios de una CA como Startcom o CAcert . Los pasos 1 y 5 le permiten evitar la autoridad de un tercero y actuar como su propia autoridad (¿en quién es mejor confiar que usted mismo?).
La siguiente mejor manera de evitar la advertencia del navegador es confiar en el certificado del servidor. Pero algunos navegadores, como el navegador predeterminado de Android, no te permiten hacerlo. Por lo tanto, nunca funcionará en la plataforma.
El problema de los navegadores (y otros agentes de usuario similares) que no confían en los certificados autofirmados será un gran problema en Internet de las cosas (IoT). Por ejemplo, ¿qué sucederá cuando se conecte a su termostato o refrigerador para programarlo? La respuesta es, nada bueno en lo que respecta a la experiencia del usuario.
El Grupo de trabajo WebAppSec del W3C está comenzando a analizar el problema. Consulte, por ejemplo, Propuesta: Marcar HTTP como no seguro .
Cómo crear un certificado autofirmado con OpenSSL
Los comandos a continuación y el archivo de configuración crean un certificado autofirmado (también le muestra cómo crear una solicitud de firma). Se diferencian de otras respuestas en un aspecto: los nombres DNS utilizados para el certificado autofirmado están en el Nombre alternativo del sujeto (SAN) y no en el Nombre común (CN) .
Los nombres DNS se colocan en la SAN a través del archivo de configuración con la línea subjectAltName = @alternate_names
(no hay forma de hacerlo a través de la línea de comando). Luego hay una alternate_names
sección en el archivo de configuración (debe ajustar esto a su gusto):
[ alternate_names ]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = mail.example.com
DNS.4 = ftp.example.com
# Add these if you need them. But usually you don't want them or
# need them in production. You may need them for development.
# DNS.5 = localhost
# DNS.6 = localhost.localdomain
# IP.1 = 127.0.0.1
# IP.2 = ::1
Es importante poner el nombre DNS en la SAN y no en la CN, porque tanto el IETF como los foros CA / Browser especifican la práctica. También especifican que los nombres DNS en el CN están en desuso (pero no están prohibidos). Si coloca un nombre DNS en la CN, debe incluirse en la SAN según las políticas de CA / B. Por lo tanto, no puede evitar usar el Nombre alternativo del sujeto.
Si no coloca nombres DNS en la SAN, el certificado no se validará bajo un navegador y otros agentes de usuario que sigan las pautas de CA / Browser Forum.
Relacionado: los navegadores siguen las políticas de CA / Browser Forum; y no las políticas de IETF. Esa es una de las razones por las que un certificado creado con OpenSSL (que generalmente sigue al IETF) a veces no se valida bajo un navegador (los navegadores siguen la CA / B). Son estándares diferentes, tienen diferentes políticas de emisión y diferentes requisitos de validación.
Cree un certificado autofirmado (observe la adición de la -x509
opción):
openssl req -config example-com.conf -new -x509 -sha256 -newkey rsa:2048 -nodes \
-keyout example-com.key.pem -days 365 -out example-com.cert.pem
Cree una solicitud de firma (observe la falta de -x509
opción):
openssl req -config example-com.conf -new -sha256 -newkey rsa:2048 -nodes \
-keyout example-com.key.pem -days 365 -out example-com.req.pem
Imprima un certificado autofirmado :
openssl x509 -in example-com.cert.pem -text -noout
Imprima una solicitud de firma :
openssl req -in example-com.req.pem -text -noout
Archivo de configuración (aprobado mediante -config
opción)
[ req ]
default_bits = 2048
default_keyfile = server-key.pem
distinguished_name = subject
req_extensions = req_ext
x509_extensions = x509_ext
string_mask = utf8only
# The Subject DN can be formed using X501 or RFC 4514 (see RFC 4519 for a description).
# Its sort of a mashup. For example, RFC 4514 does not provide emailAddress.
[ subject ]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = NY
localityName = Locality Name (eg, city)
localityName_default = New York
organizationName = Organization Name (eg, company)
organizationName_default = Example, LLC
# Use a friendly name here because it's presented to the user. The server's DNS
# names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
# by both IETF and CA/Browser Forums. If you place a DNS name here, then you
# must include the DNS name in the SAN too (otherwise, Chrome and others that
# strictly follow the CA/Browser Baseline Requirements will fail).
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Example Company
emailAddress = Email Address
emailAddress_default = test@example.com
# Section x509_ext is used when generating a self-signed certificate. I.e., openssl req -x509 ...
[ x509_ext ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
# You only need digitalSignature below. *If* you don't allow
# RSA Key transport (i.e., you use ephemeral cipher suites), then
# omit keyEncipherment because that's key transport.
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
# RFC 5280, Section 4.2.1.12 makes EKU optional
# CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
# In either case, you probably only need serverAuth.
# extendedKeyUsage = serverAuth, clientAuth
# Section req_ext is used when generating a certificate signing request. I.e., openssl req ...
[ req_ext ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
# RFC 5280, Section 4.2.1.12 makes EKU optional
# CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
# In either case, you probably only need serverAuth.
# extendedKeyUsage = serverAuth, clientAuth
[ alternate_names ]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = mail.example.com
DNS.4 = ftp.example.com
# Add these if you need them. But usually you don't want them or
# need them in production. You may need them for development.
# DNS.5 = localhost
# DNS.6 = localhost.localdomain
# DNS.7 = 127.0.0.1
# IPv6 localhost
# DNS.8 = ::1
Es posible que deba hacer lo siguiente para Chrome. De lo contrario, Chrome puede quejarse de que un Nombre común no es válido ( ERR_CERT_COMMON_NAME_INVALID
) . No estoy seguro de cuál es la relación entre una dirección IP en la SAN y un CN en este caso.
# IPv4 localhost
# IP.1 = 127.0.0.1
# IPv6 localhost
# IP.2 = ::1
Existen otras reglas sobre el manejo de nombres DNS en los certificados X.509 / PKIX. Consulte estos documentos para conocer las reglas:
RFC 6797 y RFC 7469 se enumeran, porque son más restrictivos que los otros RFC y documentos CA / B. Las RFC 6797 y 7469 tampoco permiten una dirección IP.