Wiki

Atrás

Integración de aplicación DSS a ASPNET

Antecedentes

El presente documento detalla la solución para el desarrollo de un componente .NET que permita integrar aplicaciones ya desarrolladas sobre esta plataforma, con la solución de firma electrónica avanzada del portal del Estado uruguayo.

Se busca que el componente pueda ser incorporado en soluciones existentes de forma poco invasiva, de modo de simplificar su uso.

Requisitos

La implementación de referencia se encuentra diponible para clonar en github en el siguiente link https://goo.gl/5bRUFW

Los componentes utilizados en la presente guía requieren que la aplicación se encuentre desarrollada sobre la versión 4.6 del Microsoft .NET Framework, o superior. Asimismo, la misma deberá encontrarse publicada sobre HTTPS.

La aplicación deberá contar con un certificado de servicio emitido por una CA autorizada, el cual deberá encontrarse instalado en el Certificate Store del equipo donde se encuentra la aplicación, incluyendo la clave privada. A los efectos de la presente guía, se asume que el certificado se encuentra instalado en el store Personal del equipo (LocalMachine / My). A continuación, se incluye una captura del Certificate Store:

Figura 1. Store de certificados.

La cuenta configurada para la ejecución del sitio web deberá tener acceso a la clave privada del certificado para poder realizar la firma de los SignRequests enviados al IdP.

Apliciación .Net

Para la elaboración de la presente guía, se asume una aplicación .NET existente desarrollada sobre ASP.NET MVC 4, la cual cuenta con dos controladores (HomeController y SignatureController) siendo el primero quien se encarga de desplegar la página de inicio y el segundo que generar el SignRequest y validar el SignResponse.

Figura 2. Diagrama de la solución.

En el diagrama anterior se pueden observar los componentes del sitio inicial, el cual cuenta con la siguiente página de inicio:

Figura 3. Página principal.

El código fuente de la solución de inicio se encuentra disponible junto con esta guía, de modo de permitir seguir los pasos detallados en la misma sobre esta aplicación de ejemplo.

Para la interacción con el DSS, se utilizó un binding POST. Asimismo, se implementaron los siguientes perfiles de firma de forma parcial, según el alcance detallado más adelante:

-CAdES.

-CAdES Hash.

-PAdES.

-XAdES.

Integración con la dll DSS Library

- Incorporar dll DSS Library

El primer paso para integrar la librería del DSS es agregar el .dll como referencia al proyecto. A continuación, se indica cómo realizar esta operación:

Figura 4. Agregar referencia en el sitio.

Figura 5. Selección de la librería.

- Configurar parámetros en el web.config

Agregar las siguientes líneas de configuración en el web.config:

Agregar las siguientes líneas de configuración en el web.config, reemplazando los textos entre paréntesis rectos por los propios del servicio a integrar:

<Urudata.Agesic.UISimpleAcceso.DSSLibrary.Properties.Settings>

 <setting name="ResponseConsumerUrl" serializeAs="String"> 
    <value>[URL de procesamiento de la SignResponse]</value> 
</setting>

 <setting name="ServiceProviderName" serializeAs="String"> 
    <value>[Service Provider Name]</value>
 </setting>
 
 <setting name="DSSServiceUrl" serializeAs="String">
    <value>[URL del DSS]</value>
 </setting>

 <setting name="DSSCertificate_StoreName" serializeAs="String">

 <value>[Nombre de la Store para certificado de validación]</value>

 </setting>

 <setting name="DSSCertificate_StoreLocation" serializeAs="String">

 <value>[Ubicación de la Store para certificado de validación]</value>

 </setting>

 <setting name="DSSCertificate_Subject" serializeAs="String">

 <value>[Subject del certificado de validación]</value>

 </setting>

 <setting name="SigningCertificate_StoreName" serializeAs="String">

 <value>[Nombre de la Store para certificado de firma]</value>

 </setting>

 <setting name="SigningCertificate_StoreLocation" serializeAs="String">

 <value>[Ubicación de la Store para certificado de firma]</value>

 </setting>

 <setting name="SigningCertificate_Subject" serializeAs="String">

 <value>[Subject del certificado de firma]</value>

 </setting>

<setting name="DocumentCertificatePrefixes" serializeAs="String">

 <value>[Prefijos de certificados de documento]</value>

 </setting>

<setting name="ThumbprintRootAGESIC" serializeAs="String">

 <value>[Thumbprint del certificado raíz de AGESIC]</value>

 </setting>

A continuación, se describe cada parámetro.

-ResponseConsumerUrl: URL a la que se debe invocar para procesar el SignResponse proveniente del DSS.

