Durante mi búsqueda, encontré varias formas de firmar una solicitud de firma de certificado SSL:
Usando el
x509
módulo:openssl x509 -req -days 360 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
Usando el
ca
módulo:openssl ca -cert ca.crt -keyfile ca.key -in server.csr -out server.crt
Nota: no estoy seguro del uso de los parámetros correctos para este. Indique el uso correcto si debo usarlo.
¿De qué manera se debe usar para firmar solicitudes de certificados con su Autoridad de Certificación? ¿Es un método mejor que el otro (por ejemplo, uno está en desuso)?
ca
es para los casos en que eres más serio acerca de convertirte en un CA.Respuestas:
Te estás perdiendo el preludio de esos comandos.
Este es un proceso de dos pasos. Primero configura su CA y luego firma un certificado de entidad final (también conocido como servidor o usuario). Los dos comandos eluden los dos pasos en uno. Y ambos suponen que ya tiene un archivo de configuración de OpenSSL configurado para las CA y los certificados de servidor (entidad final).
Primero, cree un archivo de configuración básica :
Luego, agregue lo siguiente:
Los campos anteriores están tomados de un complejo
openssl.cnf
(puede encontrarlo en/usr/lib/openssl.cnf
), pero creo que son los elementos esenciales para crear el certificado de CA y la clave privada.Ajusta los campos de arriba para adaptarlos a tu gusto. Los valores predeterminados le ahorran el tiempo de ingresar la misma información mientras experimenta con el archivo de configuración y las opciones de comando.
Omití las cosas relevantes para CRL, pero sus operaciones de CA deberían tenerlas. Ver
openssl.cnf
y lacrl_ext
sección relacionada .Luego, ejecute lo siguiente. La
-nodes
omite la contraseña o frase de contraseña para que pueda examinar el certificado. Es una muy mala idea omitir la contraseña o frase de contraseña.Después de que se ejecute el comando,
cacert.pem
será su certificado para las operaciones de CA ycakey.pem
será la clave privada. Recuerde que la clave privada no tiene una contraseña o frase de contraseña.Puede volcar el certificado con lo siguiente.
Y pruebe su propósito con lo siguiente (no se preocupe por el
Any Purpose: Yes
; vea "crítico, CA: FALSO" pero "CA de cualquier propósito: Sí" ).Para la segunda parte, voy a crear otro archivo de configuración que sea fácilmente digerible. Primero,
touch
elopenssl-server.cnf
(puede hacer uno de estos para certificados de usuario también).Luego ábralo y agregue lo siguiente.
Si está desarrollando y necesita usar su estación de trabajo como servidor, 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.Luego, cree la solicitud de certificado del servidor. Asegúrese de omitir
-x509
*. Agregar-x509
creará un certificado, y no una solicitud.Después de que se ejecute este comando, tendrá una solicitud
servercert.csr
y una clave privadaserverkey.pem
.Y puedes inspeccionarlo de nuevo.
Luego, debe firmarlo con su CA.
Ya casi está listo para firmar el certificado del servidor con su CA. La CA
openssl-ca.cnf
necesita dos secciones más antes de emitir el comando.Primero, abra
openssl-ca.cnf
y agregue las siguientes dos secciones.En segundo lugar, agregue lo siguiente a la
[ CA_default ]
sección deopenssl-ca.cnf
. Los dejé afuera antes, porque pueden complicar las cosas (no se usaban en ese momento). Ahora verás cómo se usan, así que espero que tengan sentido.Tercero, toque
index.txt
yserial.txt
:Luego, realice lo siguiente:
Deberías ver algo similar a lo siguiente:
Después de que se ejecute el comando, tendrá un certificado de servidor recién acuñado
servercert.pem
. La clave privada se creó anteriormente y está disponible enserverkey.pem
.Finalmente, puede inspeccionar su certificado recién acuñado con lo siguiente:
Anteriormente, se añade el texto siguiente
CA_default
:copy_extensions = copy
. Esta copia copia la extensión proporcionada por la persona que realiza la solicitud.Si omite
copy_extensions = copy
, su certificado de servidor carecerá de los nombres alternativos del sujeto (SAN) comowww.example.com
ymail.example.com
.Si usa
copy_extensions = copy
, pero no revisa la solicitud, entonces el solicitante podría engañarlo para que firme algo como una raíz subordinada (en lugar de un servidor o un certificado de usuario). Lo que significa que él / ella podrá acuñar certificados que se encadenan a su raíz de confianza. Asegúrese de verificar la solicitudopenssl req -verify
antes de firmar.Si lo omite
unique_subject
o lo estableceyes
, solo se le permitirá crear un certificado con el nombre distinguido del sujeto.Intentar crear un segundo certificado mientras experimentas resultará en lo siguiente al firmar el certificado de tu servidor con la clave privada de la CA:
Entonces
unique_subject = no
es perfecto para probar.Si desea asegurarse de que el Nombre de la organización sea coherente entre las CA autofirmadas, la CA subordinada y los certificados de entidad final, agregue lo siguiente a sus archivos de configuración de CA:
Si desea permitir que cambie el Nombre de la organización , utilice:
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 están listados, 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
openssl req
se usa para generar CSR,openssl req -x509
se usa para generar un certificado de CA (vi en otro lugar que también podría crear un certificado autofirmado),openssl ca
se usa para firmar un CSR con un certificado de CA. ¿Correcto? Lo que también me confunde es que las mismas partes del archivo openssl.cnf se usan con diferentes valores dependiendo del comando ... Creo que ahora estoy totalmente perdido.openssl req -x509
se usa para crear la CA. En segundo lugar,openssl req
se usa para crear la CSR del servidor. En tercer lugar,openssl ca
se utiliza para crear el certificado del servidor y certificarlo con la firma de la CA.openssl-ca.cnf
yopenssl-server.cnf
. Después de acostumbrarse a ellos y cómo se invocan las secciones, puede combinarlos en una monstruosidadopenssl.cnf
.Además de la respuesta de @jww, me gustaría decir que la configuración en openssl-ca.cnf,
define el número predeterminado de días que el certificado firmado por este root-ca será válido. Para establecer la validez de root-ca, debe usar la opción '-days n' en:
De lo contrario, su root-ca será válida solo por el mes predeterminado y cualquier certificado firmado por esta CA raíz también tendrá una validez de un mes.
fuente