python服务器证书不可信,Python2/3 解决访问Https时不受信任SSL证书问题

问题:

在浏览器中访问该网站时会弹出证书不受信任,但是忽略仍可继续访问

但当使用Python登录时就会抛出_ssl.c:645错误,不能读取页面。

之前在做Android开发用Jsoup访问该站时也会有问题,当时的解决办法是写一个方法直接信任所有Https的安全证书,就在想python是不是也是可以这样做。

1、修改_create_default_https_context变量

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

这样就可以解决了!

2、使用requests库发送请求的时候直接设置verify=False取消验证即可,会有下面问题

问题到此为止还没结束,取消SSL验证又带来一个新问题。出现了警告信息,这个锅是urllib3的。

InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised.

虽然不是错误,但是在捕捉异常时,默认会出问题,为了不影响原有流程,应该去掉这些警告信息。

或者直接取消所有urllib3的警告

requests.packages.urllib3.disable_warnings()

原文:https://blog.csdn.net/mighty13/article/details/78076258

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSL(Secure Sockets Layer)是一种加密协议,用于在网络上安全地传输数据。Python中的ssl模块提供了一种简单的方式来使用SSL加密协议。在本文中,我们将介绍Python中的ssl模块,包括SSL/TLS协议的基础知识、如何在Python中使用SSL模块建立加密连接、如何验证SSL证书以及如何配置SSL加密连接。 ## SSL/TLS协议基础知识 SSL/TLS协议是一种加密协议,用于在网络上安全地传输数据。它是一种端到端的加密协议,可以保护数据在传输过程中不被窃听、篡改或伪造。SSL/TLS协议是建立在TCP协议之上的,因此它可以在任何支持TCP协议的网络上使用。 SSL/TLS协议使用公钥加密和私钥解密的方式来加密数据。在建立连接时,客户端和服务器之间会交换公钥,用于加密数据。数据在传输过程中,只有拥有私钥的一方才能解密数据。因此,SSL/TLS协议可以保证数据在传输过程中不被窃听。 SSL/TLS协议还提供了身份验证和完整性保护。使用SSL/TLS协议建立连接时,客户端和服务器可以交换数字证书,用于验证对方的身份。数字证书是由权威机构颁发的,可以保证对方的身份是真实可靠的。同时,SSL/TLS协议还提供了完整性保护,可以确保数据在传输过程中不被修改。 ## SSL模块的使用 Pythonssl模块提供了一种简单的方式来使用SSL加密协议。使用ssl模块建立加密连接的基本步骤如下: 1. 创建一个socket对象 2. 使用ssl.wrap_socket()函数对socket对象进行包装 3. 连接到服务器 4. 发送和接收数据 下面是一个简单的例子,使用ssl模块建立一个加密连接: ```python import socket import ssl # 创建一个socket对象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 对socket对象进行包装 ssl_sock = ssl.wrap_socket(s, ssl_version=ssl.PROTOCOL_TLS) # 连接到服务器 ssl_sock.connect(('www.example.com', 443)) # 发送数据 ssl_sock.send(b'Hello, world!') # 接收数据 data = ssl_sock.recv(1024) # 关闭连接 ssl_sock.close() ``` 在上面的例子中,我们首先创建了一个普通的socket对象s,然后使用ssl.wrap_socket()函数对其进行包装,生成了一个加密的socket对象ssl_sock。我们将ssl_version参数设置为ssl.PROTOCOL_TLS,表示使用TLS协议进行加密。 然后,我们使用ssl_sock.connect()函数连接到服务器,并使用ssl_sock.send()函数发送数据。使用ssl_sock.recv()函数接收服务器返回的数据。最后,我们使用ssl_sock.close()函数关闭连接。 ## SSL证书验证 在上面的例子中,我们没有对SSL证书进行验证。在使用SSL/TLS协议建立连接时,服务器会向客户端发送一个数字证书,用于验证服务器的身份。Pythonssl模块提供了一种简单的方式来验证SSL证书。 使用ssl模块验证SSL证书的基本步骤如下: 1. 创建一个SSLContext对象 2. 设置验证选项 3. 创建一个socket对象 4. 使用SSLContext.wrap_socket()函数对socket对象进行包装 5. 连接到服务器 6. 发送和接收数据 下面是一个简单的例子,使用ssl模块验证SSL证书: ```python import socket import ssl # 创建一个SSLContext对象 context = ssl.create_default_context() # 设置验证选项 context.check_hostname = True context.verify_mode = ssl.CERT_REQUIRED # 创建一个socket对象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 对socket对象进行包装 ssl_sock = context.wrap_socket(s, server_hostname='www.example.com') # 连接到服务器 ssl_sock.connect(('www.example.com', 443)) # 发送数据 ssl_sock.send(b'Hello, world!') # 接收数据 data = ssl_sock.recv(1024) # 关闭连接 ssl_sock.close() ``` 在上面的例子中,我们首先创建一个SSLContext对象,然后设置验证选项。我们将check_hostname选项设置为True,表示验证服务器的主机名,将verify_mode选项设置为ssl.CERT_REQUIRED,表示验证SSL证书。当服务器证书无效或不可信时,会抛出异常。 然后,我们创建一个socket对象s,并使用context.wrap_socket()函数对其进行包装,生成了一个加密的socket对象ssl_sock。我们将server_hostname参数设置为服务器的主机名,表示验证服务器的主机名。 然后,我们使用ssl_sock.connect()函数连接到服务器,并使用ssl_sock.send()函数发送数据。使用ssl_sock.recv()函数接收服务器返回的数据。最后,我们使用ssl_sock.close()函数关闭连接。 ## SSL加密连接配置 Pythonssl模块提供了一些选项,可以配置SSL加密连接。下面是一些常用的选项: - ssl_version:指定使用的SSL/TLS协议版本,默认为PROTOCOL_TLS。 - ciphers:指定加密算法的列表,默认为None。 - certfile:指定客户端证书文件的路径。 - keyfile:指定客户端私钥文件的路径。 - ca_certs:指定服务器证书颁发机构的证书文件的路径。 - check_hostname:指定是否验证服务器的主机名,默认为False。 - verify_mode:指定SSL证书验证的级别,默认为CERT_NONE。 下面是一个简单的例子,使用ssl模块配置SSL加密连接: ```python import socket import ssl # 创建一个SSLContext对象 context = ssl.create_default_context() # 设置加密算法和证书文件 context.set_ciphers('AES256-SHA') context.load_cert_chain(certfile='client.crt', keyfile='client.key') # 设置SSL证书验证选项 context.check_hostname = True context.verify_mode = ssl.CERT_REQUIRED context.load_verify_locations(cafile='ca.crt') # 创建一个socket对象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 对socket对象进行包装 ssl_sock = context.wrap_socket(s, server_hostname='www.example.com') # 连接到服务器 ssl_sock.connect(('www.example.com', 443)) # 发送数据 ssl_sock.send(b'Hello, world!') # 接收数据 data = ssl_sock.recv(1024) # 关闭连接 ssl_sock.close() ``` 在上面的例子中,我们首先创建一个SSLContext对象,并设置加密算法和证书文件。我们将ciphers选项设置为'AES256-SHA',表示使用AES256-SHA加密算法进行加密。我们使用load_cert_chain()函数加载客户端证书和私钥文件。我们将certfile选项设置为'client.crt',表示客户端证书文件的路径,将keyfile选项设置为'client.key',表示客户端私钥文件的路径。 然后,我们设置SSL证书验证选项。我们将check_hostname选项设置为True,表示验证服务器的主机名。我们将verify_mode选项设置为ssl.CERT_REQUIRED,表示验证SSL证书。我们使用load_verify_locations()函数加载服务器证书颁发机构的证书文件。我们将cafile选项设置为'ca.crt',表示服务器证书颁发机构的证书文件的路径。 然后,我们创建一个socket对象s,并使用context.wrap_socket()函数对其进行包装,生成了一个加密的socket对象ssl_sock。我们将server_hostname参数设置为服务器的主机名,表示验证服务器的主机名。 然后,我们使用ssl_sock.connect()函数连接到服务器,并使用ssl_sock.send()函数发送数据。使用ssl_sock.recv()函数接收服务器返回的数据。最后,我们使用ssl_sock.close()函数关闭连接。 ## 总结 Pythonssl模块提供了一种简单的方式来使用SSL加密协议。在使用SSL/TLS协议建立连接时,可以保护数据在传输过程中不被窃听、篡改或伪造。在使用ssl模块建立加密连接时,可以验证SSL证书,并配置SSL加密连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值