5

当我使用curl without -k打开 url 时,我的请求通过了,我可以看到预期的结果。

$ curl -vvv https://MYHOSTNAME/wex/archive.info -A SUKU$RANDOM
*   Trying 10.38.202.192...
* Connected to MYHOSTNAME (10.38.202.192) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
* Server certificate: *.MYCNAME
* Server certificate: ProdIssuedCA1
* Server certificate: InternalRootCA
> GET /wex/archive.info HTTP/1.1
> Host: MYHOSTNAME
> User-Agent: SUKU19816
> Accept: */*
> 
< HTTP/1.1 200 OK
< Server: nginx/1.10.2
< Date: Thu, 26 Jan 2017 01:08:40 GMT
< Content-Type: text/html;charset=ISO-8859-1
< Content-Length: 19
< Connection: keep-alive
< Set-Cookie: JSESSIONID=1XXXXXXXX3E58093E816FE62D81; Path=/wex/; HttpOnly
< X-WebProxy-Id: 220ffb81872a
< 




status=Running
* Connection #0 to host MYHOSTNAME left intact

但是当我打开相同的 url 失败时。 -k对我来说这没有任何意义,因为据我了解,目的-k只是跳过证书验证

$ curl -vvv https://MYHOSTNAME/wex/archive.info -A SUKU$RANDOM -k
*   Trying 10.38.202.192...
* Connected to MYHOSTNAME (10.38.202.192) port 443 (#0)
* Server aborted the SSL handshake
* Closing connection 0
curl: (35) Server aborted the SSL handshake

请求流程:

  1. 在 HAPROXY 机器上发生 SSL 终止
  2. HAPROXY 会将请求转发给 nginx
4

1 回答 1

3

要解决此类问题,该--resolve选项可能很有用:

curl -k -I --resolve www.example.com:80:192.0.2.1 https://www.example.com/

为特定主机和端口对提供自定义地址。使用它,您可以使 curl 请求使用指定的地址,并防止使用其他正常解析的地址。将其视为命令行上提供的一种 /etc/hosts 替代方案。端口号应该是用于主机将用于的特定协议的号码。这意味着如果要为同一主机但不同端口提供地址,则需要多个条目。

特别是如果您尝试从中获取的站点使用 SNI:在这种情况下,您可以使用该--resolve选项来指定在 TLS 客户端 hello 中使用的服务器名称。

要尝试的一个故障排除步骤:从源代码自行更新curl编译,然后重试。一方面,某些curl版本(例如,MacOS)可能不会为-k/发送 SNI --insecure

如果这是您遇到的问题并且您无法替换curl那么您可以使用一种解决方法,该解决方法主要涉及创建您自己的 CA 和私钥以及 CSR,并调整您的 haproxy。

设置完成后,您可以使用or代替指定-k/ :--insecure--cacert--capath

curl https://example.com/api/endpoint --cacert certs/servers/example.com/chain.pem
curl https://example.com/api/endpoint --capath certs/ca

如果您遇到的问题是由 SNI 引起的,您也可以使用https://sni.velox.ch/之类的网站对其进行故障排除:

curl --insecure https://sni.velox.ch/

否则,如果它不是 SNI,那么我记得在某处看到-k/--insecure可能无法按预期使用某些代理配置。因此,如果您从客户端通过某种代理,并且您可以在没有代理的情况下以某种方式直接测试,那可能值得探索。

于 2017-01-26T06:20:55.963 回答