我在OSGi环境中。我使用 jax-rs 类进行 RESTServiceRegistration。我已经将下面的层配置为在 TLS 握手期间要求客户端认证身份验证。现在我想从我的服务访问它。
这是我尝试访问 X509 主题 CommonName 的伪代码。
接口(用于 REST Web 服务注册):
@GET
@WebMethod
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/tls")
public String soutTLSClientCertInfo(@Context SomeContext context);
这是实现:
@Override
public String soutTLSClientCertInfo(@Context SomeContext context) {
return context.getAttribute("java.etwas....tsl.cn_name");
}
我找到了答案...HttpServletRequest 是自动注入的,如果你有这样的东西
private HttpServletRequest request;
@Context public void setHttpServletRequest( HttpServletRequest request ) {
this.request = request;
}
稍后您可以像以下方式使用它:
@Override
public String getTlsInfo() {
StringBuilder stringBuilder = new StringBuilder( );
X509Certificate[] certs = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
for (X509Certificate cert: certs) {
stringBuilder.append(cert.getSubjectX500Principal().getName());
}
return stringBuilder;
}
你还应该小心javax.servlet版本...