如何在golang中创建没有证书的TLS连接?

时间:2019-04-22 05:33:43

标签: ssl go

来源:

// 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。 这有可能吗?

2 个答案:

答案 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}

https://golang.org/pkg/crypto/tls/#Config