Hum*_*mer 10 python bash curl openssl mutual-authentication
我有一个使用相互身份验证公开网址的应用程序。现在我正在编写一个Python脚本,它使用Popen运行curl命令来连接到应用程序并获取所需的数据。但是当我运行 python 脚本时,出现以下错误。
curl:(58)无法加载PEM客户端证书,OpenSSL错误错误:02001002:系统库:fopen:没有这样的文件或目录,(找不到密钥,密码错误或文件格式错误?)
我正在 Windows 7 机器上运行该应用程序。我安装了curl 和openssl。下面给出了运行的命令
curl -v https://localhost:9400/<URL> -H "Connection:close" --cacert 'C:/local_cert/root.crt' --cert 'C:/local_cert/client.crt' --key 'C:/local_cert/client.key' --pass client_key_passwd
Run Code Online (Sandbox Code Playgroud)
现在为了进行测试,我在 Windows 版 Git Bash 中运行了相同的命令。我成功得到了结果。但是当我在 Git Cmd for windows 或 Windows Cmd 中运行相同的命令时,我得到了与上述相同的错误。
我已经检查了证书的路径是否正确,它们是PEM格式,我安装了openssl和curl。由于某些原因,我无法使用Requests或urllib3 python pacakges,只能使用curl。上面的内容让我相信Windows Cmd和Git Cmd for windows缺少一些设置,但我不确定它可能是什么。
在尝试了很多事情之后我终于找到了答案。该错误表示未找到文件、密码错误或格式错误。由于该命令在 git bash 中有效,我确信这不是文件或密码的问题。集中精力找不到文件,我发现下面的链接
bash 中 Windows PATH 到 posix 路径的转换
这给了我一个想法,我指定路径的方式可能不正确,具体取决于我们使用的卷曲版本。因此,在尝试了各种组合之后,我发现如果您在 git bash 中使用普通的curl,那么两个 cmd 都可以工作
curl -v https://localhost:9400/<URL> -H "Connection:close" --cacert 'C:/local_cert/root.crt' --cert 'C:/local_cert/client.crt' --key 'C:/local_cert/client.key' --pass client_key_passwd
Run Code Online (Sandbox Code Playgroud)
和
curl -v https://localhost:9400/<URL> -H "Connection:close" --cacert C:/local_cert/root.crt --cert C:/local_cert/client.crt --key C:/local_cert/client.key --pass client_key_passwd
Run Code Online (Sandbox Code Playgroud)
但在 Windows Cmd 中或从 python 调用curl 时,只有以下 cmd 才可以工作
curl -v https://localhost:9400/<URL> -H "Connection:close" --cacert C:/local_cert/root.crt --cert C:/local_cert/client.crt --key C:/local_cert/client.key --pass client_key_passwd
Run Code Online (Sandbox Code Playgroud)
简而言之,这是一个引号问题,因为调用curl实用程序的方式以及使用哪个版本的curl(是否为Windows编译)对引号的解释会有所不同。
| 归档时间: |
|
| 查看次数: |
43519 次 |
| 最近记录: |