Python中ssl错误

SSL(Secure Sockets Layer)是基于加密技术的网络协议,目的是为了保护在网上传输的数据安全。SSL协议在实现安全通信的过程中,使用证书来完成对身份的验证,确保通信双方的身份以及传输的数据是完整、真实、不被篡改的。目前,SSL协议的新版本是TLS(Transport Layer Security)。

Python中,使用ssl模块可以实现SSL/TLS加密。但是,在使用ssl模块时,有时会遇到一些错误,下面就简要列举并详解一下这些错误:

1. CERTIFICATE_VERIFY_FAILED错误

在使用Python的urllib或requests等库进行HTTPS请求时,如果出现了CERTIFICATE_VERIFY_FAILED错误,那么极有可能证书验证失败,出现问题的证书被认为不受信任。这是因为Python自带的SSL证书验证模块 certifi 的证书未能被当地操作系统的浏览器所承认所致,可以采用以下两种方式解决:

(1)关闭验证,在urllib.request.urlopen() 入参中传入 context 参数

```

import ssl

import urllib.request

context = ssl._create_unverified_context()

response = urllib.request.urlopen("https://www.baidu.com", context=context)

print(response.status)

```

(2)使用自定义证书,将自定义证书中的根证书放入 certifi 自带证书库中即可。具体使用方法请参考 certifi 官方文档。

2. CERTIFICATE_SUBJECT_INVALID错误

在SSL连接时,如果服务器证书中的 commonName 与请求时的主机名不匹配,则会出现 CERTIFICATE_SUBJECT_INVALID 错误。如果出现这个错误,需要检查请求主机名是否与服务器证书中的 commonName 匹配,如果不匹配,可以使用下面的方法解决:

```

import ssl

import socket

context = ssl.create_default_context()

s = socket.create_connection(("www.baidu.com", 443))

with context.wrap_socket(s, server_hostname="www.baidu.com") as ssl_socket:

ssl_socket.sendall(b"GET / HTTP/1.1\r\n"

b"Host: www.baidu.com\r\n"

b"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0\r\n"

b"Connection: close\r\n\r\n")

data = ssl_socket.recv(1024)

print(data.decode())

```

3. TLSV1_ALERT_PROTOCOL_VERSION错误

Python3.6+中,使用 builtin ssl 模块进行HTTPS请求时,不支持 TLS1.0 和 TLS1.1 版本,因此会出现 TLSV1_ALERT_PROTOCOL_VERSION 错误。

如果需要使用 TLS1.0 或 TLS1.1 版本,可以使用 pyOpenSSL 模块,具体使用方法如下:

```

from OpenSSL import SSL

import socket

ctx = SSL.Context(SSL.TLSv1_METHOD)

ctx.set_options(SSL.OP_NO_SSLv3)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sslSock = SSL.Connection(ctx, s)

sslSock.connect(("www.baidu.com", 443))

sslSock.sendall(b"GET / HTTP/1.1\r\n"

b"Host: www.baidu.com\r\n"

b"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0\r\n"

b"Connection: close\r\n\r\n")

data = sslSock.recv(1024)

print(data.decode())

```

4. SSL: CERTIFICATE_VERIFY_FAILED错误

在使用Python发送HTTPS请求时,可能会遇到 SSL: CERTIFICATE_VERIFY_FAILED 错误,错误信息可能会包含以下内容:“[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1056)”。

这个错误是由于客户端在收到服务端的证书时,会自动进行相关验证,如果验证不通过,就会抛出这个错误。需要将服务端的证书导入到客户端的受信任证书列表中,或禁用SSL证书验证。具体使用方法可以参考上面的 CERTIFICATE_VERIFY_FAILED 错误处理方法。

总结:

Python中的ssl模块可以实现SSL/TLS加密,但是在使用时有可能会遇到一些错误,例如 CERTIFICATE_VERIFY_FAILED、CERTIFICATE_SUBJECT_INVALID 和 TLSV1_ALERT_PROTOCOL_VERSION 等。针对不同的错误,可以采用相应的解决方法,最终实现网络请求的安全通信。除此之外,对于编写安全的网络应用程序而言,还需要注意一些细节和注意事项,例如密码加盐,用户会话管理,防止SQL注入和XSS攻击等。

壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。

我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!

点赞(86) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部