阀门配置在tomcat中不起作用?

时间:2014-04-02 15:50:40

标签: java tomcat ssl tomcat-valve

我使用网址https://myIPAddress:8443/myWebApp/

访问我的应用程序

我创建了myWebApp.xml文件,其中包含以下内容元素并将其放在<tomcat_home>\conf\Catalina\localhost\

<Context>
 <Valve className="org.apache.catalina.authenticator.MySSLAuthenticator"/>
</Context>

MySSLAuthenticator.class位于jar文件下,位于<tomcat_home>\lib

但看起来像MySSLAuthenticator没有进入图片,因为我得到以下错误,我看到SSLAuthenticator的实例 不是MySSLAuthenticator

javax.net.ssl.SSLHandshakeException: null cert chain
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:266)
    at sun.security.ssl.ServerHandshaker.clientCertificate(ServerHandshaker.java:1631)
    at sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:176)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884)
    at sun.security.ssl.AppInputStream.read(AppInputStream.java:102)
    at java.io.InputStream.read(InputStream.java:101)
    at org.apache.tomcat.util.net.jsse.JSSESupport.handShake(JSSESupport.java:181)
    at org.apache.tomcat.util.net.jsse.JSSESupport.getPeerCertificateChain(JSSESupport.java:148)
    at org.apache.coyote.http11.Http11Processor.action(Http11Processor.java:1120)
    at org.apache.coyote.Request.action(Request.java:349)
    at org.apache.catalina.authenticator.SSLAuthenticator.authenticate(SSLAuthenticator.java:135)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:528)

我不确定这里缺少什么? tomcat版本是6.0.35

1 个答案:

答案 0 :(得分:1)

在您的问题中,没有提及相关的Realm定义,可能是导致错误的原因( null cert chain )。如果没有与请求关联的主体(如果之前没有执行成功的身份验证,则不太可能),SSLAuthenticator将调用身份验证领域。但是,在您的情况下,此Realm可能不存在或者确实存在,但在某种程度上配置错误,因此SSLAuthenticator无法解释它。

您可以通过停用自定义MySSLAuthenticator来验证这一点,并使其首先与内置SSLAuthenticator一起使用。一旦你开始工作,然后尝试扩展SSLAuthenticator。假设这就是你想要做的事情。

建议将日志级别设置为debug,因为您可能会发现从扩展类中记录的有用信息:

SSLAuthenticator及其父类AuthenticatorBase

关于您的课程甚至不被tomcat识别,最可能的答案是您已在应用程序上下文中定义它。 Tomcat阀门可以与EngineHostContext相关联,并按顺序调用它们。因此,最有可能回答为什么tomcat永远不会到达Valve的原因是内置的SSLAuthenticatorEngine级别捕获(并覆盖)请求。因此,永远不会达到后续的HostContext级别处理。