Использование клиентской аутентификации TLS / SSL для определенных c хостов - PullRequest
0 голосов
/ 02 августа 2020

Как я могу использовать аутентификацию клиента TLS / SSL для определенных c хостов при использовании обратного прокси, например httprouter by julienschmidt ?

Я мог бы установить сертификат клиента в глобальном масштабе с http.DefaultTransport.

transport := &http.Transport{
    TLSClientConfig: &tls.Config{
        Certificates: []tls.Certificate{cert},
    },
}

http.DefaultTransport = transport

Но вы хотите использовать сертификат клиента только для Speci c хостов , например:

  1. cert1 для host1
  2. cert2 для host2
  3. все остальное с no Client Certificate

Update

Я ожидал, что обратный вызов GetConfigForClientHandler или GetCertificateHandler будет называться. На этом этапе я мог отреагировать на info.ServerName. Но вызывается только GetClientCertificate без информации о цели info.ServerName.

func main() {
    transport := &http.Transport{
        TLSClientConfig: &tls.Config{
            GetConfigForClient:   GetConfigForClientHandler,
            GetClientCertificate: GetClientCertificateHandler,
            GetCertificate:       GetCertificateHandler,
        },
    }

    http.DefaultTransport = transport

    // Host which enforce client certificate authentication
    resp, err := http.Get("https://example.com")
    if err != nil {
        fmt.Println("Error", err)
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}

func GetClientCertificateHandler(info *tls.CertificateRequestInfo) (*tls.Certificate, error) {
    fmt.Println("GetClientCertificateHandler")
    panic("GetClientCertificateHandler")
}

func GetConfigForClientHandler(info *tls.ClientHelloInfo) (*tls.Config, error) {
    fmt.Println("GetConfigForClientHandler for:", info.ServerName)
    panic("GetConfigForClientHandler")
}

func GetCertificateHandler(info *tls.ClientHelloInfo) (*tls.Certificate, error) {
    fmt.Println("GetCertificateHandler for:", info.ServerName)
    panic("GetCertificateHandler")
}

1 Ответ

4 голосов
/ 02 августа 2020
  1. Создайте конфигурацию TLS, доступную для всех хостов. Наверное, там много не надо ставить. Но вы хотите установить обработчик Config.GetConfigForClient.
  2. В этом обработчике вы проверяете ClientHelloInfo.ServerName. Это запрошенный хост. Затем вы изменяете конфигурацию TLS, чтобы там требовалась авторизация клиента (Config.ClientAuth).
  3. Оберните свой net .Listener с помощью tls.NewListener
  4. Используйте свой TLS net.Listener в http.Serve (здесь вы можете использовать httprouter)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...