فهرست منبع

acme/autocert: validate SNI value even more

Follow-up to https://golang.org/cl/42497

Change-Id: I638e7ba5e924a74ce5318e4b50fb18082fd1a43f
Reviewed-on: https://go-review.googlesource.com/42499
Reviewed-by: Alex Vaghin <ddos@google.com>
Brad Fitzpatrick 8 سال پیش
والد
کامیت
5a033cc77e
2فایلهای تغییر یافته به همراه10 افزوده شده و 3 حذف شده
  1. 4 2
      acme/autocert/autocert.go
  2. 6 1
      acme/autocert/autocert_test.go

+ 4 - 2
acme/autocert/autocert.go

@@ -176,9 +176,11 @@ func (m *Manager) GetCertificate(hello *tls.ClientHelloInfo) (*tls.Certificate,
 	if name == "" {
 	if name == "" {
 		return nil, errors.New("acme/autocert: missing server name")
 		return nil, errors.New("acme/autocert: missing server name")
 	}
 	}
-
+	if !strings.Contains(strings.Trim(name, "."), ".") {
+		return nil, errors.New("acme/autocert: server name component count invalid")
+	}
 	if strings.ContainsAny(name, `/\`) {
 	if strings.ContainsAny(name, `/\`) {
-		return nil, errors.New("acme/autocert: bogus SNI value")
+		return nil, errors.New("acme/autocert: server name contains invalid character")
 	}
 	}
 
 
 	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
 	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)

+ 6 - 1
acme/autocert/autocert_test.go

@@ -588,8 +588,13 @@ func TestManagerGetCertificateBogusSNI(t *testing.T) {
 	}{
 	}{
 		{"foo.com", "cache.Get of foo.com"},
 		{"foo.com", "cache.Get of foo.com"},
 		{"foo.com.", "cache.Get of foo.com"},
 		{"foo.com.", "cache.Get of foo.com"},
-		{`a\b`, "acme/autocert: bogus SNI value"},
+		{`a\b.com`, "acme/autocert: server name contains invalid character"},
+		{`a/b.com`, "acme/autocert: server name contains invalid character"},
 		{"", "acme/autocert: missing server name"},
 		{"", "acme/autocert: missing server name"},
+		{"foo", "acme/autocert: server name component count invalid"},
+		{".foo", "acme/autocert: server name component count invalid"},
+		{"foo.", "acme/autocert: server name component count invalid"},
+		{"fo.o", "cache.Get of fo.o"},
 	}
 	}
 	for _, tt := range tests {
 	for _, tt := range tests {
 		_, err := m.GetCertificate(&tls.ClientHelloInfo{ServerName: tt.name})
 		_, err := m.GetCertificate(&tls.ClientHelloInfo{ServerName: tt.name})