GNU/Linux >> Tutoriales Linux >  >> Linux

Apache – ¿Crear un certificado SSL *.local?

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.

Relacionado:pantalla GNU:¿imprimir una sesión separada en la salida estándar?

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.

Relacionado:¿S mayúscula en los permisos de una carpeta?
Linux
  1. Creación de un archivo CSR de certificado web.

  2. ¿Qué es un Certificado SSL?

  3. Creación de redireccionamientos de Apache

  4. Plesk:instalación de SSL

  5. ‘Tipos de certificados SSL’

¿Qué es un Certificado SSL?

Cómo instalar un certificado SSL en CentOS 7

Creación de un certificado SSL autofirmado

Herramienta de comprobación de SSL

Cómo crear un certificado SSL autofirmado local en CentOS 8

Cómo comprobar la fecha de caducidad de SSL en Plesk