来源:
// Listen creates a TLS listener accepting connections on the
// given network address using net.Listen.
// The configuration config must be non-nil and must include
// at least one certificate or else set GetCertificate.
func Listen(network, laddr string, config *Config) (net.Listener, error) {
if config == nil || (len(config.Certificates) == 0 && config.GetCertificate == nil) {
return nil, errors.New("tls: neither Certificates nor GetCertificate set in Config")
}
l, err := net.Listen(network, laddr)
if err != nil {
return nil, err
}
return NewListener(l, config), nil
}
问题在于证书不能为零:
// The configuration config must be non-nil and must include
// at least one certificate or else set GetCertificate.
如何使用没有证书的tls
连接监听?
我需要的是tls
加密,但不是身份验证。
我尝试使用这样的空证书制作tls.Config:
&tls.Config{
Certificates: []tls.Certificate{tls.Certificate{}},
}
但是连接失败,出现tls: handshake failure
。
这有可能吗?
答案 0 :(得分:4)
没有证书的TLS将需要支持不使用证书的密码套件。
查看crypto/tls
的源代码,可以在crypto/tls/cipher_suites.go中找到受支持的密码套件。可以看到那里仅支持使用RSA或ECDSA身份验证的密码套件,这意味着您需要具有带有RSA或ECC密钥的证书。
要支持不带证书的TLS,需要使用PSK,SRP ..或不需要证书或NULL身份验证(匿名,即不进行身份验证)的类似身份验证方法的密码。但是不支持这些。
我需要的是tls加密,而不是身份验证。
在大多数情况下,这种要求首先存在缺陷。 无需身份验证的TLS意味着通常很容易在中间攻击中活跃且无法检测的人,这实际上会使TLS提供的所有加密毫无意义。只有在建立TLS连接之后且在传输任何应用程序有效负载之前客户端可以安全地(即抵抗MITM攻击)对服务器进行身份验证,没有身份验证的TLS才有意义。
答案 1 :(得分:0)
在tls.Config上将InsecureSkipVerify设置为true
&tls.Config{InsecureSkipVerify: true}
并将该配置添加到传输
&http.Transport{TLSClientConfig: tlsConfig}