TLS: сбой рукопожатия с помощью клиента GoLang tls - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь подключиться к серверу по протоколу SSL / TLS, используя golang http / tsl client, что приводит к ошибке «Handshake Faliure (40)», но по какой-то причине эта же конечная точка работает с командой CURL. После некоторой отладки я собрал следующие данные.

Openssl command outputWireshark packets

client helloclient hello 2server hello Change Cipher Spec Handshake Failure

func PrepCerts(certMap map[string]string) (*http.Transport, bool) {
         ok := false
         tlsConfig := &tls.Config{}

         if len(certMap["ca"]) > 0 {
             caCert, err := ioutil.ReadFile(certMap["ca"])
             fmt.Println("caCert : ", caCert)

             if err != nil {
             log.Fatal(err)
          } else {
             caCertPool := x509.NewCertPool()
             caCertPool.AppendCertsFromPEM(caCert)
             (*tlsConfig).RootCAs = caCertPool
             ok = true
          }
     }

     if len(certMap["cert"]) > 0 && len(certMap["key"]) > 0 {
         cert, err := tls.LoadX509KeyPair(certMap["cert"], certMap["key"])
         fmt.Println("cert : ", cert)

         if err != nil {
            log.Fatal(err)
         } else {
            (*tlsConfig).Certificates = []tls.Certificate{cert}
            ok = true
         }
     }

     tlsConfig.BuildNameToCertificate()
     return &http.Transport{TLSClientConfig: tlsConfig}, ok
  }

Код, который использует вышеуказанную функцию

  client := &http.Client{
      Timeout: timeout,
  }

  //certMap = map[string]string{
  // ca : "filelocation",
  // cert : "filelocation",
  // key " "filelocation",
  //}

  if transport, ok := PrepCerts(certMap); ok {
      (*client).Transport = transport
  }
  resp, err := client.Do(req)

1 Ответ

2 голосов
/ 18 октября 2019

Из перехваченных пакетов видно, что сервер запрашивает сертификат у клиента (Certificate Request). Из подробных изображений, включенных в вопрос, также видно, что клиент не отправляет сертификаты (запись Certificate с Certificate Length 0).

Что также можно увидеть, так это то, что сервер жалуется на предупреждение после того, как клиент отправил (возможно пустой) сертификат, поэтому ему, вероятно, не понравится то, что отправил клиент. Так что это, безусловно, не проблема согласования шифра (сервер уже согласовал один) и не проблема, что клиенту не нравится сертификат сервера (предупреждение отправляется сервером, а не клиентом).

На основев своем коде вы пытаетесь что-то сделать с клиентскими сертификатами, но на основе pcap похоже, что вам не удалось его использовать. Так что где-то есть проблема.

...