我设置https,但数据仍然响应没有证书的客户端

时间:2013-04-17 15:17:27

标签: python ios ssl https tornado

我正在开发一个iOS应用程序,我希望我的服务器只能通过我的应用程序读取数据。

所以,我创建了自签名证书,并在Tornado中设置https,如下所示:

http_server = tornado.httpserver.HTTPServer(applicaton, ssl_options={
    "certfile": os.path.join(data_dir, "mydomain.crt"),
    "keyfile": os.path.join(data_dir, "mydomain.key"),
})

http_server.listen(443)

当我在chrome / safari中键入我的服务器的API后,他们警告我,但数据仍然可以读取。

浏览器没有我的证书/密钥对,为什么他们可以访问我的服务器并读取数据?

根据公共/私人理论:

  1. 浏览器必须发送涉及其证书的公钥
  2. 如果我的服务器以某种方式信任证书,我的服务器使用浏览器的公钥加密响应
  3. 浏览器接收响应并使用自己的私钥解密它
  4. 在第2步中,我的服务器不应该信任浏览器的证书!我是对的吗?

    感谢。

3 个答案:

答案 0 :(得分:3)

  

根据公共/私人理论:

     
      
  1. 浏览器必须发送涉及其证书的公钥
  2.   
  3. 如果我的服务器以某种方式信任证书,我的服务器使用浏览器的公钥加密响应
  4.   
  5. 浏览器接收响应并使用自己的私钥解密它
  6.   

不,这不是它的工作方式。

在仅具有服务器身份验证的SSL / TLS(大多数HTTPS站点)中,服务器首先发送其证书,客户端检查它是否信任证书,客户端和服务器使用服务器的公钥协商共享密钥(如何完成)取决于密码套件),并使用从此共享密钥派生的密钥设置加密通道。

在具有相互身份验证的SSL / TLS中,额外的步骤涉及客户端将其证书发送到服务器并在握手结束时签名,以向服务器证明它确实是该证书的持有者。

仅在第二种情况下,浏览器具有证书和私钥,并且在任何情况下都不会用于任何加密。

您在此处使用的代码仅设置certfilekeyfile,这意味着您已将服务器配置为仅对服务器进行身份验证的连接。当您绕过浏览器警告时,您只是告诉它信任服务器证书(因为它在您的情况下是自签名的),因此连接确实可以继续。

如果要对客户端进行身份验证,则需要配置服务器以请求(并要求)客户端证书。您还需要在客户端(无论是浏览器还是您的应用程序)设置客户端证书(使用其私钥)。这与服务器证书及其私钥无关。

Tornado文档似乎表明ssl_options参数使用ssl.wrap_socket options,因此如果您想使用客户端证书身份验证(尤其是cert_reqs和{{1},您应该查看这些内容。 }})。

请注意,通常,使用客户端证书对应用程序(而不是应用程序的用户)进行身份验证只有在没有人能够反编译应用程序时才有效。该应用程序将以某种方式包含私钥,因此有人可以抓住它。如果您对应用的所有副本使用相同的私钥,这个问题当然会更糟。

答案 1 :(得分:0)

我在这个领域并不知情,但证书只是为了帮助确保服务器就是它所说的那样。

如果他们信任服务器证书,任何人都可以查看该页面。

要获得所需的功能,您可能希望使用某种形式的身份验证,甚至是HTTP头字段中给定值之类的基本身份。

答案 2 :(得分:0)

这是一个奇怪的提示,你只是破解了你的用户代理,所以龙卷风只会允许你提供的字符串,我不知道iOS浏览器是否提供此功能,但是在PC上的Chrome中你可以覆盖你的用户代理 开发者工具 - > 设置 - >的覆盖

使用:

self.request.headers["User-Agent"]

因为它是一个字符串,所以你只允许一些字符串传递:

if personnalized_ua not in self.request.headers["User-Agent"]:
    self.redirect("no-way.html")

现在,如果您只想为iPhone进行访问,请使用user_agents library