Firefox不会与tls.VerifyClientCertIfGiven一致提示输入证书

时间:2018-09-16 21:07:33

标签: angular ssl firefox go oidc

我正在努力在golang中滚动OIDC服务器,并尝试使用angular-oauth2-oidc库here为angular 6客户端声明令牌。

我的服务器配置相当简单:

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(在提供证书时效果很好)进行授权,但是,尝试访问时浏览器的行为却不一致通过我的角度应用程序的隐式流程。我的“应用程序”是一个非常简单的示例应用程序,我正尝试将其放在一起进行演示-它具有一个“登录”按钮,该按钮使用JavaScript的{{1}将浏览器重定向到OIDC /authorize端点}功能。

据我所知,打开新的浏览器可能会发生以下两种情况之一:

  1. 导航到角度应用程序。点击登录按钮。新页面打开,我的授权端点返回错误的请求,因为该请求没有证书。刷新页面,它继续表现出相同的行为。
  2. 直接导航到授权端点,在以前的情况下,查询参数将从失败的重定向中捕获。 Firefox提示输入证书,然后重定向回有角度的应用程序。一切都很好,随后按下“登录”按钮成功完成了授权流程。

我的测试和到目前为止看到的症状使我认为这是一个浏览器问题,可能与缓存有关,但是如果我在服务器中正在做(或不做)某事可能会解决此问题,那么这也将非常有帮助。

0 个答案:

没有答案