【问题标题】:Use self signed certificate with cURL?使用带有 cURL 的自签名证书?
【发布时间】:2015-02-21 01:18:12
【问题描述】:

我有一个使用自签名证书运行的烧瓶应用程序。我可以使用以下方式发送 curl 请求:

curl -v -k -H "Content-Type: application/json" -d '{"data":"value1","key":"value2"}' https://<server_ip>:<port>

详细日志显示一切正常。

我想避免使用 -k (--insecure) 选项,而是指定 curl 可以使用的 .pem 文件。查看 curl 手册页,我发现您可以使用 --cert 选项执行此操作。 所以我使用这个创建了一个 .pem 文件:

openssl rsa -in server.key -text > private.pem

使用 private.pem 文件时,CURL 向我抛出此错误:

curl: (58) unable to use client certificate (no key found or wrong pass phrase?)

有什么建议吗? - 还是只有使用正确签名的证书才能做到这一点?

Tnx

【问题讨论】:

    标签: ssl curl ssl-certificate


    【解决方案1】:

    通过 curl 向 https 服务器发出请求。我使用以下步骤

    • Step1:在您要使用的项目的根目录下生成带有以下代码的自签名证书。openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -nodes
    • Step2:在提示中填写所需的详细信息,但当您到达 Common name 输入 localhost e.g Common Name (eg, fully qualified host name) []:localhost
    • step3: 当你的 openssl cert.pem & key.pem 生成启动你的服务器然后在另一个终端或命令行运行curl --cacert cert.pem https://localhost:443

    注意:我使用端口 443,这是默认的 https 端口,您可以使用另一个端口,然后确保 cert.pem 文件路径被很好地引用。

    【讨论】:

      【解决方案2】:

      这只是这个问题的另一个版本:Using openssl to get the certificate from a server

      或者说得更直白:

      使用curl --cert是错误的,它是为了客户端证书。

      首先,获取您的服务器正在使用的证书:

      $ echo quit | openssl s_client -showcerts -servername server -connect server:443 > cacert.pem
      

      -servername 是 SNI 所必需的,以便您取回正确的虚拟服务器证书)

      然后让您的 curl 命令行使用该设置在后续操作中验证服务器:

      $ curl --cacert cacert.pem https://server/ [and the rest]
      

      【讨论】:

      • 我试过这样做,但我仍然得到同样的错误:curl: (58) unable to use client certificate (no key found or wrong pass phrase?)。我按照这些说明生成了我的自签名客户端和服务器证书:dst.lbl.gov/~boverhof/openssl_certs.html。我还能做错什么?
      • 这会将其他输出添加到 cacert.pem。您可以改用此命令行:´openssl s_client -showcerts -servername server -connect server:443 server.pem'
      • ...openssl 也应该被告知“退出”以避免挂起(并导致对 Web 服务器的“错误请求”):echo quit | openssl s_client -showcerts -servername server -connect server:443 &gt; cacert.pem
      • 请注意,-servername 假定服务器支持 SNI。 Apache 1.x - 2.2 并没有省略 -servername 参数。 openssl.org/docs/manmaster/man1/s_client.html
      • 感谢您的帖子,它帮助我通过 curl 从 https 服务器发出请求。下面的命令是我使用的 $ curl --cacert file-path.pem localhost:443
      猜你喜欢
      • 2013-07-08
      • 1970-01-01
      • 2020-09-20
      • 2014-05-05
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多