2015-08-24 3 views
2

Как ListenAndServeTLS с несколькими доменами? Я вижу, что функция принимает файл сертификата и ключа, но я считаю, что файл ключа может содержать только один закрытый ключ. У меня есть несколько секретных ключей для разных цепочек сертификатов.http.ListenAndServeTLS с несколькими сертификатами

ответ

7

http.ListenAndServeTLS предназначен для обеспечения минимальной конфигурации. Если вы хотите добавить другие параметры, вы можете создать http.Server с пользовательским номером tls.Config. Затем вы можете вручную сопоставить имена в tls.Config.NameToCertificate или позвонить BuildNameToCertificate(), чтобы программно создать карту.

Вы все равно можете использовать Server.ListenAndServeTLS, так как он будет загружать сертификаты в конфиге, а также сертификат, переданный через методы args.

cfg := &tls.Config{} 

cert, err := tls.LoadX509KeyPair("cert_one.pem", "key_one.pem") 
if err != nil { 
    log.Fatal(err) 
} 

cfg.Certificates = append(cfg.Certificates, cert) 
// keep adding remaining certs to cfg.Certificates 

cfg.BuildNameToCertificate() 

server := http.Server{ 
    Addr:  "127.0.0.1:443", 
    Handler: myHandler, 
    TLSConfig: cfg, 
} 

server.ListenAndServeTLS("", "") 
1

Я сам не сам, но если вы хотите использовать несколько сертификатов на одном и том же прослушивателе TLS, у вас должен быть какой-то способ решить, какой сертификат следует использовать после подключения клиента, поскольку может быть отправлено только одна цепочка сертификатов + внутри рукопожатия TLS.

Главный прецедент для использования - Server Name Indication (SNI). С SNI у вас есть несколько сертификатов, и вы хотите выбрать соответствующий, основанный на имени, запрошенному клиентом в рамках рукопожатия TLS.

Поиск go sni server Результаты this post from 2013. Это сообщение показывает, что использование нескольких сертификатов с помощью ListenAndServeTLS невозможно (или было в 2013 году), но также показывает, как добиться необходимой функциональности.