SSL证书验证失败无法登录应用,求排查代码问题
Python登录应用代码错误排查
用户代码
import requests from bs4 import BeautifulSoup import ssl import requests # 重复导入 ssl._create_default_https_context = ssl._create_unverified_context login_url = 'https://x.x.x.x/xxxxx' session = requests.Session() response = requests.get(login_url,verify=False) # 使用普通requests请求而非session response = session.get(login_url) # session请求未关闭SSL验证 login_data = { 'username' : 'xxx', 'password': 'xxx' } # 缺失发送登录请求的代码 if 'Welcome' in login_response.text: print('Login successful') else: print('Login failed.')
报错信息
Traceback (most recent call last): File "C:\Users\mukavya\PycharmProjects\pythonProject\venv\lib\site-packages\urllib3\connectionpool.py", line 467, in _make_request self._validate_conn(conn) File "C:\Users\mukavya\PycharmProjects\pythonProject\venv\lib\site-packages\urllib3\connectionpool.py", line 1092, in _validate_conn conn.connect() File "C:\Users\mukavya\PycharmProjects\pythonProject\venv\lib\site-packages\urllib3\connection.py", line 642, in connect sock_and_verified = _ssl_wrap_socket_and_match_hostname( File "C:\Users\mukavya\PycharmProjects\pythonProject\venv\lib\site-packages\urllib3\connection.py", line 783, in _ssl_wrap_socket_and_match_hostname ssl_sock = ssl_wrap_socket( File "C:\Users\mukavya\PycharmProjects\pythonProject\venv\lib\site-packages\urllib3\util\ssl_.py", line 469, in ssl_wrap_socket ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname) File "C:\Users\mukavya\PycharmProjects\pythonProject\venv\lib\site-packages\urllib3\util\ssl_.py", line 513, in _ssl_wrap_socket_impl return ssl_context.wrap_socket(sock, server_hostname=server_hostname) File "C:\Users\mukavya\AppData\Local\Programs\Python\Python39\lib\ssl.py", line 501, in wrap_socket return self.sslsocket_class._create( File "C:\Users\mukavya\AppData\Local\Programs\Python\Python39\lib\ssl.py", line 1041, in _create self.do_handshake() File "C:\Users\mukavya\AppData\Local\Programs\Python\Python39\lib\ssl.py", line 1310, in do_handshake self._sslobj.do_handshake() ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1129) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\Users\mukavya\PycharmProjects\pythonProject\venv\lib\site-packages\urllib3\connectionpool.py", line 790, in urlopen response = self._make_request( File "C:\Users\mukavya\PycharmProjects\pythonProject\venv\lib\site-packages\urllib3\connectionpool.py", line 491, in _make_request raise new_e urllib3.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1129) The above exception was the direct cause of the following exception: Traceback (most recent call last): File "C:\Users\mukavya\PycharmProjects\pythonProject\venv\lib\site-packages\requests\adapters.py", line 486, in send resp = conn.urlopen( File "C:\Users\mukavya\PycharmProjects\pythonProject\venv\lib\site-packages\urllib3\connectionpool.py", line 844, in urlopen retries = retries.increment( File "C:\Users\mukavya\PycharmProjects\pythonProject\venv\lib\site-packages\urllib3\util\retry.py", line 515, in increment raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type] urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='x.x.x.x', port=xxx): Max retries exceeded with url: /xxxx (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1129)'))) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\Users\mukavya\PycharmProjects\pythonProject\venv\Scripts\templates\datapush2.py", line 27, in <module> login_response = session.post(login_url , data=login_data) File "C:\Users\mukavya\PycharmProjects\pythonProject\venv\lib\site-packages\requests\sessions.py", line 637, in post return self.request("POST", url, data=data, json=json, **kwargs) File "C:\Users\mukavya\PycharmProjects\pythonProject\venv\lib\site-packages\requests\sessions.py", line 589, in request resp = self.send(prep, **send_kwargs) File "C:\Users\mukavya\PycharmProjects\pythonProject\venv\lib\site-packages\requests\sessions.py", line 703, in send r = adapter.send(request, **kwargs) File "C:\Users\mukavya\PycharmProjects\pythonProject\venv\lib\site-packages\requests\adapters.py", line 517, in send raise SSLError(e, request=request) requests.exceptions.SSLError: HTTPSConnectionPool(host='x.x.x.x', port=xxx): Max retries exceeded with url: /xxxx (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1129)'))) Process finished with exit code 1
错误分析与修复方案
代码中的问题点
- 重复导入requests:代码开头两次执行
import requests,属于冗余操作,可删除其中一次。 - session请求未关闭SSL验证:虽然设置了全局SSL不验证,但
session.get(login_url)和后续的session.post请求没有显式添加verify=False参数,导致session请求仍会验证SSL证书,触发自签名证书错误。 - 缺失登录请求发送逻辑:代码中定义了
login_data,但没有执行session.post发送登录请求的代码,导致login_response变量未定义,会引发NameError(报错显示实际代码有这行,但贴出的代码遗漏了)。 - 混用普通requests和session请求:先使用
requests.get(login_url, verify=False),再使用session.get(login_url),两个请求不属于同一个会话,无法共享Cookie等会话信息,失去了使用session的意义。
修复后的代码
import requests from bs4 import BeautifulSoup import ssl # 全局关闭SSL证书验证 ssl._create_default_https_context = ssl._create_unverified_context login_url = 'https://x.x.x.x/xxxxx' session = requests.Session() # 使用session发送GET请求,关闭SSL验证 response = session.get(login_url, verify=False) # 定义登录参数 login_data = { 'username': 'xxx', 'password': 'xxx' } # 发送登录POST请求,关闭SSL验证 login_response = session.post(login_url, data=login_data, verify=False) # 验证登录结果 if 'Welcome' in login_response.text: print('Login successful') else: print('Login failed.')
补充说明
- 若不想全局关闭SSL验证,也可仅在session的请求中添加
verify=False参数,无需设置ssl._create_default_https_context。 - 生产环境中不建议关闭SSL验证,正确做法是将自签名证书添加到信任列表,然后在请求中指定证书路径:
verify="/path/to/certificate.pem"。
内容的提问来源于stack exchange,提问作者Kavya M K
相关产品推荐
相关产品推荐

