如何针对不完整的 TLS 证书执行 https 请求?
How to perform https request with go against incomplete TLS certificate?
我正在尝试针对具有不完整 TLS 证书链的 URL 发出 https 请求。这是 Qualys test tool 的相关部分,它显示证书链丢失 "Symantec Class 3 Secure Server CA - G4" :
大多数浏览器都能解决这个问题,大概是因为它们预装了 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!")
}
}
我已经通知了相关站点,但是有什么方法可以将丢失的证书插入到正在使用的证书库中?
为了解决这个问题,我刚刚更新了客户端上的系统证书存储以包含丢失的中间证书。
客户端 运行 在基于 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
我最近有这个需求,想在这里分享我的解决方案。像 Chrome 这样的浏览器可以处理这个问题的原因是因为它们支持 X.509 的 AIA 扩展,它提供 url 下载给定的证书颁发证书。 Chrome 然后将颁发证书添加到链中并重试验证,沿着路径一直走,直到它用完证书或找到一个由批准的根 CA 颁发的证书。
我在 go 中制作了一个小库来支持这一点。您可以在这里找到它: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)
}
我正在尝试针对具有不完整 TLS 证书链的 URL 发出 https 请求。这是 Qualys test tool 的相关部分,它显示证书链丢失 "Symantec Class 3 Secure Server CA - G4" :
大多数浏览器都能解决这个问题,大概是因为它们预装了 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!")
}
}
我已经通知了相关站点,但是有什么方法可以将丢失的证书插入到正在使用的证书库中?
为了解决这个问题,我刚刚更新了客户端上的系统证书存储以包含丢失的中间证书。
客户端 运行 在基于 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
我最近有这个需求,想在这里分享我的解决方案。像 Chrome 这样的浏览器可以处理这个问题的原因是因为它们支持 X.509 的 AIA 扩展,它提供 url 下载给定的证书颁发证书。 Chrome 然后将颁发证书添加到链中并重试验证,沿着路径一直走,直到它用完证书或找到一个由批准的根 CA 颁发的证书。
我在 go 中制作了一个小库来支持这一点。您可以在这里找到它: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)
}