Authentication KeyClope x509客户端身份验证配置
我需要一些技巧,以便了解如何使用x509证书对KeyClope执行客户端身份验证 我们有一个简单的Spring引导Web应用程序(API REST)进入Kubernetes集群。 此Web应用程序通过API网关(Ambassador)公开,目前通过浏览器重定向到KeyClope登录页面进行保护,用户可以在该页面输入用户名和密码 然而,这不是我们想要的。 我们需要的是客户端身份验证(React Native Mobile App),其中: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端点 大
- 移动应用程序尝试调用我们的服务器API REST端点
- 大使检查有效的访问令牌,如果没有,则以403 http状态响应(无浏览器重定向)
- 然后,移动应用程序重定向到KeyClope以执行身份验证
- KeyClope不显示用户名/密码登录页面,而是移动应用程序通过浏览器传递x509用户证书
- 如何在Wildfly和Keyclope中启用和配置客户端证书身份验证
- 如何将证书字段映射到用户属性
- 客户端证书身份验证工作流与keydrope/Wildfly(keydropeat容器)
- 设置“提取用户标识的正则表达式”:(.*)
- 例如,添加一个名为“usercertificate”的用户属性,并在其中复制DN
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集群中运行?