Tomcat服务器和HTTP客户端接受过期的自签名证书

时间:2017-05-09 21:29:11

标签: java tomcat ssl certificate ssl-certificate

我正在编写一个具有相互身份验证的rest客户端和服务器。客户端上的密钥库充当密钥库和信任库。服务器端的密钥库充当密钥库和信任库。

服务器是由Spring启动的嵌入式Tomcat服务器。

我正在编写两个测试,其中一个测试验证服务器拒绝具有过期证书的客户端连接,另一个验证客户端没有连接到过期证书的服务器。

我有一个使用java keytool创建的信任库和密钥库。它们每个都包含相应的自签名证书和相关密钥。

测试1

客户端具有与过期证书关联的过期密钥(在客户端密钥库中)(在服务器的密钥库中)。

当我的客户端向服务器发出请求时,服务器成功处理请求而不是拒绝请求。服务器应拒绝该请求。

我正在使用这些属性来配置tomcat的信任库。我错过了什么吗?

server.ssl.trust-store={truststore location}
server.ssl.trust-store-password={password}
server.ssl.trust-alias={trust alias}
server.ssl.client_auth=NEED

测试2

服务器具有与过期证书关联的过期密钥(在服务器密钥库中)(在客户端的密钥库中)。

当我的客户端(Apache HTTP Client)向服务器发出请求时,请求成功。这是错误的行为。我的修复是为SSL上下文创建一个新的TrustStrategy来解决问题。

    return new TrustStrategy() {

        /**
         * Checks to see if certificate has not expired yet.
         * 
         * Always returns false so the trust manager is consulted.
         */
        @Override
        public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException
        {
            for (X509Certificate certificate : chain)
            {
                certificate.checkValidity();
            }

            return false;
        }

    };

默认行为不应该是拒绝过期的证书吗?什么是嵌入式Tomcat上的证书信任管理器,如何修改它以拒绝过期的证书?

谢谢!

使用spring-boot 1.4.0,嵌入式tomcat 7.0.70,Apache HTTP Client 4.3.6

1 个答案:

答案 0 :(得分:0)

我发现了问题。

观察到的行为背后的原因是X509TrustManager使用PKIXValidator来验证客户端和服务器证书。如果验证者想要验证的证书已经存在于信任库中,那么它会自动信任它而不进行任何验证。

我能够通过自己包装TrustManagers来手动检查到期时启用到期验证。