我使用url即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
最佳答案
在您的问题中,没有提及相关的Realm
定义,这可能是导致错误的原因(空证书链)。如果没有与请求关联的主体(如果以前没有成功执行过身份验证,则不太可能),SSLAuthenticator
将调用身份验证领域。但是,在您的情况下,该Realm
可能不存在,或者确实存在,但是以某种方式被错误配置,结果SSLAuthenticator无法解释它。
您可以通过禁用自定义MySSLAuthenticator
使其生效,并使其首先与内置SSLAuthenticator
一起使用。一旦工作正常,请尝试扩展SSLAuthenticator。假设这就是您要执行的操作。
还建议将日志记录级别设置为调试,因为您可能会从扩展类中找到有用的信息:
SSLAuthenticator及其父类AuthenticatorBase
关于您的类甚至没有被tomcat识别,最可能的答案是您已在应用程序上下文中定义了它。 Tomcat阀门可以与Engine
,Host
和Context
关联,并以该顺序调用。因此,为什么tomcat永远不会到达您的Valve
的最可能答案是内置的SSLAuthenticator
在Engine
级别捕获(并依赖)请求。因此,永远不会达到后续的Host
和Context
级别的处理。