flas的双向ssl认证

2024-04-26 17:55:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经实现了SSL通信,其中客户端应用程序使用flask验证SSL服务器应用程序的身份。现在我希望SSL服务器应用程序验证SSL客户端应用程序的身份。用烧瓶可以吗?如何验证客户端证书?在第一次握手过程中,客户端发送CSR,作为响应,我发送回由自签名CA证书签名的证书。

但我还不清楚下一次通信时服务器将如何验证客户端。是否有用于证书验证的回调。Google groups上的链接说,不可能在烧瓶上进行ssl身份验证。为此,需要使用像apache、ngnix这样的web服务器。这是验证客户机的唯一方法吗?

我还想实现一件事,那就是我需要根据每个客户端的证书来识别它们。用烧瓶也行吗。

我的问题可能很幼稚,因为我对烧瓶还不太熟悉


Tags: 服务器应用程序客户端sslflask烧瓶链接过程
1条回答
网友
1楼 · 发布于 2024-04-26 17:55:36

免责声明

在我开始之前,我会注意到“伊曼纽尔·伊”的评论。如果首先在生产服务器或开发服务器上执行此操作,则需要考虑。例如,如果您使用的是Apache WebServer,那么可以从Apache完成HTTPS组件。唯一不同的做法是将证书详细信息作为选项传递给服务器应用程序,然后验证应用程序本身的序列号。

这是可能的

但这种方法被认为是不好的编程实践。不幸的是,它不能从flask.request访问,并且不能与烧瓶包一起使用。但是,Flask使用Werkzeug,可以通过修补werkzeug.serving包来编写主Flask代码。不建议这样做,因为您可能希望以后更新Flask或Werkzeug,并且您的修补程序可能会损坏,需要重新考虑。i、 从0.9到1.0。

这提供了一个不使用web服务器的解决方案。但我建议使用web服务器/环境变量组合。这是比较清洁和良好的做法。

我做了一些测试,看看这是否容易实现。我可以用最新开发的代码库“Werkzeug-0.10_devdevdev_20141223-py2.7”来确认这种方法是可行的。

您可能需要验证在每个证书中找到的序列号(种子号)(甚至一些其他变量)。如您所知,序列号对于每个证书都是唯一的,并且在服务器端的证书生成过程中由您确定。它有助于将此信息与客户端记录和证书信息(如果适用)一起存储,以便稍后验证客户端证书序列号。注意:它可能需要在十六进制和十进制10进制之间进行转换。

Werkzeug开发2014122

我做的是在werkzeug.serving.BaseWSGIServer.__init__调用wrap_socket()中添加以下选项。

使用这些; server_side=True, ca_certs= '/etc/apache2/ssl/ca.pem', cert_reqs=ssl.CERT_REQUIRED

  • ca_certs:使用此项进行验证,这是用于生成客户端证书的ca cert)
  • 需要ssl.CERT_:需要对ca_证书进行客户端证书验证

注意:如果客户端证书未通过初始验证,您将无法获取客户端证书。不会的。

然后在我的烧瓶测试类中我修补了verify_request 其中

def verify_request(self, request, client_address):

cert = request.getpeercert(True)
raw = decoder.decode(cert)[0]
print "Serial Number of your certificate is: % " % str(raw[0][1])
# todo: do checks & if serial no is ok then return true
return True

werkzeug.serving.BaseWSGIServer.verify_request = verify_request

这证明了这是可能的,但您可能需要调查BaseWSGIServer继承的HTTPServer类的请求处理程序,以找到更好的方法来执行回调或重写。

Werkzeug 0.9.X

如果您使用的是Werkzeug 0.9.X,我假设您使用的是导入from OpenSSL import SSL。请参阅代码段here。我没有测试过这个。

你可能对这个版本感兴趣的一些电话是; -Context.set_verify(mode, callback) -Connection.get_peer_certificate()

澄清

我不明白的是,你提到在第一次握手时发送CSR。如果这是生成客户机证书的过程,则可能需要重新考虑在系统和环境的上下文中如何执行此操作。如果我能得到更多的信息,我可以进一步评论。。

另外,SSL/TLS上下文中的“握手”通常指的是首先使用现有证书创建安全连接的操作。握手之后,不严格地说,就建立了一个连接。

相关问题 更多 >