src/crypto/x509/verify.go | 15 +++++++++------ diff --git a/src/crypto/x509/verify.go b/src/crypto/x509/verify.go index 3ed6289ce99a9605a9881f83e251cc7facdeed5d..cd51074541b638c89fbb89281658f2a07de2b528 100644 --- a/src/crypto/x509/verify.go +++ b/src/crypto/x509/verify.go @@ -112,7 +112,7 @@ func (h HostnameError) Error() string { c := h.Certificate maxNamesIncluded := 100 - if !c.hasSANExtension() && matchHostnames(c.Subject.CommonName, h.Host) { + if !c.hasSANExtension() && matchHostnames(c.Subject.CommonName, splitHostname(h.Host)) { return "x509: certificate relies on legacy Common Name field, use SANs instead" } @@ -1163,16 +1163,14 @@ } return toLowerCaseASCII(hostA) == toLowerCaseASCII(hostB) } -func matchHostnames(pattern, host string) bool { +func matchHostnames(pattern string, hostParts []string) bool { pattern = toLowerCaseASCII(pattern) - host = toLowerCaseASCII(strings.TrimSuffix(host, ".")) - if len(pattern) == 0 || len(host) == 0 { + if len(pattern) == 0 || len(hostParts) == 0 { return false } patternParts := strings.Split(pattern, ".") - hostParts := strings.Split(host, ".") if len(patternParts) != len(hostParts) { return false @@ -1250,6 +1248,7 @@ } candidateName := toLowerCaseASCII(h) // Save allocations inside the loop. validCandidateName := validHostnameInput(candidateName) + hostParts := splitHostname(candidateName) for _, match := range c.DNSNames { // Ideally, we'd only match valid hostnames according to RFC 6125 like @@ -1258,7 +1257,7 @@ // array of contexts and can't even assume DNS resolution. Instead, // always allow perfect matches, and only apply wildcard and trailing // dot processing to valid hostnames. if validCandidateName && validHostnamePattern(match) { - if matchHostnames(match, candidateName) { + if matchHostnames(match, hostParts) { return nil } } else { @@ -1269,6 +1268,10 @@ } } return HostnameError{c, h} +} + +func splitHostname(host string) []string { + return strings.Split(toLowerCaseASCII(strings.TrimSuffix(host, ".")), ".") } func checkChainForKeyUsage(chain []*Certificate, keyUsages []ExtKeyUsage) bool {