如何执行https请求与违反不完整的TLS证书?

时间:2017-10-31 09:06:13

标签: ssl go x509

我试图针对具有不完整TLS证书链的网址发出https请求。以下是Qualys test tool的相关部分,其中显示缺少证书链" Symantec Class 3安全服务器CA-G4"

SSL report screengrab

大多数浏览器确实应对此问题,大概是因为他们预装了Symantec证书?但是,一个简单的golang示例将失败,错误为x509: certificate signed by unknown authority

package main

import (
"log"
"net/http"
)

func main() {

    _, err := http.Get("https://www.example.com/")
    if err != nil {
        log.Fatal(err)
    } else {
        log.Println("Success!") 
    }
}

我已通知相关网站,但是有没有办法可以将丢失的证书插入证书存储区中使用

2 个答案:

答案 0 :(得分:3)

要解决此问题,我刚刚更新了客户端上的系统证书存储区,以包含缺少的中间证书。

客户端在基于Ubuntu的服务器上运行,因此解决了这个问题:

#download certificate
cd /usr/local/share/ca-certificates
curl -O https://symantec.tbs-certificats.com/SymantecSSG4.crt

#dump the fingerprint
openssl x509 -noout -fingerprint -sha256 -inform pem -in SymantecSSG4.crt 

我检查了与测试工具报告我丢失的指纹匹配的输出:

SHA256 Fingerprint=EA:E7:2E:B4:54:BF:6C:39:77:EB:D2:89:E9:70:B2:F5:28:29:49:19:00:93:D0:D2:6F:98:D0:F0:D6:A9:CF:17

然后我用这个更新了证书商店:

update-ca-certificates

答案 1 :(得分:1)

我最近对此有需求,并想在这里分享我的解决方案。像Chrome这样的浏览器之所以能够处理此问题,是因为它们支持X.509的AIA扩展,该扩展提供了下载给定证书颁发证书的URL。然后,Chrome将发布的证书添加到链中并重试验证,沿着路径前进,直到证书用完或找到由批准的根CA颁发的证书为止。

我已经制作了一个小库来支持它。您可以在这里找到它:https://github.com/fcjr/aia-transport-go

用法就像使用提供的自定义配置的http.Transport一样简单:

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/fcjr/aia-transport-go"
)

func main() {
    tr, err := aia.NewTransport()
    if err != nil {
        log.Fatal(err)
    }
    client := http.Client{
        Transport: tr,
    }
    res, err := client.Get("https://incomplete-chain.badssl.com/")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res.Status)
}