Firefox не запрашивает сертификат в соответствии с tls.VerifyClientCertIfGiven

Я работаю над развертыванием сервера OIDC в ​​golang и пытаюсь получить токен для клиента angular 6 с использованием библиотеки angular-oauth2-oidc здесь.

Моя конфигурация сервера достаточно проста:

func main() {
...

// Register the four manditory OpenID Connect endpoints: discovery, public keys, auth, and token.
http.HandleFunc("/.well-known/openid-configuration", handleDiscovery)
http.HandleFunc("/identity/.well-known/openid-configuration", handleDiscovery)
http.HandleFunc("/publickeys", handlePublicKeys)
http.HandleFunc("/authorize", handleAuthorization)
http.HandleFunc("/token", handleToken)

// Load server TLS configuration for (selective) mutual auth
caCert, err := ioutil.ReadFile("ca.pem")
if err != nil {
    log.Fatal(err)
}
caCertPool := x509.NewCertPool()
caCertPool.AppendCertsFromPEM(caCert)
// Setup HTTPS client
tlsConfig := &tls.Config{
    ClientCAs: caCertPool,
    // NoClientCert
    // RequestClientCert
    // RequireAnyClientCert
    // VerifyClientCertIfGiven
    // RequireAndVerifyClientCert
    ClientAuth: tls.VerifyClientCertIfGiven,
}
tlsConfig.BuildNameToCertificate()

s := &http.Server{
    Addr:      ":14001",
    TLSConfig: tlsConfig,
}

// Some oauth2 / oidc configuration bits
server.Config.AllowedAccessTypes = osin.AllowedAccessType{osin.AUTHORIZATION_CODE,
    osin.REFRESH_TOKEN, osin.PASSWORD, osin.CLIENT_CREDENTIALS, osin.ASSERTION}
server.Config.AllowedAuthorizeTypes = osin.AllowedAuthorizeType{osin.CODE, osin.TOKEN}
log.Fatal(s.ListenAndServeTLS("idp.pem", "idp-key.pem"))
}

Я делаю авторизацию, используя предоставленный клиентский сертификат на /authorize путь, с tls.PeerCertificates (который отлично работает, когда сертификат предоставляется), однако, я вижу противоречивое поведение браузера при попытке пройти через неявный поток из моего углового приложения. Мое "приложение" - это очень простой пример приложения, которое я пытаюсь собрать для демонстрации - в нем есть кнопка с надписью "логин", которая перенаправляет браузер на OIDC /authorize конечная точка, используя JavaScript location.href = <endpoint>/authorize функция.

Насколько я могу судить, при открытии нового браузера может произойти одно из двух:

  1. Перейдите к угловому приложению. Нажмите кнопку входа. Открывается новая страница, и моя конечная точка авторизации возвращает неверный запрос, потому что у запроса нет сертификата. Обновите страницу, и она продолжает демонстрировать то же поведение.
  2. Перейдите непосредственно к конечной точке авторизации, причем в предыдущем случае параметры запроса были связаны с ошибочным перенаправлением. Firefox запрашивает сертификат, а затем перенаправляет обратно в угловое приложение. Все хорошо, и последующие нажатия кнопки "Войти" успешно проходят процесс авторизации.

Мои тесты и симптомы, которые я видел до сих пор, заставляют меня думать, что это проблема браузера, возможно, связанная с кешем, но если на моем сервере есть что-то, что я делаю (или нет), которое может это исправить, то это будет очень полезно тоже.

0 ответов

Другие вопросы по тегам