-ServiceProviderName: Nombre del Service Provider configurado en la aplicación DSS.

-DSSServiceUrl: URL a donde se debe realizar el Post con el SignRequest.

-DSSCertificate_StoreName: Nombre de la Store donde se encuentra el certificado utilizado para validar la firma de la SignResponse.

-DSSCertificate_StoreLocation: Ubicación de la Store donde se encuentra el certificado utilizado para validar la firma de la SignResponse.

-DSSCertificate_Subject: Subject del certificado utilizado para validar la firma de la SignResponse.

-SigningCertificate_StoreName: Nombre de la Store donde se encuentra el certificado utilizado para firmar la SignRequest. 

-SigningCertificate_StoreLocation: Ubicación de la Store donde se encuentra el certificado utilizado para firmar la SignRequest.

-SigningCertificate_Subject: Subject del certificado utilizado para firmar la SignRequest.

-DocumentCertificatePrefixes: Prefijos de los certificados de documento utilizados para validar la firma del documento contenido en la SignResponse.

-ThumbprintRootAGESIC: Thumbprint del certificado raiz de AGESIC utilizado para validar la firma del documento contenido en la SignResponse.

- Clase y métodos de la librería

public static class DSSManager

public static XmlDocument GenerateSignRequestCAdES(byte[] documentToSign, int signRequestID)

-Es el método que genera el SignRequest de tipo XML. El mismo recibe como parámetro el array de bytes del documento de tipo texto plano a firmar y el id, numérico, de la sesión de firma. El retorno es el documento xml firmado listo para ser enviado al sitio del DSS.

public static XmlDocument GenerateSignRequestPAdES(byte[] documentToSign, int signRequestID)  

-Es el método que genera el SignRequest de tipo XML. El mismo recibe como parámetro el array de bytes del documento de tipo pdf a firmar y el id, numérico, de la sesión de firma. El retorno es el documento xml firmado listo para ser enviado al sitio del DSS.

public static XmlDocument GenerateSignRequestXAdES(byte[] documentToSign, int signRequestID)  

-Es el método que genera el SignRequest de tipo XML. El mismo recibe como parámetro el array de bytes del documento de tipo xml a firmar y el id, numérico, de la sesión de firma. El retorno es el documento xml firmado listo para ser enviado al sitio del DSS.

public static XmlDocument GenerateSignRequestCAdES_Hash(byte[] documentToSign, int signRequestID)

-Es el método que genera el SignRequest de tipo XML. El mismo recibe como parámetro el array de bytes del documento a firmar, al que se le aplicará una función hash, y el id, numérico, de la sesión de firma. El retorno es el documento xml firmado listo para ser enviado al sitio del DSS.

public static bool ValidateSignResponse(XmlDocument signResponse)

-Es el método que valida el SignResponse enviado desde el sitio del DSS. Recibe como parámetro un XML (SignResponse) y valida su firma, retornando true en caso que de que la misma sea válida.

public static string GetDSSServiceUrl()

-Retorna la URL del servicio del DSS.

- Acceder al servicio y probar la integración

Figura 6. Servicio para archivos PDF

Figura 7. Servicio para archivos de texto plano (.txt)

Figura 8. Servicio para cualquier tipo de archivos

Figura 9. Servicio para archivos XML

Una vez realizado click en el botón Firmar se redirige al sitio DSS.

Figura 10. Vista previa de un archivo de text plano aceptado.

Figura 11. Vista previa de un archivo pdf aceptado.

Figura 12. Vista previa de un archivo xml aceptado.

Figura 13. Vista previa de un hash aceptado.

Luego se debe proceder a firmar el documento siguiendo con el flujo establecido hasta obtener un mensaje de firma satisfactoria.

Figura 14. Firma digital.

Figura 15. Firma exitosa.

Luego de darle click en el botón “Enviar” la propia aplicación DSS redirige al sitio web de ejemplo enviando un SignResponse de tipo XML.

Desde el sitio se obtiene el SignResponse se lo valida comprobando que el certificado utilizado por el DSS sea válido y que la firma incluida en el documento sea válida. Para esta última validación se corrobora que el certificado sea de la persona logeada (se compara número de documento y país) y se valida que el certificado utilizada sea emitido por una CA de Agesic, donde se recrea toda la cadena hasta la raíz. Si las distintas validaciones son satisfactorias se despliega en el sitio una pantalla de firma satisfactoria donde se incluye el SignResponse que fue validado.

Figura 16. Firma exitosa vista desde el sitio

8256 Accesos
Promedio (0 Votos)
Añadir comentarios