¿Cómo hacer un certificado autofirmado para localhost?


23

Lo hice con una contraseña y con los siguientes campos como root

openssl req -x509 -days 365 -newkey rsa:2048 -keyout /etc/ssl/apache.key \
    -out /etc/ssl/apache.crt

Campos

Country: FI
State: Pirkanmaa
Locality: Tampere
Organization: masi
Organizational Unit Name: SSL Certificate Test
CommonName: 192.168.1.107/owncloud
EmailAddress: masi@gmail.com

Salida: error de protocolo de enlace SSL en HTTPS. Salida esperada: conexión HTTPS. HTTP funciona.

CommonName debe incluir la URL a la que desea ir, el hilo de owncloud aquí . He intentado sin éxito en commonname

  • 192.168.1.107/owncloud
  • 192.168.1.107/

Prueba del sistema operativo para el servidor: Debian 8.5.
Servidor: Raspberry Pi 3b. Owncloud-server: 8.2.5. Owncloud-client: 2.1.1. Sistemas-cliente: Debian 8.5.


Si está buscando generar un nuevo certificado SSL utilizando SAN para localhost, los pasos en esta publicación funcionaron para mí Centos 7 / Vagrant / Chrome Browser.
Damodar Bashyal

@DamodarBashyal Por favor, no proporcione solo la respuesta del enlace, sino también alguna descripción como respuesta.
Léo Léopold Hertz 준영

Respuestas:


11

openssl req -x509 -days 365 -newkey rsa: 2048 -keyout /etc/ssl/apache.key -out /etc/ssl/apache.crt

No puede usar este comando para generar un certificado X.509 bien formado. Su formato será incorrecto porque el nombre de host se coloca en el Nombre común (CN) . La colocación de un nombre de host o una dirección IP en el CN ​​está en desuso por parte de IETF (la mayoría de las herramientas, me gusta wgety curl) y de los foros de CA / B (CA y navegadores).

De acuerdo con los foros IETF y CA / B, los nombres de los servidores y las direcciones IP siempre van en el Nombre alternativo del sujeto (SAN) . Para conocer las reglas, consulte el RFC 5280, el Certificado de Infraestructura de Clave Pública de Internet X.509 y el Perfil de la Lista de Revocación de Certificados (CRL) y los Requisitos de Referencia del Foro de CA / Navegador .

En su mayoría, necesita usar un archivo de configuración de OpenSSL y adaptarlo a sus necesidades. A continuación se muestra un ejemplo de uno que uso. Se llama example-com.confy se pasa al comando OpenSSL a través de -config example-com.conf.


También tenga en cuenta así : todas las máquinas dicen ser localhost, localhost.localdomainetc. Tenga cuidado con la emisión de certificados para localhost. No digo que no lo hagas; solo entiendo que hay algunos riesgos involucrados.

Las alternativas localhostson: (1) ejecutar DNS y emitir certificados para el nombre DNS de la máquina. O, (2) use IP estática e incluya la dirección IP estática.


Los navegadores aún le darán advertencias sobre un certificado autofirmado que no se encadena a una raíz confiable. Las herramientas tienen gusto curly wgetno se quejarán, pero aún así debe confiar en su propia firma con una opción como cURL's --cafile. Para superar el problema de confianza del navegador, debe convertirse en su propia CA.

"Convertirse en su propia CA" se conoce como ejecutar una PKI privada. No hay mucho de eso. Puede hacer todo lo que una CA pública puede hacer. Lo único diferente es que necesitará instalar su certificado de CA raíz en las distintas tiendas. No es diferente a, digamos, usar cURL's cacerts.pm. cacerts.pmes solo una colección de Root CA's, y ahora te has unido al club.

Si se convierte en su propia CA, asegúrese de grabar su clave privada de CA raíz en un disco y mantenerla fuera de línea. Luego, colóquelo en su unidad de CD / DVD cuando necesite firmar una solicitud de firma. Ahora está emitiendo certificados como una CA pública.

Nada de esto es terriblemente difícil una vez que firma una o dos solicitudes de firma. He estado ejecutando un PKI privado durante años en la casa. Todos mis dispositivos y gadgets confían en mi CA.

Para obtener más información sobre cómo convertirse en su propia CA, consulte ¿Cómo firmar la Solicitud de firma de certificado con su Autoridad de certificación y Cómo crear un certificado autofirmado con openssl? .


De los comentarios en el archivo de configuración a continuación ...

Autofirmado (tenga en cuenta la adición de -x509)

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

Solicitud de firma (tenga en cuenta la falta de -x509)

