You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

proxy.py(v2.3.1)配置自签名证书遇TLSV1_ALERT_UNKNOWN_CA错误

解决proxy.py v2.3.1自签名证书TLSV1_ALERT_UNKNOWN_CA错误

问题背景

在proxy.py(v2.3.1)中使用自签名证书时,出现ssl.SSLError: [SSL: TLSV1_ALERT_UNKNOWN_CA] tlsv1 alert unknown ca错误,即使已将CA证书添加到系统信任列表,问题仍未解决。

现有实现代码

if __name__ == '__main__':
    # get random available port to run proxy
    proxy_port = proxy.common.utils.get_available_port()

    # set up proxy to redirect all requests from the browser through the client
    with proxy.start(
            ['--host', '127.0.0.1',
             '--port', str(proxy_port),
             '--ca-cert-file', '/home/user/app/app-ca.pem',
             '--ca-key-file', '/home/user/app/app-ca.key',
             '--ca-signing-key-file', '/home/user/app/app-signing.key'],
            plugins=
            [b'header_modifier.BasicAuthorizationPlugin',
             header_modifier.BasicAuthorizationPlugin]):
        selenium_proxy.proxyType = ProxyType.MANUAL
        selenium_proxy.httpProxy = '127.0.0.1:' + str(proxy_port)
        selenium_proxy.sslProxy = '127.0.0.1:' + str(proxy_port)
        print('Proxy address: ' + selenium_proxy.httpProxy)
        run_app()

错误日志

Oct 26 14:56:32 raspberrypi python3[2727]: 2023-10-26 14:56:32,654 - pid:2727 [I] load_plugins:334 - Loaded plugin proxy.http.proxy.HttpProxyPlugin
Oct 26 14:56:32 raspberrypi python3[2727]: 2023-10-26 14:56:32,656 - pid:2727 [I] load_plugins:334 - Loaded plugin header_modifier.BasicAuthorizationPlugin
Oct 26 14:56:32 raspberrypi python3[2727]: 2023-10-26 14:56:32,656 - pid:2727 [I] load_plugins:334 - Loaded plugin __main__.BasicAuthorizationPlugin
Oct 26 14:56:32 raspberrypi python3[2727]: 2023-10-26 14:56:32,657 - pid:2727 [I] listen:115 - Listening on 127.0.0.1:42591
Oct 26 14:56:32 raspberrypi python3[2727]: 2023-10-26 14:56:32,692 - pid:2727 [I] start_workers:136 - Started 4 workers
Oct 26 14:56:43 raspberrypi python3[2727]: 2023-10-26 14:56:43,505 - pid:2733 [E] intercept:540 - OSError when wrapping client
Oct 26 14:56:43 raspberrypi python3[2727]: Traceback (most recent call last):
Oct 26 14:56:43 raspberrypi python3[2727]:   File "/usr/local/lib/python3.7/dist-packages/proxy/http/proxy/server.py", line 529, in intercept
Oct 26 14:56:43 raspberrypi python3[2727]:     self.wrap_client()
Oct 26 14:56:43 raspberrypi python3[2727]:   File "/usr/local/lib/python3.7/dist-packages/proxy/http/proxy/server.py", line 559, in wrap_client
Oct 26 14:56:43 raspberrypi python3[2727]:     self.client.wrap(self.flags.ca_signing_key_file, generated_cert)
Oct 26 14:56:43 raspberrypi python3[2727]:   File "/usr/local/lib/python3.7/dist-packages/proxy/core/connection/client.py", line 43, in wrap
Oct 26 14:56:43 raspberrypi python3[2727]:     ssl_version=ssl.PROTOCOL_TLS)
Oct 26 14:56:43 raspberrypi python3[2727]:   File "/usr/lib/python3.7/ssl.py", line 1222, in wrap_socket
Oct 26 14:56:43 raspberrypi python3[2727]:     suppress_ragged_eofs=suppress_ragged_eofs
Oct 26 14:56:43 raspberrypi python3[2727]:   File "/usr/lib/python3.7/ssl.py", line 412, in wrap_socket
Oct 26 14:56:43 raspberrypi python3[2727]:     session=session
Oct 26 14:56:43 raspberrypi python3[2727]:   File "/usr/lib/python3.7/ssl.py", line 853, in _create
Oct 26 14:56:43 raspberrypi python3[2727]:     self.do_handshake()
Oct 26 14:56:43 raspberrypi python3[2727]:   File "/usr/lib/python3.7/ssl.py", line 1117, in do_handshake
Oct 26 14:56:43 raspberrypi python3[2727]:     self._sslobj.do_handshake()
Oct 26 14:56:43 raspberrypi python3[2727]: ssl.SSLError: [SSL: TLSV1_ALERT_UNKNOWN_CA] tlsv1 alert unknown ca (_ssl.c:1056)
Oct 26 14:56:43 raspberrypi python3[2727]: 2023-10-26 14:56:43,511 - pid:2733 [I] access_log:397 - 127.0.0.1:42880 - CONNECT firefox.settings.services.mozilla.com:443 - 0 bytes - 123.52 ms

证书生成步骤

openssl genrsa -out app-ca.key 2048
openssl req -x509 -new -nodes -key app-ca.key -sha256 -days 1825 -out app-ca.pem
openssl genrsa -out app-signing.key 2048
chown user app-*

已尝试操作

将CA证书添加到系统信任列表:

cp app-ca.pem /usr/local/share/ca-certificates/app-ca.crt
update-ca-certificates

执行后输出:

Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

解决方案

1. 让浏览器信任CA证书

系统信任证书不代表浏览器会自动信任(如Firefox、Chrome都有独立的证书存储):

  • 打开浏览器设置,找到证书管理选项
  • 导入/home/user/app/app-ca.pem,勾选“信任此CA用于标识网站”选项

2. 简化proxy.py的证书参数

proxy.py v2.3.1中,CA私钥本身即可用于签名,无需单独指定--ca-signing-key-file。修改启动参数,移除该选项:

with proxy.start(
        ['--host', '127.0.0.1',
         '--port', str(proxy_port),
         '--ca-cert-file', '/home/user/app/app-ca.pem',
         '--ca-key-file', '/home/user/app/app-ca.key'],
        plugins=
        [b'header_modifier.BasicAuthorizationPlugin',
         header_modifier.BasicAuthorizationPlugin]):

3. 确保Python环境信任证书

Python的certifi库可能使用独立的证书存储,可将CA证书追加到其证书文件中:

cat /home/user/app/app-ca.pem >> $(python3 -m certifi)

或者设置环境变量让Python使用系统证书:

export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt

执行上述命令后再运行你的Python脚本。

4. 验证证书有效性

检查CA证书是否可被自身验证:

openssl verify -CAfile app-ca.pem app-ca.pem

若返回app-ca.pem: OK则证书有效;若失败,重新生成CA证书,确保生成时填写的Common Name等信息正确。


内容的提问来源于stack exchange,提问作者wizzfizz94

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:37:01