26
A
回答
1
Snap的snap-server
软件包中没有提供这种功能,我假设您是如何运行服务器的。
Buuuuut通过分叉或作为一个单独的模块(您不得不复制一些代码,因为您需要的某些内部值不会导出)来构建并不困难。 bindHttps
,located in Snap.Internal.Http.Server.TLS,是你想要的目标。这个函数主要是对来自HsOpenSSL
库的调用OpenSSL.Session的封装,它本身是OpenSSL库的一个松散包装。
对我们来说幸运OpenSSL对客户端证书提供全面支持。您只需将verification mode设置为SSL_VERIFY_PEER
即可。还有其他的旋钮也可以摆弄。您还必须确保安装证书链以实际验证客户端证书。信任链和所有爵士乐。仅供参考,请参阅nginx does it。
更妙的是,这个功能是作为HsOpenSSL
功能contextSetVerificationMode :: SSLContext -> VerificationMode -> IO()
exposed。您会注意到Snap的bindHttps
的定义中存在ctx :: SSLContext
。您只需复制或分发该模块并引入您的呼叫即可。
它看起来像这样(待验证码警报):
± % 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 does。
相关问题
- 1. 检查客户端证书和更多
- 2. 如何使用HTTP客户端传递客户端证书?
- 3. 如何使用AutoRest客户端传递客户端证书
- 4. 如何从Android证书商店检索客户端证书
- 5. 如何在Android中使用p12证书(客户端证书)
- 6. 如何使用Mozilla的CA证书的SSL客户端证书
- 7. 如何使用客户端证书从acs检索令牌?
- 8. 客户端证书
- 9. 客户端证书
- 10. 我如何检查客户端浏览器SSL证书
- 11. 如何绕过证书在Java Web服务检查客户端
- 12. SSL证书客户端验证 - 如何?
- 13. 验证客户端证书
- 14. 客户端证书认证
- 15. 使用RavenDB客户端API发送客户端证书
- 16. 使用客户端证书与twitter finagle
- 17. 使用activeX获取客户端证书
- 18. 使用Zend_Http_Client的客户端SSL证书
- 19. 在Android客户端使用证书
- 20. 使用客户端证书的Weblogic
- 21. 使用客户端证书IIS
- 22. 与使用客户端证书WebSocket4Net
- 23. 使用XHR发送客户端证书
- 24. 使用Axis2附加客户端证书?
- 25. WCF客户端证书签名:如何?
- 26. socket.io如何读取客户端证书
- 27. 如何测试客户端证书
- 28. 如何使用boost :: asio SSL验证客户端证书?
- 29. 如何将Insomnia Rest客户端与客户端证书一起使用?
- 30. 如何使用可信中介CA证书验证客户端证书?
更普遍的,我想知道的任何Haskell的Web框架是否提供了基于证书的客户认证的支持。 – 2015-02-19 17:26:43
这是那种非答案,但作为一种变通方法,您可以使用nginx的检验证书,并通过头通过DN。 – 2015-11-10 21:54:04