
本文深入探讨 splunk 在使用 python v3 从外部源拉取数据时遇到的 ssl 证书验证失败问题,特别是“自签名证书链”错误。核心解决方案是识别并添加缺失的根证书和中间证书到 splunk 或 python 的信任存储中,确保构建完整的证书信任链,从而避免不安全的证书验证绕过,保障数据传输的安全性与稳定性。
当 Splunk 配置为通过其内置的 Python 环境(如 Python v3)从外部源拉取数据时,如果遇到 SSLCertVerificationError,并伴随 [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain 这样的错误信息,这表明 Python 无法验证目标服务器提供的 SSL/TLS 证书。
SSL/TLS 证书验证是一个信任链(Trust Chain)的过程。服务器会提供一个证书,这个证书通常由一个或多个中间证书颁发机构(Intermediate CA)签发,而这些中间证书又由一个根证书颁发机构(Root CA)签发。客户端(这里是 Python)需要从其信任的根证书列表开始,逐级向上验证,直到找到一个它信任的根证书。如果在这个链条中的任何环节出现问题,例如:
self signed certificate in certificate chain 错误通常意味着 Python 在验证过程中遇到了一个它不认识的自签名证书,或者证书链中的某个环节是自签名的,而这个自签名证书的颁发者不在 Python 的信任列表中。
Python 应用程序在进行 SSL/TLS 连接时,会依赖一个预设的信任存储来验证服务器证书。这个信任存储通常包含了一系列全球公认的根证书颁发机构的证书。如果目标服务器的证书是由内部 CA 签发,或者是由一个不被 Python 信任的中间 CA 签发,那么 Python 将无法完成信任链的验证,从而拒绝连接。
立即学习“Python免费学习笔记(深入)”;
对于 Splunk 而言,它通常运行在一个相对独立的环境中,其内置的 Python 解释器可能不会直接使用操作系统的全局证书信任存储。因此,即使操作系统层面已经信任了某个 CA 证书,Splunk 的 Python 环境可能仍然需要额外的配置。
解决 SSL 证书验证失败问题的根本方法是确保 Splunk 的 Python 环境能够访问到完整的证书信任链,即它需要信任签发服务器证书的所有根证书和中间证书。
首先,需要识别并获取导致验证失败的根证书和所有中间证书。
获取到必要的 .pem 或 .crt 格式的证书文件后,需要将其添加到 Splunk 或 Python 的信任存储中。
Splunk 作为一个企业级平台,通常有其自身的证书管理机制,或者其内置的 Python 环境会使用特定的证书存储路径。
# 假设你有名为 intermediate_ca.pem 和 root_ca.pem 的文件 cat intermediate_ca.pem root_ca.pem > custom_ca_bundle.pem
# 假设 Splunk 的 Python 路径是 $SPLUNK_HOME/bin/python3 $SPLUNK_HOME/bin/python3 -c "import certifi; print(certifi.where())"
这将输出 cacert.pem 文件的完整路径,例如 $SPLUNK_HOME/lib/python3.x/site-packages/certifi/cacert.pem。
cat custom_ca_bundle.pem >> $(SPLUNK_HOME)/lib/python3.x/site-packages/certifi/cacert.pem
注意: 直接修改 certifi 文件可能在 Splunk 升级时被覆盖,且可能影响其他依赖 certifi 的应用。这通常被视为一种临时或非最佳实践的解决方案。
如果 Splunk 的 Python 环境配置为使用操作系统的信任存储,或者希望影响系统上所有应用程序,可以更新系统级的信任存储。
sudo cp custom_ca_bundle.pem /usr/local/share/ca-certificates/custom_ca_bundle.crt sudo update-ca-certificates
sudo cp custom_ca_bundle.pem /etc/pki/ca-trust/source/anchors/ sudo update-ca-trust extract
重要提示: 系统级更新可能不直接影响 Splunk 独立运行的 Python 环境,因为 Splunk 往往自带独立的 Python 运行时和库路径。优先考虑 Splunk 官方推荐的证书管理方式或针对其内置 Python 环境的修改。
如果 Splunk 的数据输入允许你编写自定义 Python 脚本,并且这些脚本使用 requests 等库进行 HTTP 请求,你可以在代码中显式指定自定义 CA 证书捆绑包的路径。
import requests
# 假设你的自定义 CA 证书捆绑包路径
custom_ca_bundle_path = '/path/to/your/custom_ca_bundle.pem'
try:
response = requests.get('https://your-external-source.com/data', verify=custom_ca_bundle_path)
response.raise_for_status()
print("数据拉取成功:", response.text)
except requests.exceptions.SSLError as e:
print(f"SSL 证书验证失败: {e}")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")这种方法最灵活,但需要 Splunk 输入类型支持自定义 Python 脚本。
如果你的网络环境中存在 SSL 检查代理(也称为 SSL 解密代理或中间人代理),它会拦截并解密所有出站 SSL 流量,然后使用自己的 CA 证书重新签发服务器证书,再加密并发送给客户端。在这种情况下,即使目标服务器的原始证书是有效的,Python 仍然会因为不信任代理的 CA 证书而报错。
解决方案: 除了添加原始服务器的根证书和中间证书外,你还需要获取并添加 SSL 检查代理的根证书到 Splunk 或 Python 的信任存储中。通常,网络管理员会提供这个代理的根证书。
Splunk 中 Python SSL 证书验证失败,尤其是“自签名证书链”问题,核心在于客户端未能完整信任服务器证书的颁发者。通过识别缺失的根证书和中间证书,并将其添加到 Splunk 或其内置 Python 环境的信任存储中,可以构建一个完整的信任链,从而安全、稳定地解决这一问题。在操作过程中,务必遵循最佳实践,避免采取不安全的绕过措施,并注意系统级与应用级证书配置的差异。
以上就是Splunk 中 Python SSL 证书验证失败:根源、解决策略与最佳实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号