我正在使用请求库来自动化API /微服务。我尝试在获取请求中传递URL,证书(证书文件和密钥文件的路径)。
运行该程序后,它要求输入PEM密码。请参考下面的命令提示符行。
>>> r = requests.get("https://foo.example.com/api/user/bill", cert=("client.crt", "client.key"))
Enter PEM pass phrase:
>>>
如何避免在程序中以编程方式传递密码,以免人工干预在程序中输入PEM密码?
帮助表示赞赏。
答案 0 :(得分:1)
在撰写本文时(2018年8月),您似乎不走运。有一个open issue on the requests tracker from September 2013可以解决这种情况。列出了几种解决方法,其中涉及使用不同的库或在不使用密码的情况下生成新密钥。
据我所知,目前无法为用于身份验证的客户端证书指定密码。
这有点问题,因为您通常总是想用密码保护包含私钥的.pem文件。 openssl甚至不允许您创建没有密码的人。
答案 1 :(得分:0)
我认为,您正在请求模块中寻找“ verify
”选项。
选中此link
尝试以下步骤:
r = requests.get("https://foo.example.com/api/user/bill", cert=("client.crt", "client.key"), verify="test.pem")
答案 2 :(得分:0)
import requests
from urllib3.util.ssl_ import create_urllib3_context
from requests.adapters import HTTPAdapter
cert_path = "path/to/certfile.crt"
private_key_path = "path/to/private_certificate_file.pem"
passphrase_key = "someSecretKey"
class SSLAdapter(HTTPAdapter):
def init_poolmanager(self, *args, **kwargs):
context = create_urllib3_context()
context.load_cert_chain(certfile=cert_path, keyfile=private_key_path, password=passphrase_key)
kwargs['ssl_context'] = context
return super().init_poolmanager(*args, **kwargs)
session = requests.Session()
session.verify = False # If you don't want to validate server's public certificate
session.mount("https://", SSLAdapter())
response = session.post(url)
print(response.json())
我最近正在处理同一个问题,我有一个加密的私人证书,在python的其余api调用期间,必须使用密码短语对其进行解密。我只是想分享我的代码来回答这个问题。该代码对我有用。
答案 3 :(得分:0)
请求库尚不支持受密码保护的PEM文件。
一种选择是将其转换为pkcs12文件,并使用https://pypi.org/project/requests-pkcs12/中的requests-pkcs12库
另一种选择是将其转换为pkcs12文件,然后转换为无密码的PEM文件。
您可以将其转换如下:
# Password protected PEM to pkcs12
openssl pkcs12 -export -out cert.p12 -in cert.pem -inkey key.pem -passin pass:supersecret -passout pass:supersecret
# pkcs12 to PEM without password
openssl pkcs12 -in cert.p12 -out cert_without_pwd.pem -nodes -password supersecret