gpt4 book ai didi

python - 使用 Python 的 HTTPS 服务器

转载 作者:太空狗 更新时间:2023-10-30 00:07:24 28 4
gpt4 key购买 nike

我用 python 编写了一个简单的网络服务器和客户端,下面是我的代码。我想实现 HTTPS,因为我使用的是标准 SSL 库。我正在使用 Python 2.7.3。我生成了证书文件并自行签名。所以我有 .crt 和 .key 文件,我用它来绑定(bind)到套接字上。

当我从浏览器浏览它时,我得到证书是自签名的异常错误,我必须将它添加到异常中。然后就可以了。

我的服务器代码:

import BaseHTTPServer
import urlparse
import urllib
import SocketServer
import threading
import ssl

HOST_NAME = 'localhost'
PORT_NUMBER = 8089


class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_HEAD(self):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()

def do_GET(self):

self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()

if self.path == '/get/':
self.wfile.write('On /get/')
return
self.wfile.write('On root')
return

def do_POST(self):
pass

class ThreadedHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
pass


if __name__ == '__main__':
httpd = BaseHTTPServer.HTTPServer((HOST_NAME, PORT_NUMBER), Handler)
httpd.socket = ssl.wrap_socket (httpd.socket, keyfile='my_key.key', certfile='my_cert.crt', server_side=True)
try:
httpd.serve_forever()
except KeyboardInterrupt:
httpd.server_close()
print "Server Stopped - %s:%s" % (HOST_NAME, PORT_NUMBER)

但是我正在尝试使用请求模块,当我提供带有请求的 .crt 文件时,我得到以下信息错误:

requests.get('https://localhost:8089', verify=True)
#requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

requests.get('https://localhost:8089', verify='my_cert.crt')
#requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

requests.get('https://localhost:8089', cert='my_crt.crt')
#requests.exceptions.SSLError: [Errno 336265225] _ssl.c:351: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib

requests.get('https://localhost:8089', cert=('my_crt.crt', 'my_key.key'))
# requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

requests.get('https://localhost:8089', verify=False)
#<Response [200]>

1) 为什么会出现此错误?我当然不想使用“verify=False”。我要验证证书在客户端。

2)(假设我让它工作)如果我通过更改强制执行 cert_reqs=CERT_REQUIRED:

httpd.socket = ssl.wrap_socket (httpd.socket, keyfile='my_key.key', certfile='my_cert.crt', cert_reqs=CERT_REQUIRED, server_side=True)

那么这是否意味着只有拥有我的证书文件 (my_cert.crt) 的人才能发送请求并获得响应,而没有我的人将不能?

最佳答案

只有当客户端拥有用于签署验证证书的证书时,客户端才能验证 SSL 证书。这是自签名证书在互联网上不常用的主要原因。通常你会要求一些组织(认证机构)用它来签署你的证书。这些 CA 通常受到人们和其他组织的信任,因此他们的证书已经内置在许多客户端中。

因此,如果您想让每个人都能够验证您的证书,则不应自行签名。那里有很多 CA,其中一些免费颁发证书。除非您获得 CA 签名的证书,否则只有已经拥有您的证书的人才能验证它。

编辑:

作为旁注:当您告诉浏览器为特定站点添加异常(exception)时,您是在告诉他根本不要验证其证书。因此,您不会受到针对 MITM 的保护。

关于python - 使用 Python 的 HTTPS 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20470831/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com