如何使用Snap检查客户端证书?



我知道它很少使用,但是有可能在Snap中访问客户端证书吗?

如果没有,是否可以使用不同的web堆栈?

这在Snap的snap-server包中不可用,我假设这是您运行服务器的方式。

但是构建起来并不困难,无论是通过分支还是作为一个单独的模块(但是您必须复制一些代码,因为您需要的一些内部值没有导出)。bindHttps,位于Snap.Internal.Http.Server中。TLS,就是你想要的目标。这个函数很大程度上是对OpenSSL调用的包装。HsOpenSSL库中的会话,它本身是OpenSSL库的松散包装。

幸运的是,OpenSSL完全支持客户端证书。您只需将验证模式设置为SSL_VERIFY_PEER。你也可以摆弄其他的旋钮。您还必须确保安装了一个证书链来实际验证客户端证书。信任链之类的东西。参考nginx。

更好的是,这个函数在HsOpenSSL中公开为函数contextSetVerificationMode :: SSLContext -> VerificationMode -> IO ()。您会注意到,ctx :: SSLContext存在于Snap的bindHttps的定义中。您所要做的就是复制或派生该模块并引入您的调用。

它看起来像这样(未经验证的代码警报):

± % 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

第一个布尔值告诉OpenSSL如果没有客户端证书就失败。第二个布尔值告诉OpenSSL,客户端证书只在第一次请求时需要,在重新协商时不再需要。第三个值是回调。我认为正确的做法是在回调中返回True。这就是nginx的工作

相关内容

  • 没有找到相关文章

最新更新