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

Python 我设置了https,但数据仍然响应到没有证书的客户端,python,ios,ssl,https,tornado,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.

我正在开发一个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后,他们警告我,但数据仍然可以读取

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

根据公共/私人理论:

  • 浏览器必须发送其公钥,该公钥包含在其证书中
  • 如果我的服务器以某种方式信任证书,我的服务器将使用浏览器的公钥加密响应
  • 浏览器接收响应并使用自身的私钥对其进行解密
  • 在步骤2中,我的服务器不应该信任浏览器的证书!我说得对吗


    谢谢。

    我在这方面一点也不在行,但证书只是为了帮助确保服务器是它所说的那样

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


    为了获得您想要的功能,您可能需要使用某种形式的身份验证,甚至是一些基本的身份验证,例如HTTP头字段中的给定值。

    这里有一个奇怪的提示,您只需黑客攻击您的用户代理,tornado将只允许您提供的字符串,我不知道iOS浏览器是否提供此功能,但在电脑上的Chrome中,你可以覆盖你的用户代理 开发工具->设置->覆盖

    使用:

    因为它是一个字符串,所以您只允许一些字符串通过:

    if personnalized_ua not in self.request.headers["User-Agent"]:
        self.redirect("no-way.html")
    
    现在,如果你只想访问iPhone,使用

    根据公共/私人理论:

  • 浏览器必须发送其公钥,该公钥包含在其证书中
  • 如果我的服务器以某种方式信任证书,我的服务器将使用浏览器的公钥加密响应
  • 浏览器接收响应并使用自身的私钥对其进行解密
  • 不,不是这样的

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

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

    只有在第二种情况下,浏览器才有一个证书和一个私钥,而且在任何情况下都不会用于任何加密

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

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

    Tornado文档似乎表明
    ssl\u选项
    参数使用了,因此如果要使用客户端证书身份验证(特别是
    cert\u reqs
    ca\u证书
    ),您应该研究这些选项


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

    我就知道!我知道一定有一些参数需要设置,但我就是找不到。谢谢。关于“反编译”,我使用密码加密我的.p12文件。密码是一个字符串,以二进制状态存在于应用程序中。当你说“反编译”时,你的意思不是解码源代码,我的意思是“反编译”相当松散,从应用程序的二进制分布形式的逆向工程的意义上来说,至少足以获得私钥。获取包含PKCS#12内容的二进制部分以及旁边的密码就是一个例子。当涉及到从二进制形式进行反向工程时,不会有任何安全性。幸运的是,逆向工程并没有被大多数人所掌握。
    if personnalized_ua not in self.request.headers["User-Agent"]:
        self.redirect("no-way.html")