Как ListenAndServeTLS с несколькими доменами? Я вижу, что функция принимает файл сертификата и ключа, но я считаю, что файл ключа может содержать только один закрытый ключ. У меня есть несколько секретных ключей для разных цепочек сертификатов.http.ListenAndServeTLS с несколькими сертификатами
ответ
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("", "")
Я сам не сам, но если вы хотите использовать несколько сертификатов на одном и том же прослушивателе TLS, у вас должен быть какой-то способ решить, какой сертификат следует использовать после подключения клиента, поскольку может быть отправлено только одна цепочка сертификатов + внутри рукопожатия TLS.
Главный прецедент для использования - Server Name Indication (SNI). С SNI у вас есть несколько сертификатов, и вы хотите выбрать соответствующий, основанный на имени, запрошенному клиентом в рамках рукопожатия TLS.
Поиск go sni server Результаты this post from 2013. Это сообщение показывает, что использование нескольких сертификатов с помощью ListenAndServeTLS невозможно (или было в 2013 году), но также показывает, как добиться необходимой функциональности.