Как настроить проверку подлинности SSL

#ssl #go #ssl-certificate

# #ssl #Вперед #ssl-сертификат

Вопрос:

У меня есть certificate.pem, который я использую для выполнения аутентификации клиента на удаленном сервере. Когда я получаю доступ к серверу, обычно появляется Chrome, спрашивает, хочу ли я использовать этот сертификат, я говорю «да», после чего я аутентифицируюсь. Я пытаюсь выяснить, почему он не отправляет сертификат с помощью дозвона, когда я вызываю его программно:

 type DialerHelper func() (io.ReadWriter, error)
func DialIt(addr string, port uint16, config *tls.Config) (Dialer, error) {
    address := fmt.Sprintf("%s:%d", addr, port)
    return DialerHelper(func() (io.ReadWriter, error) {
        return tls.Dial("tcp", address, config)
    }), nil
}
caPool := x509.NewCertPool()
cert, err := ioutil.ReadFile("certificate.pem")
if err != nil {
    panic(err)
}
ok := caPool.AppendCertsFromPEM(cert)
if !ok {
    panic(ok)
}

tlsconfig := amp;tls.Config{
    InsecureSkipVerify: true,
    RootCAs: caPool, }
tlsconfig.BuildNameToCertificate()
DialIt("some.address.com", 443, tlsconfig)
 

Я продолжаю получать сообщение об ошибке с сервера, в котором говорится, что сертификат клиента не предоставлен. Правильно ли я отправляю SSL-сертификат на удаленный сервер? Я не эксперт в SSL.

Редактировать: это функциональность, которую я пытаюсь воспроизвести: curl -k --cert /home/me/.ssh/certificate.pem

Комментарии:

1. Вы заменяете свои RootCAs своим собственным сертификатом, что определенно не то, что вы хотите сделать, и вам не нужно устанавливать InsecureSkipVerify. Вы пробовали просто ввести его в Certificates поле?

2. Ах, это хороший момент. Спасибо! Я обновил вопрос, чтобы уточнить.

3. Это все еще не то, для чего нужен центр сертификации. Попробуйте поместить сертификаты в поле Сертификаты, которые клиент отправит на сервер.

Ответ №1:

Если сервер использует сертификат, сгенерированный вашим собственным центром сертификации, то следующий код сделает свое дело.

Я никогда не пробовал аутентификацию по сертификату клиента в среде, где сертификат сервера получен из общедоступного центра сертификации, поэтому я не уверен, как вы этого добьетесь. Возможно, просто не устанавливая config.RootCAs.

 func loadCertificates(caFileName, certFileName, keyFileName string) (tls.Certificate, *x509.CertPool, error) {

    myCert, err := tls.LoadX509KeyPair(certFileName, keyFileName)
    if err != nil {
        return tls.Certificate{}, nil, err
    }

    ca, err := ioutil.ReadFile(caFileName)
    if err != nil {
        return tls.Certificate{}, nil, err
    }

    certPool := x509.NewCertPool()
    if !certPool.AppendCertsFromPEM(ca) {
        return tls.Certificate{}, nil, errors.New("Failed appending certs")
    }

    return myCert, certPool, nil

}


func GetClientTlsConfiguration(caFileName, certFileName, keyFileName string) (*tls.Config, error) {
    config := amp;tls.Config{}
    myCert, certPool, err := loadCertificates(caFileName, certFileName, keyFileName)
    if err != nil {
        return nil, err
    }
    config.Certificates = make([]tls.Certificate, 1)
    config.Certificates[0] = myCert

    config.RootCAs = certPool
    config.ClientCAs = certPool

    return config, nil

}


tlsConfig, err := config.GetClientTlsConfiguration("ca.crt", "client.crt", "client.key")

if err != nil {
    log.Fatalf("Error loading tls config - %v", err)
}

client := amp;http.Client{Transport: amp;http.Transport{TLSClientConfig: tlsConfig}}

client.Get(.....)