使用requests库时偶发SSLCertVerificationError问题求助
使用requests库时偶发SSLCertVerificationError问题求助
大家好,我遇到一个特别奇怪的问题:调用接口时偶发出现SSLCertVerificationError,不是每次都会报错——比如第一次请求完全正常,但第二次就可能触发这个错误。
目前我已经做了这些尝试:
- 安装了
certifi库 - 设置了
SSL_CERT_FILE环境变量
实在搞不懂为什么这个错误是间歇性出现的,有没有大佬能给点思路?谢谢!
以下是完整的报错栈信息:
Traceback (most recent call last): File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/uvicorn/protocols/http/httptools_impl.py", line 426, in run_asgi result = await app( # type: ignore[func-returns-value] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/uvicorn/middleware/proxy_headers.py", line 84, in __call__ return await self.app(scope, receive, send) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/fastapi/applications.py", line 1054, in __call__ await super().__call__(scope, receive, send) File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/starlette/applications.py", line 113, in __call__ await self.middleware_stack(scope, receive, send) File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/starlette/middleware/errors.py", line 187, in __call__ raise exc File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/starlette/middleware/errors.py", line 165, in __call__ await self.app(scope, receive, _send) File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app raise exc File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app await app(scope, receive, sender) File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/starlette/routing.py", line 715, in __call__ await self.middleware_stack(scope, receive, send) File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/starlette/routing.py", line 735, in app await route.handle(scope, receive, send) File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/starlette/routing.py", line 288, in handle await self.app(scope, receive, send) File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/starlette/routing.py", line 76, in app await wrap_app_handling_exceptions(app, request)(scope, receive, send) File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app raise exc File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app await app(scope, receive, sender) File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/starlette/routing.py", line 73, in app response = await f(request) ^^^^^^^^^^^^^^^^ File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/fastapi/routing.py", line 301, in app raw_response = await run_endpoint_function( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/fastapi/routing.py", line 214, in run_endpoint_function return await run_in_threadpool(dependant.call, **values) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/starlette/concurrency.py", line 39, in run_in_threadpool return await anyio.to_thread.run_sync(func, *args) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/anyio/to_thread.py", line 56, in run_sync return await get_async_backend().run_sync_in_worker_thread( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/anyio/_backends/_asyncio.py", line 2461, in run_sync_in_worker_thread return await future ^^^^^^^^^^^^ File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/anyio/_backends/_asyncio.py", line 962, in run result = context.run(func, *args) ^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/dde/llm/wiki/app.py", line 48, in get_table_metadata page_content = get_page_content(space, table_name.upper()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/backoff/_sync.py", line 105, in retry ret = target(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/dde/utils/wiki.py", line 22, in get_page_content page = confluence.get_page_by_title(space, title, expand='body.storage', start=None, limit=None) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/atlassian/confluence.py", line 334, in get_page_by_title response = self.get(url, params=params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/atlassian/rest_client.py", line 436, in get response = self.request( ^^^^^^^^^^^^^ File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/atlassian/rest_client.py", line 383, in request response = self._session.request( ^^^^^^^^^^^^^^^^^^^^^^ File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/requests/sessions.py", line 589, in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/requests/sessions.py", line 703, in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/jianfezhang/github/metadata-repo/data-discovery-exp/.venv/lib/python3.11/site-packages/requests/adapters.py", line 698, in send raise SSLError(e, request=request) requests.exceptions.SSLError: HTTPSConnectionPool(host='wiki.corp.xxx.com', port=443): Max retries exceeded with url: /rest/api/content?type=page&expand=body.storage&spaceKey=DBC&title=SRCH_SRP_TOOL_EVENT_FACT (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)')))
一些可能的排查方向(供参考)
- 检查目标服务器的证书配置:有些服务器会配置多组证书或自动轮换证书,不同请求可能命中不同证书,如果其中某组证书的信任链不完整,就会偶发报错
- 确认多线程环境下环境变量的有效性:你的服务是FastAPI+Uvicorn的多线程架构,可能存在
SSL_CERT_FILE环境变量未在所有线程中正确加载的情况,可以在请求前打印os.environ.get('SSL_CERT_FILE')验证 - 检查certifi根证书是否包含目标服务器的CA:用
certifi.where()获取certifi的证书路径,再通过openssl命令验证该证书是否信任目标服务器的证书 - 尝试禁用连接复用:requests的会话会复用连接,可能导致某些连接的证书验证状态异常,可以尝试每次请求新建会话,或在会话中强制刷新证书验证配置
备注:内容来源于stack exchange,提问作者zjffdu
相关产品推荐
相关产品推荐

