Pregunta

Mi empresa tiene una aplicación de gestión de documentos web y me asignaron para encontrar una manera de firmar archivos PDF con el certificado digital del usuario.

Los archivos PDF pueden ir desde unos pocos kb a más de 100 Mb, esto es a través de Internet, por lo que la firma must tiene lugar en el servidor web.

Para hacer esto, he creado un control activeX que le pide al usuario que elija el certificado, luego lo carga en una página web usando WebClient.UploadData enviando el certificado como una matriz de bytes.

En la página web, cuando intento firmar el documento pdf, aparece un error " La clave no existe " Esto no me sorprende porque cuando estaba usando el certificado directamente a través de una conexión https después de haber elegido el certificado adecuado, se me solicitaría la clave. Esto no está sucediendo con el activeX.

Así es como obtengo el certificado del usuario:

private static X509Certificate2 PickCertificate()
        {
            X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            try
            {
                store.Open(OpenFlags.ReadOnly);

                // pick a certificate from the store
                X509Certificate2 cert = X509Certificate2UI.SelectFromCollection(store.Certificates, "Title", "Message", X509SelectionFlag.SingleSelection)[0];

                // show certificate details dialog
                X509Certificate2UI.DisplayCertificate(cert);
                store.Close();
                return cert;
            }
            finally { store.Close(); }
        }

¿Cómo puedo pedir al usuario que proporcione la clave que me falta?

¿Fue útil?

Solución

¿Desea que el usuario cargue la clave privada de su certificado en el servidor web para que pueda firmar archivos PDF? Si es así, eso se rompe fundamentalmente desde una perspectiva de seguridad.

¡Creo que puede que no hayas notado el certificado público! = clave privada. (La mayoría de nosotros somos descuidados y usamos la palabra "certificado" para referirse a cualquiera de estas cosas (o ambas), por lo que no es del todo sorprendente). Desde la memoria, CryptoAPI solo tiene un conjunto selecto de métodos que le permitirán acceder a la clave. Debe haber una " exportar como PFX " Método entre ellos, por lo que puede hacer que su diseño funcione si realmente lo desea, pero no hay manera de que lo recomiende. (Riesgo de enviar claves privadas a un servidor web, no repudiar, etc.).

Si realmente debe realizar la firma en el servidor [No entiendo realmente su argumento, la firma no debe agregar mucha información a la carga], entonces probablemente debería considerar una arquitectura de múltiples niveles y un mecanismo de depósito de claves. . De esta manera, al menos puede minimizar algunas de las preocupaciones de seguridad (pero aún así perderá el no repudio ... e introducirá otros riesgos. No habrá almuerzo gratis aquí).

Por lo tanto ... es probable que deba considerar volver a diseñar su aplicación para que la firma del PDF se produzca en el cliente (en su control ActiveX), antes de que se cargue el archivo PDF. Me imagino que necesitará una biblioteca de terceros para el paso de firma como se explica en este subproceso SO .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top