Как я могу создать соединение TLS без сертификатов в golang? - PullRequest
1 голос
/ 22 апреля 2019

Из источника:

// 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
}

Проблема в том, что сертификаты не могут быть 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 ]

4 голосов
/ 22 апреля 2019

TLS без сертификатов потребует поддержки наборов шифров, которые не используют сертификаты.

Глядя на исходный код crypto/tls, можно найти поддерживаемые комплекты шифров в crypto / tls / cipher_suites.go . Здесь видно, что поддерживаются только наборы шифров, использующие аутентификацию RSA или ECDSA, а это значит, что вам нужен сертификат с ключом RSA или ECC.

Чтобы иметь поддержку TLS без сертификатов, необходимы шифры для PSK, SRP .. или аналогичные методы аутентификации, для которых не требуются сертификаты или для NULL-аутентификации (анонимная, то есть без аутентификации). Но они не поддерживаются.

Мне нужно шифрование tls, но не аутентификация.

В большинстве случаев такое требование изначально ошибочно. TLS без аутентификации будет означать, что активный и необнаружимый человек в средней атаке, как правило, легко возможен, что по существу сделает все шифрование, предоставляемое TLS, бессмысленным. TLS без аутентификации имеет смысл только в том случае, если клиент может безопасно (т.е. защищен от атак MITM) аутентифицировать сервер после установления соединения TLS и перед передачей любой полезной нагрузки приложения.

0 голосов
/ 22 апреля 2019

установите InsecureSkipVerify в true на tls.Config

&tls.Config{InsecureSkipVerify: true}

и добавьте эту конфигурацию в Transport

&http.Transport{TLSClientConfig: tlsConfig}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...