我的本地设置:
安装了 python 3.8 的 pyenv 在这个环境中安装了 checkov 及其依赖项
问题:
当我运行 checkov 时,我得到以下信息:SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书
当我添加这样的 ca-cert 引用时:checkov --ca-certificate=/usr/local/etc/openssl@3/cert.pem 或这样:checkov --ca-certificate=/Users/myuser/。 pyenv/versions/3.8.18/lib/python3.8/site-packages/certifi/cacert.pem
工作没有问题。
但是,单独运行 checkov 仍然会抱怨它无法找到有效的 ca 证书。
问题:
如何在这个 pyenv 中将此捆绑包设置为默认值。
我尝试过的:
创建符号链接:ln -s /Users/myuser/.pyenv/versions/3.8.18/lib/python3.8/site-packages/certifi/cacert.pem /etc/ssl/certs/cert.pem
导出REQUESTS_CA_BUNDLE:导出REQUESTS_CA_BUNDLE=/Users/myuser/.pyenv/versions/3.8.18/lib/python3.8/site-packages/certifi/cacert.pem
这也解决了我的问题:如何让Python使用来自Mac OS TrustStore的CA证书?
质疑这是否是唯一的选择。
要在您的
pyenv
环境中默认使用 CA 证书捆绑包,您可以按照几个步骤来确保证书始终可用,而无需在每次运行 checkov
时手动指定。您可以采取以下一些方法:
REQUESTS_CA_BUNDLE
环境变量您可以在 shell 配置文件(例如 .bashrc、.zshrc 等)中设置 REQUESTS_CA_BUNDLE 环境变量以指向 CA 证书包。这将确保当您运行 Python 脚本或命令时它始终可用。
export REQUESTS_CA_BUNDLE=/Users/myuser/.pyenv/versions/3.8.18/lib/python3.8/site-packages/certifi/cacert.pem
将此行添加到您的 shell 配置文件中并重新加载它:
source ~/.bashrc # or ~/.zshrc, depending on your shell
certifi
设置 CA 捆绑包您还可以使用
certifi
包来设置 CA 捆绑包。这是一种更 Pythonic 的处理方式。
import certifi
import os
os.environ['REQUESTS_CA_BUNDLE'] = certifi.where()
您可以将此代码添加到运行 checkov 或任何其他需要 SSL 验证的脚本之前运行的 Python 脚本中。
checkov
脚本如果您想修改
checkov
脚本本身以始终使用 CA 捆绑包,您可以编辑 checkov
脚本并在开头添加以下行:
import certifi
import os
os.environ['REQUESTS_CA_BUNDLE'] = certifi.where()
这可确保
checkov
始终使用正确的 CA 捆绑包。
如果您有要使用的自定义 CA 捆绑包,您可以在系统 SSL 配置识别的目录中创建指向它的符号链接。
sudo ln -s /Users/myuser/.pyenv/versions/3.8.18/lib/python3.8/site-packages/certifi/cacert.pem /usr/local/share/ca-certificates/custom-ca.crt
sudo update-ca-certificates
此方法可确保系统识别并默认使用自定义 CA 捆绑包。
您还可以专门为您的
pyenv
环境设置环境变量。在项目目录中创建一个 .python-version
文件并在其中添加环境变量:
echo "export REQUESTS_CA_BUNDLE=/Users/myuser/.pyenv/versions/3.8.18/lib/python3.8/site-packages/certifi/cacert.pem" >> .python-version
这可确保每当您激活此 pyenv 环境时都会设置环境变量。
结论 在 shell 配置文件中或直接在
REQUESTS_CA_BUNDLE
脚本中设置 checkov
环境变量是确保 CA 证书包始终可用的最直接、最有效的方法。这种方法避免了每次运行时都需要手动指定 CA 证书checkov
。