The `crypto/tls` library will not configure the client certificate if the 
signing certificate authority is not present in the list provided by the 
server in `CertificateRequest`. The current implementation causes the 
`remote error: tls: certificate required` error making debugging the 
underlying CA issue difficult.

Additional notes:

1. The library code in handshake.go intentionally does not configure the 
certificate if there is no match 
2. The error is as expected `remote error: tls: unknown certificate 
authority` if you downgrade the client to TLS v1.2
3. The behaviour seems intentional and so I didn't want to raise a bug 
ticket - but I think this needs an improvement (Config option?) to assist 
in debugging - it's confusing without reading the library code to 
understand the issue


```
package main

import (
"crypto/tls"
"fmt"
"log"
"net/http"
)

func main() {
clientCert, err := tls.LoadX509KeyPair("certificate", "key")
if err != nil {
log.Fatalf("Failed to load client certificate: %v", err)
}

tlsConfig := &tls.Config{
Certificates: []tls.Certificate{clientCert},
ServerName:   "localhost",
}
client := &http.Client{
Transport: &http.Transport{
TLSClientConfig: tlsConfig,
},
}
resp, err := client.Get("https://localhost:8443";)
if err != nil {
log.Printf("TLS Error: %v", err)
return
}

fmt.Printf("%v\n", resp.Status)
}
```

Example HAProxy configuration:
```
global
    daemon

defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend mtls_frontend
    # Client certificate CA not present (remote error: tls: certificate 
required)
    bind *:8443 ssl crt /etc/ssl/certs/haproxy-server.pem verify required 
ca-file /etc/ssl/certs/USERTrust_RSA_Certification_Authority.pem 
    # Client certificate CA present (success)
    #bind *:8443 ssl crt /etc/ssl/certs/haproxy-server.pem verify required 
ca-file /etc/ssl/certs/chain.pem
    default_backend web_servers

backend web_servers
    server web1 127.0.0.1:8080 check
```

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/golang-nuts/4c54abb8-0598-4c0d-a39c-767c71d0ebffn%40googlegroups.com.

Reply via email to