java - 使用客户端 X509 证书 DN 的服务器端访问控制

标签 java ssl jersey grizzly

人民,

我将 JAX-RS 与 Jersey 2.17 和 Grizzly 一起用作我的 HTTP 服务器。我已配置客户端身份验证并正常工作,但是,我正在尝试对客户端的 X.509 证书 DN 实现访问控制。这将为我提供与配置 Apache httpd 和 FakeBasicAuth 时相同的功能。

我曾尝试使用 ContainerRequestFilter,但似乎可以找到一种方法来获取对与 TLS session 关联的客户端 DN 的引用。有人可以告诉我一种使用 ContainerRequestFilter 或任何其他机制来访问证书以实现相同最终目标的方法吗?

编辑:我尝试了“@javax.ws.rs.core.Context HttpServletRequest req;”昨晚发帖前,但 HttpServletRequest 上下文始终为空。我正在使用 GrizzlyHttpServerFactory,如下所示:

GrizzlyHttpServerFactory.createHttpServer(
                getServerURI(), getResourceConfig(), true,
                new SSLEngineConfigurator(sslContext.get())
                    .setNeedClientAuth(true).setClientMode(false))

这被认为不是 servlet 容器,因此不支持 HttpServletRequest 上下文。我很快查看了 GrizzlyWebContainerFactory,但初始化完全不同,我想避免经历那种痛苦。有没有其他方法可以访问“javax.ws.rs.container.ContainerRequestFilter”中的用户证书?

谢谢!

约翰

最佳答案

来自 Java Servlet 规范:

If there is an SSL certificate associated with the request, it must be exposed by the servlet container to the servlet programmer as an array of objects of type java.security.cert.X509Certificate and accessible via a ServletRequest attribute of javax.servlet.request.X509Certificate.

The order of this array is defined as being in ascending order of trust. The first certificate in the chain is the one set by the client, the next is the one used to authenticate the first, and so on.

实际上,这意味着:

X509Certificate[] certs = (X509Certificate[])
    req.getAttribute("javax.servlet.request.X509Certificate")
if (certs != null && certs.length > 0) {
    X509Certificate cert = certs[0];  // the client certificate
    // further processing (extract and compare DN, etc)
}

如果您还没有访问 ServletRequest 的权限,您可以使用 @Context 将其纳入您的服务类的范围内:

@javax.ws.rs.core.Context
HttpServletRequest req;

关于java - 使用客户端 X509 证书 DN 的服务器端访问控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29114202/

相关文章:

Java 输入流。有没有正确有效的方法?

德尔福:idHttp+SSL

wcf - WCF 中的自签名证书问题 - 必须有私钥

java - 通过 JAX-RS 客户端支持 HTTP/1.1 和 HTTP/2

java - Jersey 客户端发送 application/json 类型的字符串

java - 通过 AppEngine 调整 Jersey 的加载时间

java - 如何将文件保存为 .rtf 格式

java - 从 List<Object> 中删除多个范围的元素

Java nio : How to add extension to an absolute path?

forms - Web 表单在安全 https 时表现不同