如何在Python中以编程方式传递密码

时间:2018-08-16 07:22:45

标签: python python-2.7 python-requests

我正在使用请求库来自动化API /微服务。我尝试在获取请求中传递URL,证书(证书文件和密钥文件的路径)。

运行该程序后,它要求输入PEM密码。请参考下面的命令提示符行。

>>> r = requests.get("https://foo.example.com/api/user/bill", cert=("client.crt", "client.key"))
Enter PEM pass phrase:
>>>

如何避免在程序中以编程方式传递密码,以免人工干预在程序中输入PEM密码?

帮助表示赞赏。

4 个答案:

答案 0 :(得分:1)

在撰写本文时(2018年8月),您似乎不走运。有一个open issue on the requests tracker from September 2013可以解决这种情况。列出了几种解决方法,其中涉及使用不同的库或在不使用密码的情况下生成新密钥。

  

据我所知,目前无法为用于身份验证的客户端证书指定密码。

     

这有点问题,因为您通常总是想用密码保护包含私钥的.pem文件。 openssl甚至不允许您创建没有密码的人。

答案 1 :(得分:0)

我认为,您正在请求模块中寻找“ verify”选项。

选中此link

尝试以下步骤:

  • 将密码短语保存在PEM文件中,例如:test.pem
  • 使用以下代码:

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