Web services 如何访问证书信息

Web services 如何访问证书信息,web-services,jakarta-ee,ssl,jax-ws,Web Services,Jakarta Ee,Ssl,Jax Ws,我有一个JavaEE服务器/客户机体系结构,通过SSL连接彼此通信。建立连接后,客户端可以查询服务器web服务。我的问题是如何访问服务器web服务中的客户端证书信息?我的服务器控制器如下: import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.

我有一个JavaEE服务器/客户机体系结构,通过SSL连接彼此通信。建立连接后,客户端可以查询服务器web服务。我的问题是如何访问服务器web服务中的客户端证书信息?我的服务器控制器如下:

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Path("mycontroller")
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public class Controller {

    @GET
    @Path("dosomething")
    public Response doSomething() {

        // How can I have access to certificate information here ?

        return Response.ok().build();

    }

}

如果您正在查找HTTP头和HTTP Servlet Request对象中的标准证书信息,例如来自Apache HTTP反向代理的客户端证书信息。你可以注射这些

例如:

@上下文私有HttpServletRequest servletRequest; @上下文私有HttpServletContext

(见或在中)

如果希望访问密钥库文件并加载证书的私钥,则应通过JNDI文件资源或JCA适配器访问文件


但我建议您注意,应用程序服务器应该处理所有SSL/TLS连接安全性—您的WAR组件只是声明它希望web.xml文件中的连接是“机密的”。将消息级安全性和身份验证与应用程序或传输协议安全性相结合可以打破关注点的分离。i、 e.在总线或集线器场景中,将身份验证附加到消息。

我找到了一种方法来做我想做的事情

首先,必须将服务器配置为需要客户端证书身份验证。在我的例子中,我使用JBoss服务器,并且必须将其添加到standalone.xml文件中:

...
<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false">
    ...
    <connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" enable-lookups="false" secure="true">
        <ssl name="localhost" key-alias="localhost" password="server" certificate-file="${jboss.server.config.dir}/server.jks" certificate-key-file="${jboss.server.config.dir}/server.jks" ca-certificate-file="${jboss.server.config.dir}/truststore.jks" protocol="TLSv1" verify-client="true" />
    </connector>
    ...
</subsystem>
...

谢谢你的回复。我的客户端正在连接一个证书,其中包含“Bob”表示“Common Name”。我希望能够在我的控制器中说“你好,鲍勃”。我开始严重怀疑这是否可能。
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.servlet.http.HttpServletRequest;
import java.security.cert.X509Certificate;

@Path("mycontroller")
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public class Controller {

    @Context 
    private HttpServletRequest request;

    @GET
    @Path("dosomething")
    public Response doSomething() {

        X509Certificate[] certChain = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
        X509Certificate certificate = certChain[0];

        return Response.ok().build();

    }

}