使用来自命令行的 CURL 进行 https 连接

我是一个新的卷曲和卡塞尔茨世界和面临的问题,而连接到一个服务器。 基本上,我需要通过 https 测试从一台机器到另一台机器的连接性。 我有一个 URL,我需要从机器 A (一个 linux 机器)连接到它 我在命令提示符下试过了

cmd> curl https://[my domain or IP address]

得到了如下结果:

curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

在浏览网上的一些文章时,我这样做了:

openssl s_client -connect <domain name or Ip address>:443

得到了一些回应,包括 服务器证书(在 -----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----内)。

接下来我应该做什么。我想,我只需要复制粘贴内部的文本 并将其保存到一个文件中。 但是, 它应该是什么类型的文件? .pem.crt? 。 之后我该做什么?

我尝试了这种方法——复制 BEGIN CERTIFICATE & END CERTIFICATE中的文本并将其保存在 .crt文件中——命名为 my-ca.crt(也尝试了同样的方法,将其命名为 my-ca.pem文件) 然后做了这个:

cmd>curl --cacert my-ca.crt https://[my domain or IP address]

但也出现了同样的错误。

1086842 次浏览

使用 --cacert指定 .crt文件。 例如 ca-root-nss.crt

我也遇到了同样的问题——我从自己的站点获取一个页面,这个页面是通过 HTTPS 提供的,但 curl 提供了相同的“ SSL 证书问题”消息。我通过在调用中添加 -k标志来解决这个问题,从而允许不安全的连接。

curl -k https://whatever.com/script.php

编辑: 我发现了问题的根源。我使用的是 SSL 证书(来自 StartSSL,但我认为这不太重要) ,而且没有正确地设置中间证书。如果您遇到与上面的 user1270392相同的问题,那么在使用 curl -k修复程序之前,最好使用 测试 SSL 证书并修复它的任何问题。

在这里,您可以找到 CA 证书,其中包含下载和转换 Mozilla CA 证书 的说明。 一旦你得到 ca-bundle.crt或者 cacert.pem,你只需要使用:

curl.exe --cacert cacert.pem https://www.google.com

或者

curl.exe --cacert ca-bundle.crt https://www.google.com

您需要为 curl 提供整个证书链,因为 curl 不再附带任何 CA 证书。因为 acert 选项只能使用一个文件,所以您需要将完整的链信息连接到一个文件中

将证书链(例如,从您的浏览器)复制到 DER 编码的二进制 x. 509(. cer)中。

将 certs 转换为 PEM,并将它们连接到1个文件中。

openssl x509 -inform DES -in file1.cer -out file1.pem -text
openssl x509 -inform DES -in file2.cer -out file2.pem -text
openssl x509 -inform DES -in file3.cer -out file3.pem -text


cat *.pem > certRepo


curl --cacert certRepo -u user:passwd -X GET -H 'Content-Type: application/json' "https//somesecureserver.com/rest/field"

我在这里写了一篇关于如何做到这一点的博客: http://javamemento.blogspot.no/2015/10/using-curl-with-ssl-cert-chain.html

基本证书信息

这是我每天的剧本:

curl --insecure -vvI https://www.example.com 2>&1 | awk 'BEGIN { cert=0 } /^\* SSL connection/ { cert=1 } /^\*/ { if (cert) print }'

产出:

* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: C=US; ST=California; L=Los Angeles; O=Verizon Digital Media Services, Inc.; CN=www.example.org
*  start date: Dec 10 00:00:00 2021 GMT
*  expire date: Dec  9 23:59:59 2022 GMT
*  issuer: C=US; O=DigiCert Inc; CN=DigiCert TLS RSA SHA256 2020 CA1
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x5588e1f5ae30)
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
* Connection #0 to host www.example.com left intact


完整的证书信息

openssl s_client -connect www.example.com:443 </dev/null 2>/dev/null | openssl x509 -inform pem -text

我实际上遇到了这种问题,我通过这些步骤解决了它:

  1. 从这里获取根 CA 证书包: https://curl.haxx.se/ca/cacert.pem并将其保存在本地

  2. 找到 php.ini文件

  3. curl.cainfo设置为证书的路径:

Cainfo =/path/of/the/keys/ccert.pem

已经发现了问题 我能够使用现有的系统默认 CA 文件,在 debian6上是:

/etc/ssl/certs/ca-certificates.crt

作为 root 可以这样做:

echo curl.cainfo=/etc/ssl/certs/ca-certificates.crt >> /etc/php5/mods-available/curl.ini

然后重新启动网络服务器。

对我来说,我只是想测试一个网站,有一个自动 http-> https 重定向。我想我已经安装了一些证书,所以这个只适用于运行 curl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3的 Ubuntu 16.04

curl --proto-default https <target>

你可以用这个

curl_setopt($curl->curl, CURLOPT_SSL_VERIFYPEER, false);

使用现代版本的 curl,您可以简单地覆盖要连接到的 ip 地址,使用—— decision 或—— connect-to (curl 比7.49版本更新)。这甚至适用于 SSL/SNI。所有详细信息都在手册页中。

例如,使用特定的 ip 地址覆盖 DNS 并使用 ssl 连接到 www.example.com: (这也将覆盖 ipv6)

curl --resolve www.example.com:443:192.168.42.2 https://www.example.com/

另一个示例是,连接到端口8080上名为 backend1的特定后端服务器

curl --connect-to www.example.com:80:backend1.example.com:8080 http://www.example.com/

如果服务器需要添加主机头才能正确回答,请记住添加主机头:

-H 'Host:www.example.com'

您需要的是证书链,而不是单个证书。 使用 Firefox 很容易得到:

  1. 在 Firefox 中打开 URL。
  2. 单击 URL 左侧地址框上的安全图标。
  3. 点击 connection not securemore information。在 security选项卡下,选择 view certificate,向末尾滚动。在 download旁边,选择要下载证书链的

现在您已经有了证书链作为一个文件,您可以在 curl 请求中使用 --cacert标志之后的文件:
curl --cacert downloaded.pem -X POST https://the-url-to-access

将 JavaKeyStore (. jks)转换为隐私增强邮件文件(. pem)

使用 keytool 将 JKS 转换为 PKCS:

keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.pkcs -srcstoretype JKS -deststoretype PKCS12

现在使用 openssl 将 PKCS 转换为 PEM:

openssl pkcs12 -in keystore.pkcs -out certificate.pem