vigencia verificar ver validar una symantec seguridad pagina online gratis como certificado haskell ssl snap-framework happstack

haskell - validar - verificar certificado ssl openssl



¿Cómo puedo verificar el certificado del cliente usando Snap? (1)

Sé que rara vez se usa, pero ¿es posible acceder al certificado del cliente en Snap?

Si no, ¿es posible usar una pila web diferente?


Esto no está disponible para usted en el paquete snap-server Snap, que asumo es como está ejecutando su servidor.

Sin embargo, no es difícil de construir, ya sea mediante bifurcación o como un módulo separado (sin embargo, tendrá que copiar algunos códigos, ya que algunos valores internos que necesitará no se exportarán). bindHttps , ubicado en Snap.Internal.Http.Server.TLS , es a lo que desea apuntar. Esta función es en gran parte un contenedor de llamadas a OpenSSL.Session de la biblioteca HsOpenSSL , que a su vez es un contenedor suelto alrededor de la biblioteca OpenSSL.

Por suerte para nosotros, OpenSSL tiene soporte completo para certificados de clientes. Simplemente tiene que establecer el modo de verificación en SSL_VERIFY_PEER . También hay otros controles con los que puedes jugar. También debe asegurarse de instalar una cadena de certificados para verificar el certificado del cliente. Cadena de confianza y todo ese jazz. Como referencia, vea cómo lo hace nginx .

Aún mejor, esta función se exposed en HsOpenSSL como la función contextSetVerificationMode :: SSLContext -> VerificationMode -> IO () . Notará que ctx :: SSLContext existe en la definición de bindHttps de Snap. Todo lo que tendrá que hacer es copiar o bifurcar ese módulo e introducir sus llamadas.

Se vería algo como esto (alerta de código no verificado):

± % diff -u /tmp/{old,new} --- /tmp/old 2016-04-11 11:02:42.000000000 -0400 +++ /tmp/new 2016-04-11 11:02:56.000000000 -0400 @@ -19,6 +19,7 @@ ctx <- SSL.context SSL.contextSetPrivateKeyFile ctx key + SSL.contextSetVerificationMode ctx (SSL.VerifyPeer True True (Just (/_ _ -> return True))) if chainCert then SSL.contextSetCertificateChainFile ctx cert else SSL.contextSetCertificateFile ctx cert

El primer booleano le dice a OpenSSL que falla si no hay un certificado de cliente presente. El segundo booleano le dice a OpenSSL que el certificado del cliente solo es necesario en la primera solicitud y ya no es necesario en las renegociaciones. El tercer valor es una devolución de llamada. Creo que lo correcto es simplemente devolver True en la devolución de llamada. Es lo que hace nginx , de todos modos.