Context: I want to establish a TLS Connection to a server, which has a certificate with a different (but known!) domain.
So I want to use tls.Dial('tcp', 'real-domain', conf), but verify the domain of the certificate as if it would be the other domain (lets call it wrong-domain), of which I know the server should return it.
So I think the way to do this is override VerifyPeerCertificate in the clients tls.Config.
VerifyPeerCertificate gets rawCerts [][]byte as parameter, but to use x509.Verify I need the certificate as a x509.Certificate type.
The question is: How do I cenvert the rawCerts [][]byte, which are passed as a parameter to VerifyPeerCertificate converted to x509.Certificate?
This is how I want to use it:
conf := &tls.Config{ VerifyPeerCertificate: func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error { verifyOptions := x509.VerifyOptions{ DNSName: "wrong-domain", Roots: serverCertPool, } cert := &x509.Certificate{???} // How do I get the x509.Certificate out of the rawCerts [][]byte parameter? _, err := cert.Verify(verifyOptions) return err }, InsecureSkipVerify: true, // We verify in VerifyPeerCertificate }