Как начинающий tls, я действительно не уверен, что мне следует делать здесь.
У меня есть клиентское приложение в go, использующее ListenAndServeTLS, которое отправляет запрос серверному приложению в go, что также использует ListenAndServeTLS. Я могу отправить запрос от клиента на сервер и проверить локально сгенерированный сертификат.
Когда я обновляю свой клиент для общения с прокси-агентом (c#), у меня в Azure открывается sslstream к службе ретрансляции azure, которая подключена к моему серверу на моей локальной машине. Я получаю следующую ошибку. Get https://<ip_address>:8080/hello: x509: cannot validate certificate for <ip_address> because it doesn't contain any IP SANs
Я использую IP-адрес Dynami c и не имеет хоста или DNS. Как мне проверить мой сертификат на сервере, если IP-адрес меняется с каждым моим запросом.
// Server Code
func helloHandler(w http.ResponseWriter, r *http.Request) {
// Write "Hello, world!" to the response body
io.WriteString(w, "Hello, world!\n")
}
func main() {
// Create a CA certificate pool and add cert.pem to it
caCert, err := ioutil.ReadFile("../certs/cert.pem")
if err != nil {
log.Fatal(err)
}
caCertPool := x509.NewCertPool()
caCertPool.AppendCertsFromPEM(caCert)
// Create the TLS Config with the CA pool and enable Client certificate validation
tlsConfig := &tls.Config{
ClientCAs: caCertPool,
ClientAuth: tls.RequireAndVerifyClientCert,
}
tlsConfig.BuildNameToCertificate()
server := &http.Server{
Addr: ":8080",
TLSConfig: tlsConfig,
}
// Set up a /hello resource handler
http.HandleFunc("/hello", helloHandler)
// Listen to port 8080 and wait
log.Fatal(server.ListenAndServeTLS("../certs/cert.pem", "../certs/key.pem"))
}
// Client Code
func main() {
cert, err := tls.LoadX509KeyPair("../certs/cert.pem", "../certs/key.pem")
if err != nil {
log.Fatal(err)
}
// Create a CA certificate pool and add cert.pem to it
caCert, err := ioutil.ReadFile("../certs/cert.pem")
if err != nil {
log.Fatal(err)
}
caCertPool := x509.NewCertPool()
caCertPool.AppendCertsFromPEM(caCert)
client := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
// InsecureSkipVerify: true,
RootCAs: caCertPool,
Certificates: []tls.Certificate{cert},
},
},
}
// Request /hello over port 8080 via the GET method
// r, err := http.Get("http://localhost:8080/hello")
// Request /hello over HTTPS port 8443 via the GET method
r, err := client.Get("https://<ip_address>:8080/hello")
if err != nil {
log.Fatal(err)
}
// Read the response body
defer r.Body.Close()
body, err := ioutil.ReadAll(r.Body)
if err != nil {
log.Fatal(err)
}
// Print the response body to stdout
fmt.Printf("%s\n", body)
}