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
функция.
Насколько я могу судить, при открытии нового браузера может произойти одно из двух:
- Перейдите к угловому приложению. Нажмите кнопку входа. Открывается новая страница, и моя конечная точка авторизации возвращает неверный запрос, потому что у запроса нет сертификата. Обновите страницу, и она продолжает демонстрировать то же поведение.
- Перейдите непосредственно к конечной точке авторизации, причем в предыдущем случае параметры запроса были связаны с ошибочным перенаправлением. Firefox запрашивает сертификат, а затем перенаправляет обратно в угловое приложение. Все хорошо, и последующие нажатия кнопки "Войти" успешно проходят процесс авторизации.
Мои тесты и симптомы, которые я видел до сих пор, заставляют меня думать, что это проблема браузера, возможно, связанная с кешем, но если на моем сервере есть что-то, что я делаю (или нет), которое может это исправить, то это будет очень полезно тоже.