You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用tls.Dial遇“too many colons in address”等错误的问题排查

问题排查与解决方案

嘿,你踩了个很常见的小坑——tls.Dial的地址格式理解错啦!咱们一步步拆解问题:

核心问题1:地址带了多余的https://前缀

tls.Dial("tcp", url, nil)里的第二个参数需要的是**主机名:端口**的纯网络地址格式,完全不需要带https://这个HTTP协议前缀。你现在的数组里每个地址都加了https://,导致Go解析地址时把整个字符串当成主机名,里面的冒号会被误判,直接抛出too many colons in address错误。

核心问题2:错误给域名套了方括号

方括号[]是专门用来包裹IPv6地址的(比如[2001:db8::1]:443),普通域名完全不需要加。你给wrong.host.badssl.com这类域名套了括号,Go会把[https://wrong.host.badssl.com]当成一个完整的主机名去解析,自然找不到对应的IP,所以报no such host

修正后的完整代码示例

package main

import (
	"crypto/tls"
	"log"
)

func checkTLSCert(address string) {
	// 直接传入「主机:端口」格式的纯网络地址
	conn, err := tls.Dial("tcp", address, nil)
	if err != nil {
		log.Printf("Unable to get %q - %s\n", address, err)
		return
	}
	defer conn.Close()

	// 示例:获取并打印证书的通用名称
	certs := conn.ConnectionState().PeerCertificates
	if len(certs) > 0 {
		log.Printf("Valid certificate for %q: %s\n", address, certs[0].Subject.CommonName)
	}
}

func main() {
	// 修正后的地址数组:去掉https://,移除多余的方括号
	var addresses = []string{
		"google.com:443",
		"expired.badssl.com:443",
		"wrong.host.badssl.com:443",
		"self-signed.badssl.com:443",
	}

	for _, addr := range addresses {
		checkTLSCert(addr)
	}
}

额外说明

tls.Dial的本质是先建立TCP连接,再发起TLS握手,所以它只关心网络层面的主机和端口,和HTTP协议前缀完全无关。如果之后需要处理完整的HTTPS请求,才需要用到net/http包的客户端,但单纯检查证书状态,用修正后的地址格式就完全够用啦。

内容的提问来源于stack exchange,提问作者Roger Creasy

火山引擎 最新活动