Estoy tratando de configurar un único certificado SSL que hará que cualquier sitio web *.local funcione a través de https. Tengo todos los dominios .local que apuntan a mi máquina local. Los uso cuando desarrollo sitios web. Muchas funciones nuevas (ubicación geográfica, trabajadores de servicios, etc.) requieren un SSL.
Creo que para las versiones recientes de Chrome/Firefox, un certificado autofirmado de la vieja escuela ya no funciona.
A continuación se muestran los pasos que he seguido después de seguir una combinación de estas guías:
https://deliciousbrains.com/https-locally-without-browser-privacy-errors/
https://codeghar.wordpress.com/2008/03/17/create-a-certificate-authority-and-certificates-with-openssl/
https://stackoverflow.com/questions/27294589/creating-self-signed-certificate-for-domain-and-subdomains-neterr-cert-commo
Aquí está mi archivo de configuración:
#..................................
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /home/*****/Sites/root-ca
serial = $dir/serial
database = $dir/index.txt
new_certs_dir = $dir/certs
certificate = $dir/certs/cacert.pem
private_key = $dir/private/cakey.pem
default_days = 3000
default_md = sha256
preserve = no
email_in_dn = no
nameopt = default_ca
certopt = default_ca
policy = policy_match
copy_extensions = copyall
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
default_bits = 2048 # Size of keys
default_keyfile = key.pem # name of generated keys
default_md = md5 # message digest algorithm
string_mask = nombstr # permitted characters
distinguished_name = req_distinguished_name
req_extensions = v3_req
[ req_distinguished_name ]
# Variable name Prompt string
#------------------------- ----------------------------------
0.organizationName = Organization Name (company)
organizationalUnitName = Organizational Unit Name (department, division)
emailAddress = Email Address
emailAddress_max = 40
localityName = Locality Name (city, district)
stateOrProvinceName = State or Province Name (full name)
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
commonName = Common Name (hostname, IP, or your name)
commonName_max = 64
# Default values for the above, for consistency and less typing.
# Variable name Value
#------------------------ ------------------------------
0.organizationName_default = *****
localityName_default = *****
stateOrProvinceName_default = *****
countryName_default = *****
emailAddress_default = *****
[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName = @alternate_names
[ v3_req ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
[ alternate_names ]
DNS.1 = *.local
Primero creo una nueva autoridad certificadora:
openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out certs/cacert.pem -days 3000 -config conf/caconfig.cnf
He dado el nombre común aquí como mi nombre
Common Name (hostname, IP, or your name) []:Jonathan Hodgson
El archivo certs/cacert.pem
Luego importo a las autoridades de cromo, que funciona sin problemas.
Luego creo una solicitud de certificado:
openssl req -extensions v3_req -new -nodes -out local.req.pem -keyout private/local.key.pem -config conf/caconfig.cnf
He dado el nombre común aquí como *.local
Common Name (hostname, IP, or your name) []:*.local
Luego firmo la solicitud:
openssl ca -out certs/local.cert.pem -config conf/caconfig.cnf -infiles local.req.pem
Agrego los archivos a mi configuración http:
<VirtualHost *:80>
ServerName test.local
ServerAlias *.local
VirtualDocumentRoot /home/jonathan/Sites/%-2/public_html
CustomLog /home/jonathan/Sites/access.log vhost_combined
ErrorLog /home/jonathan/Sites/error.log
</VirtualHost>
<VirtualHost *:443>
ServerName test.local
ServerAlias *.local
VirtualDocumentRoot /home/jonathan/Sites/%-2/public_html
CustomLog /home/jonathan/Sites/access.log vhost_combined
ErrorLog /home/jonathan/Sites/error.log
SSLEngine On
SSLCertificateFile /home/jonathan/Sites/root-ca/certs/local.cert.pem
SSLCertificateKeyFile /home/jonathan/Sites/root-ca/private/local.key.pem
</VirtualHost>
He reiniciado apache pero sigo recibiendo NET::ERR_CERT_COMMON_NAME_INVALID
Tenía la impresión de que esto se debía a que necesitaba agregar el subjectAltName al archivo de configuración que hice.
Por favor, hágame saber qué debo hacer diferente.
Gracias de antemano por cualquier ayuda
Editar
Creo que el problema tiene que ver con el comodín. Si configuro los nombres alternativos en ejemplo.local y el nombre común para la solicitud en ejemplo.local, ejemplo.local se muestra como seguro tanto en Chrome como en Firefox.
Intenté establecer DNS.1 en local
y DNS.2 a *.local
, luego obtuve ERR_SSL_SERVER_CERT_BAD_FORMAT
en cromo y SEC_ERROR_REUSED_ISSUER_AND_SERIAL
en Firefox. Definitivamente restablecí mi archivo serial y mi archivo de índice antes de generar los certificados.
Respuesta aceptada:
Ha agregado SAN a la CSR pero no le dijiste a ca
para incluir extensiones de la CSR en el certificado. Consulte https://security.stackexchange.com/questions/150078/missing-x509-extensions-with-an-openssl-generated-certificate o la página man para ca
también en la web en copy_extensions
EDITAR:Tú también necesita especificar x509_extensions
en el ca
config, o equivalente pero menos conveniente, la opción de línea de comando -extensions
, en cualquier caso, apunta a una sección que existe pero que puede estar vacía si no desea ninguna extensión requerida por CA. No me di cuenta de esto al principio porque nunca había probado el caso de extensiones de CSR solo y no config, lo cual no es realista para la mayoría de las CA. Si especifica copy_extensions
distinto de none
(y el CSR tiene algunos) pero no especifique x509_extensions
entonces ca
lo hace poner las extensiones en el certificado pero no establezca la versión del certificado en v3 como lo requieren los estándares (como rfc5280) cuando las extensiones están presentes.
Es discutible si esto es un error; la página de manual dice x509_extensions/extensions
controla la configuración v3 y no diciendo algo similar sobre copy_extensions
implica que no, pero en mi humilde opinión es ciertamente una característica muy subóptima. EDITAR:es un error y se solucionará, pero hasta entonces use la solución alternativa, consulte https://unix.stackexchange.com/a/394465/59699
SIN EMBARGO:en mi prueba, esto en realidad no resolvió su problema. Aunque el certificado tiene *.local
en SAN y CN y (ahora) es válido, mi Firefox (53.0.2) y Chrome (59.0.3071.109) aún lo rechazan con SSL_ERROR_CERT_DOMAIN_ERROR y ERR_CERT_COMMON_NAME_INVALID respectivamente. Supuse que podrían no estar excluyendo local
de la lógica normal de más de 2 niveles y probé *.example.local
:Chrome lo acepta, pero Firefox no. También probé *.example.org
y tanto a Chrome como a IE11 les gusta eso pero aún no Firefox (y, por supuesto, asignarse nombres en TLD reales como .org
no es la forma en que se supone que funciona el DNS).
Esto me tiene atascado. Con algo de trabajo, se puede hacer que OpenSSL genere un certificado que contenga casi cualquier cosa que desee, pero que Firefox y Chrome aceptarán. Yo no sé. Intentaré investigar eso y actualizaré si encuentro algo.
Espero que te refieras diste *.local
como CommonName solo para el servidor CSR y NO para el certificado CA (autofirmado). Si los nombres de sujeto para CA y certificados de hoja son los mismos, nada funcionará de manera confiable. EDITAR:su Q editada confirma que eran correctamente diferentes. Aunque no menciona también especificar el país, el estado y la organización como lo requiere el ca
política que utilizó.
Tenga en cuenta que "autofirmado" es un término técnico y significa firmado con la misma clave . Su certificado de CA está autofirmado. El certificado de su servidor está firmado por usted mismo con su propia clave, pero no autofirmado. Tratar de aplicar instrucciones para un certificado autofirmado a un certificado no autofirmado era parte de su problema.
Y el punto de Gilles sobre md5 para el algoritmo de firma también es correcto.
EDITAR:'restablecer' serie (e índice) para un openssl ca
la configuración es una mala idea, a menos que descarte permanentemente el certificado CA y el nombre se usaron para. Los estándares dicen que una CA determinada no debe emitir más de un certificado con el mismo valor de serie en el certificado, y el archivo de serie es la forma en que openssl ca
(y también x509 -req
) implementa esto. Actualmente, las CA "reales" (públicas) ya no usan un contador simple, sino que incluyen entropía para bloquear ataques de colisión en PKI (google hashclash), pero esto no es un problema para una CA personal como la suya. Puedo creer fácilmente que un navegador (u otra fuente de confianza) no esté contento si ve múltiples certificados con el mismo nombre de serie y de CA, aunque NO esperaría que un navegador almacene de manera persistente un certificado de hoja y, por lo tanto, vea tanto los antiguos como los nuevos en un proceso a menos que sea de larga duración, a menos que lo importes a la tienda correspondiente, incluso en Firefox si lo conviertes en una "excepción" permanente.