curl能够从https获取;但是从golang的http.get(),相同的https URL无法正常工作

时间:2019-05-21 13:07:37

标签: http go curl https

当我执行curl https://10.184.96.62:3000/status时,服务器会发回json数据。一切都很好。

使用以下golang代码,应用程序将打印:

  

2019/05/21 18:29:15获取https://10.184.96.62:3000/status:x509:无法   验证10.184.96.62的证书,因为它不包含任何证书   IP SAN

package main

import (
        "log"
        "net/http"
)

func main() {
        _, err := http.Get("https://10.184.96.62:3000/status")
        if err != nil {
                log.Fatal(err)
        }
}

我想念什么?

2 个答案:

答案 0 :(得分:2)

错误消息指示的问题特定于HTTPS与IP地址的组合:通常,SSL证书使用主机名来检查服务器的真实性。在您的情况下,没有主机名,而是IP地址。对于您的问题,有两种可能的解决方案:

  1. 使用主机名代替IP地址,然后将该主机名放入您的证书中。
  2. 将要使用的IP地址放入证书的subjectAltNames(“主题备用名称”-SAN)字段中(请参阅RFC 5280)。

答案 1 :(得分:0)

问题出在我生成的证书上。我使用openssl创建了一个自签名证书。在我共享时,curl能够使用它与服务器建立连接。但不是go应用程序。

在某个论坛上,我看到一条评论,说在这种情况下使openssl很难工作。因此,我使用此go code来生成证书。使用此证书,go app也可以发出请求,而无需更改我在问题中共享的源代码。

希望这可以帮助需要帮助的人。