#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(.....)