Hi Bradley, Thanks for the response. I could get things going with go-spiffe library [ https://github.com/spiffe/go-spiffe]. This library is essentially providing a custom verification method (tls.Config.VerifyPeerCertificate) which takes care of matching SVID. This one suited my need.
Regards, Dheeraj On Tue, Apr 2, 2019 at 11:18 PM <bradleyja...@gmail.com> wrote: > Have you reached out to the SPIFFE and SPIRE folks? > > https://github.com/spiffe/spiffe > https://github.com/spiffe/spire > > SPIRE, a reference implementation, is written in go. They may be familiar > with the issue. > > On Monday, April 1, 2019 at 11:51:20 AM UTC-5, Dheeraj Gedam wrote: >> >> Hi, >> >> I am writing a gRPC client for a third party gRPC Server. Certificates >> issued to both Server and Client are SPIFFE based. These certificates don't >> have Common Name, and has SPIFFE id in URI SAN field. >> However, there is an issue while validating the server certificate which >> leads to Handshake failure. >> >> *go version go1.12.1 linux/amd64* >> >> >> CA had issued certificates for both client and server. My client code >> performs below steps: >> >> 1. Populate tls.Config structure >> tlsConf.Certificates = []tls.Certificate{clientcertificate} >> tlsConf.RootCAs = caCertificatePool >> tlsConf.InsecureSkipVerify = false >> >> 2. creds = credentials.NewTLS(&tlsConf) >> >> 3. conn, err := (&net.Dialer{}).DialContext(ctx, "tcp", "servername") >> conn, _, err = creds.ClientHandshake(ctx, "servername", conn) >> >> ClientHandshake returns the err "*x509: certificate is not valid for any >> names, but wanted to match <servername>*" >> >> This error comes from *https://golang.org/src/crypto/x509/verify.go >> <https://golang.org/src/crypto/x509/verify.go>* file func (h >> HostnameError) Error() string]. >> After little debugging, it looks like below sequence of events are >> happening. >> i) hostname is populated from addr (i.e. servername in this case) in >> DialWithDialer [https://golang.org/pkg/crypto/tls/#DialWithDialer]. This >> same hostname is populated as config.ServerName. >> ii) config.ServerName is later used to populate DNSName in VerifyOptions. >> iii) Since DNSName is non-empty, VerifyHostname() is called which returns >> error! >> >> In short, when it is SPIFFE ceritificate, the hostname match should be >> avoided and only URI SAN should be matched. >> There is an option of InsecureSkipVerify which altogether skips hostname >> and certificate verification. >> I would like to know if there is an option of just skipping hostname >> match, and continue with rest of the certificate verification (required for >> mTLS). >> >> Thanks, >> Dheeraj >> >> -- > You received this message because you are subscribed to a topic in the > Google Groups "golang-nuts" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/golang-nuts/SX-MajM2ZUM/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > golang-nuts+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- 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. For more options, visit https://groups.google.com/d/optout.