Estoy agregando soporte HTTPS a un dispositivo Linux incorporado. He intentado generar un certificado autofirmado con estos pasos:
openssl req -new > cert.csr
openssl rsa -in privkey.pem -out key.pem
openssl x509 -in cert.csr -out cert.pem -req -signkey key.pem -days 1001
cat key.pem>>cert.pem
Esto funciona, pero obtengo algunos errores con, por ejemplo, Google Chrome:
¡Probablemente este no sea el sitio que estás buscando!
Certificado de seguridad del sitio no es de confianza!
¿Me estoy perdiendo de algo? ¿Es esta la forma correcta de crear un certificado autofirmado?
ssl
openssl
certificate
ssl-certificate
x509certificate
michelemarcon
fuente
fuente
alternate_names
sección y pasarlo con la-config
opción. Además, colocar un nombre DNS en el nombre común (CN) está en desuso (pero no está prohibido) tanto por el IETF como por los foros de CA / navegador. Cualquier nombre DNS en el CN también debe estar presente en la SAN. No hay forma de evitar usar la SAN. Ver la respuesta a continuación.Respuestas:
Puedes hacerlo con un solo comando:
También puede agregar
-nodes
(abreviaturano DES
) si no desea proteger su clave privada con una frase de contraseña. De lo contrario, le pedirá una contraseña de "al menos 4 caracteres".El
days
parámetro (365) puede reemplazarse con cualquier número para afectar la fecha de vencimiento. Luego le pedirá cosas como "Nombre del país", pero puede presionar Entery aceptar los valores predeterminados.Agregue
-subj '/CN=localhost'
para suprimir preguntas sobre el contenido del certificado (reemplacelocalhost
con el dominio deseado).Los certificados autofirmados no se validan con ningún tercero a menos que los importe previamente a los navegadores. Si necesita más seguridad, debe usar un certificado firmado por una autoridad de certificación (CA).
fuente
-subj "/C=US/ST=Oregon/L=Portland/O=Company Name/OU=Org/CN=www.example.com"
-sha256
para generar un certificado basado en SHA-256.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?).
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:
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 eskeyCertSign
ycrlSign
(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 .
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 unaalternate_names
sección en el archivo de configuración (debe ajustar esto a su gusto):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):Cree una solicitud de firma (observe la falta de
-x509
opción):Imprima un certificado autofirmado :
Imprima una solicitud de firma :
Archivo de configuración (aprobado mediante
-config
opción)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.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.
fuente
alternate_names
sección? Particularmente subdominios sub-sub. Tengo una pregunta hace referencia a esta respuesta aquí: serverfault.com/questions/711596/...Estas son las opciones descritas en la respuesta de @ diegows , descritas con más detalle, de la documentación :
La documentación es en realidad más detallada que la anterior; Lo acabo de resumir aquí.
fuente
XXX
comando original debe reemplazarse por el "número de días para certificar el certificado". El valor predeterminado es de 30 días. Por ejemplo, se-days XXX
convierte-days 365
si desea que su certificado sea válido durante 365 días. Ver los documentos para más .A partir de 2020, el siguiente comando satisface todas sus necesidades, incluida SAN:
En OpenSSL ≥ 1.1.1, esto se puede acortar a:
Crea un certificado que es
example.com
yexample.net
(SAN),10.0.0.1
(SAN),3650
días (~ 10 años).Crea los siguientes archivos:
example.key
example.crt
Toda la información se proporciona en la línea de comando. No hay entrada interactiva que te moleste. No hay archivos de configuración con los que deba meterse. Todos los pasos necesarios se ejecutan mediante una sola invocación de OpenSSL : desde la generación de clave privada hasta el certificado autofirmado.
Observación # 1: parámetros criptográficos
Dado que el certificado está autofirmado y los usuarios deben aceptarlo manualmente, no tiene sentido usar una caducidad breve o una criptografía débil.
En el futuro, es posible que desee utilizar más de
4096
bits para la clave RSA y un algoritmo hash más fuerte quesha256
, pero a partir de 2020, estos son valores razonables. Son lo suficientemente fuertes mientras son compatibles con todos los navegadores modernos.Observación # 2: Parámetro "
-nodes
"Teóricamente, podría omitir el
-nodes
parámetro (que significa "sin cifrado DES"), en cuyo casoexample.key
se cifraría con una contraseña. Sin embargo, esto casi nunca es útil para la instalación de un servidor, ya que también tendría que almacenar la contraseña en el servidor, o tendría que ingresarla manualmente en cada reinicio.Observación # 3: Ver también
fuente
//CN=localhost
lugar de/CN=localhost
? ¿Ayudará el escape adecuado aquí? Por ejemplo, ¿reemplazar/CN=localhost
con"/CN=localhost"
resolver el problema de una manera limpia?No puedo comentar, así que pondré esto como una respuesta separada. Encontré algunos problemas con la respuesta de una línea aceptada:
Aquí hay una versión simplificada que elimina la frase de contraseña, aumenta la seguridad para suprimir las advertencias e incluye una sugerencia en los comentarios para pasar en -subj para eliminar la lista de preguntas completa:
Reemplace 'localhost' con cualquier dominio que necesite. Deberá ejecutar los dos primeros comandos uno por uno, ya que OpenSSL solicitará una frase de contraseña.
Para combinar los dos en un archivo .pem:
fuente
cat server.crt server.key >foo-cert.pem
. Funciona con el ejemplo enopenssl-1.0.2d/demos/ssl/
FreeBSD 10
OpenLDAP 2.4
conTLS
Los navegadores modernos ahora arrojan un error de seguridad para los certificados autofirmados de otro modo bien formados si les falta una SAN (Nombre alternativo del sujeto). OpenSSL no proporciona una forma de línea de comandos para especificar esto , por lo que muchos tutoriales y marcadores de desarrolladores quedan desactualizados de repente.
La forma más rápida de volver a ejecutar es un archivo de configuración corto e independiente:
Crear un archivo de configuración de OpenSSL (ejemplo:
req.cnf
)Cree el certificado haciendo referencia a este archivo de configuración
Ejemplo de configuración de https://support.citrix.com/article/CTX135602
fuente
-sha256
.-extension 'subjectAltName = DNS:dom.ain, DNS:oth.er'
ver github.com/openssl/openssl/pull/4986-addext
ahora.Recomendaría agregar el parámetro -sha256 , para usar el algoritmo hash SHA-2, porque los principales navegadores están considerando mostrar "certificados SHA-1" como no seguros.
La misma línea de comando de la respuesta aceptada - @diegows con agregado -sha256
Más información en el blog de Google Security .
Actualización de mayo de 2018. Como muchos señalaron en los comentarios, el uso de SHA-2 no agrega ninguna seguridad a un certificado autofirmado. Pero todavía recomiendo usarlo como un buen hábito de no usar funciones hash criptográficas obsoletas / inseguras. La explicación completa está disponible en ¿Por qué está bien que los certificados por encima del certificado de entidad final estén basados en SHA-1? .
fuente
Este es el script que uso en cuadros locales para configurar el SAN (subjectAltName) en certificados autofirmados.
Este script toma el nombre de dominio (example.com) y genera la SAN para * .example.com y example.com en el mismo certificado. Las secciones a continuación están comentadas. Asigne un nombre al script (p
generate-ssl.sh
. Ej. ) Y dele permisos de ejecución. Los archivos se escribirán en el mismo directorio que el script.Chrome 58 en adelante requiere que SAN se configure en certificados autofirmados.
Este script también escribe un archivo de información, por lo que puede inspeccionar el nuevo certificado y verificar que la SAN esté configurada correctamente.
Si está utilizando Apache, puede hacer referencia al certificado anterior en su archivo de configuración de la siguiente manera:
Recuerde reiniciar su servidor Apache (o Nginx, o IIS) para que el nuevo certificado surta efecto.
fuente
localhost
o127.0.0.1:port#
lo que sería el correspondienteCN
para algo como esto.2017 one-liner:
Esto también funciona en Chrome 57, ya que proporciona la SAN, sin tener otro archivo de configuración. Fue tomado de una respuesta aquí .
Esto crea un único archivo .pem que contiene la clave privada y el certificado. Puede moverlos para separar archivos .pem si es necesario.
fuente
/etc/ssl/openssl.conf
obras actuales de UbuntuNo puedo comentar, así que agrego una respuesta por separado. Traté de crear un certificado autofirmado para NGINX y fue fácil, pero cuando quise agregarlo a la lista blanca de Chrome tuve un problema. Y mi solución fue crear un certificado raíz y firmar un certificado hijo con él.
Entonces paso a paso. Crear archivo config_ssl_ca.cnf Aviso, el archivo de configuración tiene una opción basicConstraints = CA: verdadero, lo que significa que se supone que este certificado es root.
Siguiente archivo de configuración para su certificado hijo.
El primer paso: crear una clave raíz y un certificado
El segundo paso crea la clave secundaria y el archivo CSR - Solicitud de firma de certificado. Porque la idea es firmar el certificado secundario por root y obtener un certificado correcto
Abra la terminal de Linux y haga este comando echo 0
El archivo de texto ca.srl que contiene el siguiente número de serie para usar en hexadecimal. Obligatorio. Este archivo debe estar presente y contener un número de serie válido.
Último paso, cree un archivo de configuración más y llámelo config_ca.cnf
Puede preguntar, por qué es tan difícil, por qué debemos crear una configuración más para firmar el certificado secundario por root. La respuesta es simple porque el certificado secundario debe tener un bloque SAN: nombres alternativos de sujeto. Si firmamos el certificado secundario con las utilidades "openssl x509", el certificado raíz eliminará el campo SAN en el certificado secundario. Entonces usamos "openssl ca" en lugar de "openssl x509" para evitar la eliminación del campo SAN. Creamos un nuevo archivo de configuración y le pedimos que copie todos los campos extendidos copy_extensions = copy .
El programa te hace 2 preguntas: 1. ¿Firmas el certificado? Diga "Y" 2. 1 de 1 solicitudes de certificado certificadas, ¿se comprometen? Di "Y"
En la terminal puede ver una oración con la palabra "Base de datos", significa el archivo index.txt que crea con el comando "touch". Contendrá toda la información de todos los certificados que cree mediante la utilidad "openssl ca". Para verificar el uso válido del certificado:
Si quieres ver qué hay en CRT:
Si quieres ver qué hay en CSR:
fuente
Tienes el procedimiento general correcto. La sintaxis para el comando está abajo.
Sin embargo, se muestran las advertencias porque el navegador no pudo verificar la identificación al validar el certificado con una Autoridad de certificación (CA) conocida.
Como se trata de un certificado autofirmado, no hay CA y puede ignorar la advertencia y continuar. Si desea obtener un certificado real que pueda ser reconocido por cualquier persona en Internet público, el procedimiento se encuentra a continuación.
Tengo más detalles sobre esto en una publicación en Asegurar la conexión: Crear un certificado de seguridad con OpenSSL
fuente
Un forro FTW. Me gusta que sea simple. ¿Por qué no usar un comando que contiene TODOS los argumentos necesarios? Así es como me gusta: esto crea un certificado x509 y su clave PEM:
Ese comando único contiene todas las respuestas que normalmente proporcionaría para los detalles del certificado. De esta manera, puede establecer los parámetros y ejecutar el comando, obtener su salida y luego ir a tomar un café.
>> Más aquí <<
fuente
One-liner versión 2017:
CentOS:
Ubuntu:
Editar: se agregó la barra diagonal previa a la opción 'subj' para Ubuntu.
fuente
En mi configuración, el servidor Ubuntu inició sesión en:
/var/log/mysql/error.log
Notas de seguimiento:
SSL error: Unable to get certificate from '...'
MySQL podría ser denegado el acceso de lectura a su archivo de certificado si no está en la configuración de los dispositivos . Como se mencionó en los pasos anteriores ^, guarde todos nuestros certificados como
.pem
archivos en el/etc/mysql/
directorio que apparmor aprueba por defecto (o modifique su apparmor / SELinux para permitir el acceso a donde sea que los haya almacenado).SSL error: Unable to get private key
Es posible que la versión de su servidor MySQL no sea compatible con el
rsa:2048
formato predeterminadoConvertir generado
rsa:2048
a simplersa
con:Compruebe si el servidor local admite SSL :
Verificar que una conexión a la base de datos esté encriptada SSL :
Requerir ssl para la conexión de un usuario específico ('require ssl'):
Enlace alternativo: Tutorial extenso en conexiones PHP seguras a MySQL con SSL .
fuente
Como se ha discutido en detalle, los certificados autofirmados no son confiables para Internet . Puede agregar su certificado autofirmado a muchos pero no a todos los navegadores . Alternativamente, puede convertirse en su propia autoridad de certificación .
La razón principal por la que uno no desea obtener un certificado firmado de una autoridad de certificación es el costo: Symantec cobra entre $ 995 y $ 1,999 por año por los certificados, solo por un certificado destinado a la red interna, Symantec cobra $ 399 por año . Ese costo es fácil de justificar si está procesando pagos con tarjeta de crédito o trabaja para el centro de ganancias de una empresa altamente rentable. Es más de lo que muchos pueden permitirse para un proyecto personal que uno está creando en Internet, o para una organización sin fines de lucro con un presupuesto mínimo, o si uno trabaja en el centro de costos de una organización, los centros de costos siempre intentan hacer más con menos.
Una alternativa es usar certbot (ver sobre certbot ). Certbot es un cliente automático fácil de usar que busca e implementa certificados SSL / TLS para su servidor web.
Si configura certbot, puede habilitarlo para crear y mantener un certificado emitido por la autoridad de certificación Let's Encrypt .
Hice esto durante el fin de semana para mi organización. Instalé los paquetes necesarios para certbot en mi servidor (Ubuntu 16.04) y luego ejecuté el comando necesario para configurar y habilitar certbot. Es probable que se necesite un complemento de DNS para certbot: actualmente estamos utilizando DigitalOcean, aunque es posible que pronto estemos migrando a otro servicio.
Tenga en cuenta que algunas de las instrucciones no fueron del todo correctas y se tomó un poco de tiempo y Google para darse cuenta. La primera vez me costó bastante tiempo, pero ahora creo que podría hacerlo en minutos.
Para DigitalOcean, un área que tuve dificultades fue cuando se me solicitó ingresar la ruta a su archivo INI de credenciales de DigitalOcean. A lo que se refiere el script es a la página Aplicaciones y API y a la pestaña Tokens / Key en esa página. Debe tener o generar un token de acceso personal (lectura y escritura) para la API de DigitalOcean; esta es una cadena hexadecimal de 65 caracteres. Esta cadena debe colocarse en un archivo en el servidor web desde el que está ejecutando certbot. Ese archivo puede tener un comentario como su primera línea (los comentarios comienzan con #). La segunda línea es:
Una vez que descubrí cómo configurar un token de lectura + escritura para la API de DigitalOcean, fue bastante fácil usar certbot para configurar un certificado comodín . Tenga en cuenta que no es necesario configurar un certificado comodín, sino que puede especificar cada dominio y subdominio en el que desea que se aplique el certificado. Era el certificado comodín que requería el archivo INI de credenciales que contenía el token de acceso personal de DigitalOcean.
Tenga en cuenta que los certificados de clave pública (también conocidos como certificados de identidad o certificados SSL) caducan y requieren renovación. Por lo tanto, deberá renovar su certificado de forma periódica (recurrente). La documentación de certbot cubre la renovación de certificados .
Mi plan es escribir un script para usar el comando openssl para obtener la fecha de vencimiento de mi certificado y activar la renovación cuando faltan 30 días para que caduque. Luego agregaré este script a cron y lo ejecutaré una vez al día.
Aquí está el comando para leer la fecha de vencimiento de su certificado:
fuente