【问题标题】:Valve configuration not working in tomcat?阀门配置在tomcat中不起作用?
【发布时间】:2014-04-02 15:50:39
【问题描述】:

我使用 url 访问我的应用程序,即 https://myIPAddress:8443/myWebApp/

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

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

MySSLAuthenticator.class 位于 jar 文件下,该文件位于 &lt;tomcat_home&gt;\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

【问题讨论】:

    标签: java tomcat ssl tomcat-valve


    【解决方案1】:

    在您的问题中没有提到相关的Realm 定义,这可能是导致错误的原因(null 证书链)。如果没有与请求关联的主体(如果之前没有执行成功的身份验证,这不太可能),SSLAuthenticator 将调用身份验证领域。但是,在您的情况下,这个 Realm 可能不存在,或者它存在但在某些方面配置错误,因此 SSLAuthenticator 无法解释它。

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

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

    SSLAuthenticator 及其父类AuthenticatorBase

    关于你的类甚至没有被 tomcat 识别,最可能的答案是你已经在应用程序上下文中定义了它。 Tomcat 阀可以与EngineHostContext 相关联,并按此顺序调用它们。因此,对于为什么 tomcat 永远无法到达您的Valve,最可能的答案是内置的SSLAuthenticator 捕获(并覆盖)Engine 级别的请求。所以后续的HostContext级别处理永远都达不到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-13
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 2011-02-24
      相关资源
      最近更新 更多