Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 相互客户端身份验证在Servlet中获取证书_Java_Ssl_Tomcat6 - Fatal编程技术网

Java 相互客户端身份验证在Servlet中获取证书

Java 相互客户端身份验证在Servlet中获取证书,java,ssl,tomcat6,Java,Ssl,Tomcat6,我已经设置了一个Tomcat7.0应用服务器,通过SSL进行相互(客户机/服务器)身份验证。要设置此配置,我需要为服务器创建一个.jks文件,并在web浏览器中为创建.pks证书。在Tomcat中配置server.xml文件后,我可以进行相互身份验证和SSL工作。现在我试图在servlet中获取证书,但是我似乎无法从servlet中的请求获取证书。我可以设置一个过滤器,成功地从请求中提取证书。有人能给我提供一个配置/代码,让我从servlet获取证书吗?我还接受一个无法在servlet中获取证书

我已经设置了一个Tomcat7.0应用服务器,通过SSL进行相互(客户机/服务器)身份验证。要设置此配置,我需要为服务器创建一个.jks文件,并在web浏览器中为创建.pks证书。在Tomcat中配置server.xml文件后,我可以进行相互身份验证和SSL工作。现在我试图在servlet中获取证书,但是我似乎无法从servlet中的请求获取证书。我可以设置一个过滤器,成功地从请求中提取证书。有人能给我提供一个配置/代码,让我从servlet获取证书吗?我还接受一个无法在servlet中获取证书的原因

Server.xml

<Connector
 clientAuth="true" port="8443" protocol="HTTP/1.1" SSLEnabled="true"
 scheme="https" secure="true"
 keystoreFile="C:/Users/Kevin Bowersox/Desktop/Development/My Certs/server.jks"
 keystoreType="JKS" keystorePass="notmypassword"
 truststoreFile="C:/Users/Kevin Bowersox/Desktop/Development/My Certs/server.jks"
 truststoreType="JKS" truststorePass="notmypassword"
 SSLVerifyClient="require" SSLVerifyDepth="2" sslProtocol="TLS"
/>
MyServlet映射

<servlet>
    <description>
    </description>
    <display-name>MyServlet</display-name>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>MyServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
我的过滤器映射

<filter>
    <description>
    </description>
    <display-name>MyFilter</display-name>
    <filter-name>MyFilter</filter-name>
    <filter-class>MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>

我的过滤器
我的过滤器
我的过滤器
我的过滤器
*.jsp

它正在工作。但是,Servlet被编码为始终抛出RuntimeException,因此它看起来好像不工作。

我们还需要查看web.xml中的安全约束。此外,连接器上的SSLVerify*设置将不起任何作用-这些是httpd配置设置的名称。@Mark Thomas我目前无权访问我的web.xml文件,但我知道我没有在该文件中设置任何安全参数。我需要吗?如果没有定义安全约束,并且连接器没有配置为需要客户端SSL证书,Tomcat不会要求,客户端也不会提供。@MarkThomas连接器配置为需要客户端SSL证书,实际上它可以工作!我去了网站,它提示我要证书,我提供了证书,这部分很有效。我是否需要在web.xml中指定一些内容才能在servlet中获取证书?好的。当我查看连接器配置时,没有看到clientAuth=“true”。你确定它坏了吗?我假设您意识到,使用发布的代码,无论证书是否存在,您都会得到运行时异常。您确定日志中没有“cert found”消息吗?Tomcat 7的每个发布版本都通过了Servlet 3.0 TCK,其中包括客户端证书身份验证测试,以及证书是否可用于Servlet的测试。不需要额外的配置来公开它。Tomcat会自动填充request属性。很容易做到——我这段时间做得更糟。tomcat提交历史记录供所有人查看:)
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
     X509Certificate[] certs = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
        if (null != certs && certs.length > 0) {
            System.out.println("cert found");
        }
        //throw new RuntimeException("No X.509 client certificate found in request");
    chain.doFilter(request, response);
}
<filter>
    <description>
    </description>
    <display-name>MyFilter</display-name>
    <filter-name>MyFilter</filter-name>
    <filter-class>MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>