Authentication KeyClope x509客户端身份验证配置

Authentication KeyClope x509客户端身份验证配置,authentication,keycloak,x509certificate,ambassador,Authentication,Keycloak,X509certificate,Ambassador,我需要一些技巧,以便了解如何使用x509证书对KeyClope执行客户端身份验证 我们有一个简单的Spring引导Web应用程序(API REST)进入Kubernetes集群。 此Web应用程序通过API网关(Ambassador)公开,目前通过浏览器重定向到KeyClope登录页面进行保护,用户可以在该页面输入用户名和密码 然而,这不是我们想要的。 我们需要的是客户端身份验证(React Native Mobile App),其中: 移动应用程序尝试调用我们的服务器API REST端点 大

我需要一些技巧,以便了解如何使用x509证书对KeyClope执行客户端身份验证

我们有一个简单的Spring引导Web应用程序(API REST)进入Kubernetes集群。 此Web应用程序通过API网关(Ambassador)公开,目前通过浏览器重定向到KeyClope登录页面进行保护,用户可以在该页面输入用户名和密码

然而,这不是我们想要的。 我们需要的是客户端身份验证(React Native Mobile App),其中:

  • 移动应用程序尝试调用我们的服务器API REST端点
  • 大使检查有效的访问令牌,如果没有,则以403 http状态响应(无浏览器重定向)
  • 然后,移动应用程序重定向到KeyClope以执行身份验证
  • KeyClope不显示用户名/密码登录页面,而是移动应用程序通过浏览器传递x509用户证书
不幸的是,我无法理解如何使用用户数据(信息、角色ecc.)生成有效且受信任的x509证书,以便从IdP获取访问令牌

而且。。。IdP如何检查和验证此客户端证书?是否需要在keydove上安装服务器证书副本

将客户端证书传递给keydepeat的正确形式是什么(例如CURL)? 是否有必要同时传递私钥及其原因?

请查看《KeyClope服务器管理指南》第6节中的部分,该部分描述:

  • 如何在Wildfly和Keyclope中启用和配置客户端证书身份验证
  • 如何将证书字段映射到用户属性
  • 客户端证书身份验证工作流与keydrope/Wildfly(keydropeat容器)

不幸的是,我无法理解如何使用用户数据(信息、角色ecc.)生成有效且受信任的x509证书,以便从IdP获取访问令牌。

请参阅本文以生成证书

IdP如何检查和验证此客户端证书?

KeyClope文档是一个很好的起点,请检查“将X.509客户端证书身份验证添加到浏览器流”和“将X.509客户端证书身份验证添加到直接授权流” 如果用户密钥需要整个DN,可以在配置X509上使用此正则表达式:

  • 设置“提取用户标识的正则表达式”:(.*)
  • 例如,添加一个名为“usercertificate”的用户属性,并在其中复制DN
是否需要在keydove上安装服务器证书副本?

不是所有证书,您只能在名为“usercertificate”的用户属性中添加DN

将客户端证书传递给keydape的正确形式(例如CURL)是什么?

网址:https://localhost:9445/auth/realms//protocol/openid-连接/令牌

打开KeyClope TLS会话的代码示例:

public String openSession(
        File p12File, 
        String passphrase,
        String clientId) 
throws IOException, GeneralSecurityException {

    try (FileInputStream fis = new FileInputStream(p12File);) {
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        keyStore.load(new FileInputStream(p12File), passphrase.toCharArray());
        
        HttpClient httpClient = HttpClients
                .custom()
                .setSSLContext(new SSLContextBuilder()
                        .loadTrustMaterial(null, TrustAllStrategy.INSTANCE)
                        .loadKeyMaterial(keyStore, passphrase.toCharArray())
                        .build())
                .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
                .build();
        
        HttpPost httpPost = new HttpPost(tokenEndpoint);
        httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");

        String data = "grant_type=password" + "&client_id="+ clientId;
        StringEntity input = new StringEntity(data);
        httpPost.setEntity(input);

        HttpResponse response = httpClient.execute(httpPost);
        return IOUtils.toString(response.getEntity().getContent(), "UTF-8");
    }
}
是否需要同时传递私钥?为什么?


没有

我已经阅读了文档,但我还不完全清楚如何使其工作。是否应该:1)生成私钥/公钥对2)从密钥对提取公钥3)将密钥对存储在信任库中4)将公钥存储在客户端应用程序上5)为了进行身份验证,从客户端发送公钥证书,然后Keycloack检查密钥的公共/私钥匹配... 这是正确的吗?事实上,首先你必须自己设置密钥库/信任库:1)对于服务器(keydove)和你的每个客户端,你需要从该密钥对生成一个私有/公共密钥对(keystore)和一个证书签名请求(CSR),这一切你都可以用Java
keytool
或其他PKI工具来完成。。。。。。2) 向您的CA(证书颁发机构)提交CSR,并将服务器(相应客户端)的EKU(扩展密钥使用)扩展设置为
TLS服务器(相应客户端)身份验证
,以获取正确的已签名TLS服务器(相应客户端)证书(由CA签名)。如果您没有CA,您可以使用
keytool
创建一个CA,然后再次使用
keytool
对证书进行签名。3) 将CA签名的证书导入回服务器(相应的客户端)密钥库。。。。。。4) 将CA证书导入服务器/客户端的信任库。在更复杂的设置中,可以为服务器和客户端使用不同的CA,在这种情况下,可以将服务器CA导入客户端信任库,将客户端CA导入服务器的信任库。KeyClope是否与Spring Boot应用程序在同一个K8s集群中运行?