Clave privada remota para autoridad de certificación

1

Fondo

He estado jugando con la idea de usar una clave privada protegida envuelta por una API, como Azure KeyVault o Amazon KMS para firmar certificados para la infraestructura de clave privada interna.

Conceptualmente, esto es similar a usar el Agente de OpenSSH para firmar solicitudes de conexión para SSH. La clave nunca se expone a la aplicación que preparó la solicitud.

Mi interés es principalmente académico. Manejo las claves RSA con frecuencia para el trabajo, y me encanta echar un vistazo debajo de las fundas a cómo funciona todo. Pero si puedo encontrar algo que realmente esté listo para la producción, podría usarlo para mi trabajo diario con implementaciones web.

Opciones que he explorado

Azure KeyVault proporciona una interfaz para crear certificados autofirmados, pero si quiero usar los certificados como certificados de cliente con MongoDB (por ejemplo), sería útil tener un certificado para usar como raíz.

He visto una serie de opciones para lograr este objetivo. El que parecía más prometedor es escribir un proveedor PKCS11 personalizado para que actúe como intermediario de la clave envuelta en API. Tal vez usando libcurl o algo así para hacer la llamada a la API. No soy tan competente como programador de C / C ++, por lo que esta no sería una solución muy práctica para mí ... aunque me interese buscarlo para la experiencia de aprendizaje.

Podría usar una solución de terceros como Hashicorp Vault PKI o Certificados RedHub . Hashicorp Vault tiene un proveedor de almacenamiento para mantener la clave resultante en Azure KeyVault. Pero a partir de la documentación, parece que ambos servicios aún dejan la Clave Privada expuesta a sí mismos.

Miré pyOpenSSL como un nivel superior abstracción para firmar un CSR, pero la API toma una clave privada como parámetro.

Beneficios de la solución

Para mí, los beneficios percibidos de usar una solución de este tipo son que la clave privada nunca es accesible (ni siquiera para mí). Por lo tanto, la exposición del acceso a la clave de la CA raíz se limita a los certificados que un atacante logra emitir mientras tiene acceso.

Dado que el acceso a la clave tiene un registro de auditoría, simplificaría el seguimiento de su uso y la identificación de accesos no autorizados.

La pregunta real

Estoy tratando de encontrar o desarrollar una solución donde la firma digital sea procesada por un tercero, pero la lógica de construir el contenido para firmar se maneja localmente, preferiblemente mediante soluciones estándar conocidas como OpenSSL (como biblioteca o CLI) .

¿Existe una solución para procesar un CSR x509 en un Certificado x509 donde la clave privada y los algoritmos de firma se envuelven en una API web?

En su defecto, ¿hay alguna buena documentación en algún lugar para utilizar las bibliotecas existentes para convertir un CSR en un certificado en un nivel bajo? Entradas de blog de bienvenida.

    
pregunta nbering 17.03.2018 - 22:59
fuente

1 respuesta

2

Muchas API criptográficas admiten módulos de seguridad de hardware (HSM) conectados a la red, y el uso de esas API ya parece que califica para su construcción teórica.

.NET Core tiene un CertificateRequest clase. Si crea una clase personalizada que extiende RSA para comunicarse con KeyVault (o usa una existente ), entonces puede crear certificados donde La clave de firma reside en KeyVault.

X509SignatureGenerator generator = 
    X509SignatureGenerator.CreateForRSA(keyVaultRsa, RSASignaturePadding.Pkcs1);

X509Certificate2 cert =
    request.Create(issuerCert.SubjectName, generator, notBefore, notAfter, serialNumber);

Puede escribir CSR, pero no leerlos. Así que esa es solo una respuesta parcial, a menos que en realidad no necesite CSR en su escenario.

    
respondido por el bartonjs 18.03.2018 - 04:55
fuente

Lea otras preguntas en las etiquetas