OpenSSL错误: 02001002: 系统库: fopen: 没有那个文件或目录,找不到密钥、密码错误或文件格式错误,Git Bash vs CMD。

9

我有一个应用程序,使用双向认证公开URL。现在我正在编写一个使用Popen运行curl命令连接到该应用程序并获取所需数据的Python脚本。但是当我运行Python脚本时,会出现以下错误。

curl: (58) 无法加载PEM客户端证书,OpenSSL错误:error: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

现在进行测试时,我在Git Bash for Windows中运行了相同的命令,并成功地得到了结果。但是当我在Git Cmd for Windows或Windows Cmd中运行相同的命令时,我得到了上面提到的错误。

我已检查证书路径是否正确,它们采用PEM格式,我已经安装了openssl和curl。由于某些原因,我不能使用Python包Requests或urllib3,只能使用curl。上述情况使我相信,在Windows CmdGit Cmd for Windows中缺少一些设置,但我不确定可能是什么。


为了明确起见,root.crt 是自签名证书,用于签署客户端 crt。两者都是使用 OpenSSL 和 Windows CLI 生成的。 - HumbleProgrammer
不了解curl中的证书,但是你应该使用反斜杠,而不是斜杠,例如C:\local_cert\root.crt而不是C:/local_cert/root.crt - James Z
使用正斜杠是指定路径的Unix风格。这是一种平台中立的方式,也就是说,Windows系统也支持这种指定路径的方式。 - HumbleProgrammer
1个回答

1

经过尝试了很多方法,我终于找到了答案。错误提示说没有找到文件,密码短语错误或格式错误。由于在git bash中命令可以正常工作,我确定这不是文件或密码短语的问题。集中精力解决“未找到文件”的问题,我发现下面的链接:

Windows PATH to posix path conversion in bash

给了我一个想法,也许我指定路径的方式不正确,这取决于我们使用的curl版本。因此,在尝试各种组合后,我发现如果您在git bash中使用普通的curl,则以下两个命令都将起作用。

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

并且

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

但是在Windows的Cmd或从Python调用curl时,只有以下命令才能正常工作

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

总之,这个问题归根结底是由于引号的使用方式不同导致的。这取决于您调用curl实用程序的方式以及使用的curl版本(是否编译为Windows版本),因此引号的解释也会有所不同。

1
你的最后两个命令看起来对我来说是一样的。为什么一个可以工作而另一个不行? - neves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接