openssl req -config example-com.conf -new -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem

Imprima un autofirmado

openssl x509 -in example-com.cert.pem -text -noout

Imprimir una solicitud de firma

openssl req -in example-com.req.pem -text -noout

Archivo de configuración

# Self Signed (note the addition of -x509):
#     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
# Signing Request (note the lack of -x509):
#     openssl req -config example-com.conf -new -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem
# Print it:
#     openssl x509 -in example-com.cert.pem -text -noout
#     openssl req -in example-com.req.pem -text -noout

[ 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).
#   It's 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

#  If RSA Key Transport bothers you, then remove keyEncipherment. TLS 1.3 is removing RSA
#  Key Transport in favor of exchanges with Forward Secrecy, like DHE and ECDHE.
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
# 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
# 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
# DNS.9     = fe80::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

¿Puede agregar la ruta predeterminada al archivo de configuración? - - ¿Puedes mostrar el flujo de trabajo completo? Acerca de pasar el archivo al comando openssl, etc. - No pude tener éxito con la respuesta anterior, por lo que se agradece toda la información necesaria.
Léo Léopold Hertz 준영

@Masi: "¿Puede agregar la ruta predeterminada al archivo de configuración?" - No estoy seguro de lo que quieres decir. Puedes guardarlo donde quieras. Lo ejecuto desde el escritorio en muchas máquinas, y mi directorio personal en otras. Me di cuenta de que lo usabas sudo. Tal vez su .rndarchivo es propiedad de root. Si es así, prueba a sudo chown -R masi:masi /home/masi. Entonces podrás leerlo y escribirle.

Ahora estoy usando solo Debian, no Ubuntu, así que solo root. Por favor, agregue su flujo de trabajo como un ejemplo sobre el archivo keepinv en el escritorio y pase adelante. No tengo una imagen clara sobre el sistema.
Léo Léopold Hertz 준영

1
Ejecute uno de los comandos enumerados en la cabecera del archivo. Los comentarios están ahí para copiar / pegar. Elige el que mejor se adapte a tu gusto. Si todavía está intentando generar un autofirmado, entonces ejecuta el comando que contiene x509(tal como dice el comentario).

El autor solicitó la eliminación de esta publicación "debido a los cambios de CA / B", pero debido a la cantidad de votos y la ayuda potencial que ha brindado a lo largo de los años, la he restaurado. Tome el consejo en la publicación tal como se le dio cuando se le dio.
Jeff Schaller

1

El CommonNamedebe corresponder con lo que se envíe como Host: encabezado en la solicitud HTTP. En su caso, eso sería 192.168.1.107 (sin una barra inclinada).

Configurar el nombre de host para un servidor web

Personalmente, configuraría un nombre de host amigable para el servidor web. En su configuración de Apache de correo electrónico o configuración de host virtual (probablemente /etc/apache2/sites-enabled/000-default.confpara distribuciones basadas en Debian), use la directiva ServerNameo ServerAlias, por ejemplo,

ServerName owncloud.masi

Reinicie Apache y luego configure DNS o (más simplemente) agregue una entrada en cada cliente /etc/hostspara apuntarla a la dirección IP correcta, por ejemplo,

192.168.1.107   owncloud.masi

Mi propio acceso a la nube está en 192.168.1.107. El otro hilo dice que debes incluir el subdominio. Creo que eso implica 192.168.1.107/owncloud. Sin embargo, puedo estar equivocado.
Léo Léopold Hertz 준영

Supongamos que usted utiliza ServerName owncloud.masien .../sites-enabled/000-default.conf. ¿El nombre común de la clave SSL es owncloud.masi ?
Léo Léopold Hertz 준영

¿Dejará de funcionar la dirección IP? Del mismo modo si lo usas ServerAlias?
Léo Léopold Hertz 준영

1
El acceso a través de la dirección IP debería seguir funcionando para HTTP. Por cierto, hemos alcanzado los límites de comentarios (por lo que he eliminado mis respuestas anteriores a sus preguntas) y tendré que desconectarme pronto.
Anthony G - justicia para Monica

1
"El CommonName debe corresponder con lo que se envíe como el Host: encabezado en la solicitud HTTP" - Incorrecto. Colocar un nombre de host es el Nombre común que está en desuso por los foros IETF y CA / B. Los nombres de servidor y las direcciones IP siempre van en el Nombre alternativo del sujeto según los foros IETF y CA / B. Consulte también ¿Cómo firma la Solicitud de firma de certificado con su Autoridad de certificación y Cómo crear un certificado autofirmado con openssl?
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.