Hello,

I have tomcat 6.0.30 configured with NIOConnector
(org.apache.coyote.http11.Http11NioProtocol) using latest JRE
(1.6.0_23). The connector has 1 way SSL enabled, except for a URL that
requires 2 way SSL. I do so using following security constraint in
web.xml:

        <security-constraint>
                <web-resource-collection>
                        <web-resource-name>Protected</web-resource-name>
                        <url-pattern>/secure/*</url-pattern>
                </web-resource-collection>
                <auth-constraint>
                        <role-name>secure</role-name>
                </auth-constraint>
                <user-data-constraint>
        
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
                </user-data-constraint>
        </security-constraint>
        <login-config>
                <auth-method>CLIENT-CERT</auth-method>
        </login-config>
        <security-role>
                <role-name>secure</role-name>
        </security-role>

I have 2 self signed SSL keys:
1) c:\keys\client.keystore
2) c:\keys\webserver.keystore

tomcat-users.xml has been updated properly with a user in "secure" role
that has the same username as the CN for c:\keys\client.keystore.

The connector configuration in server.xml is as follows:

    <Connector SSLEnabled="true" clientAuth="false" 
                keystoreType="JKS"
keystoreFile="C:\keys\webserver.keystore" keystorePass="changeit" 
                truststoreType="JKS"
truststoreFile="C:\keys\client.keystore" truststorePass="changeit"
                port="443" 
                protocol="org.apache.coyote.http11.Http11NioProtocol"
                scheme="https" secure="true" sslProtocol="TLS"
                URIEncoding="UTF-8"
                compression="on"
 
compressableMimeType="text/html,text/xml,text/plain,application/xml,text
/javascript,text/css"
                acceptCount="5000"
                maxThreads="200"
                />

When I try to access a secure URL (e.g. /secure/foo.do) from a java
program using apache httpclient library (where the client is configured
to use "C:\keys\webserver.keystore" as the truststore and
"C:\keys\client.keystore" as the keystore), I get the following response
from the tomcat server:

"This request requires HTTP authentication (No client certificate chain
in this request)."

Tomcat's log shows the following stack trace:

2011-02-04 15:04:47 WARNING: #{11} [Http11NioProcessor.action] Exception
getting SSL attributes
java.lang.NullPointerException
        at
org.apache.tomcat.util.net.jsse.JSSESupport.handShake(JSSESupport.java:1
50)
        at
org.apache.tomcat.util.net.jsse.JSSESupport.getPeerCertificateChain(JSSE
Support.java:143)
        at
org.apache.coyote.http11.Http11NioProcessor.action(Http11NioProcessor.ja
va:1213)
        at org.apache.coyote.Request.action(Request.java:350)
        at
org.apache.catalina.authenticator.SSLAuthenticator.authenticate(SSLAuthe
nticator.java:135)
        at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(Authenticator
Base.java:528)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java
:127)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java
:102)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.
java:109)
        at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:2
98)
        at
org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.j
ava:889)
        at
org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.proce
ss(Http11NioProtocol.java:732)
        at
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.j
ava:2262)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown
Source)
        at java.lang.Thread.run(Unknown Source)


Oddly, the same program works if I use
org.apache.coyote.http11.Http11Protocol instead of
org.apache.coyote.http11.Http11NioProtocol. Any idea what might be
causing the NIO implementation to not work in this case? Does this have
anything to do with SSL renegotiation that was recently addressed in
latest tomcat?

Secondly, for Http11Protocol, I use to be able to specify a list of
"ciphers" in the Connector configuration to prevent weak ciphers being
used. E.g.

ciphers="TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_256_CBC_S
HA,TLS_RSA_WITH_AES_256_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,TLS_DH
E_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA,TLS_DHE_DS
S_WITH_3DES_EDE_CBC_SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_3DES_
EDE_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CB
C_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,SSL_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH
_RC4_128_SHA,SSL_RSA_WITH_RC4_128_MD5,TLS_RSA_WITH_RC4_128_MD5"

However, the same does not seem to work with the Http11NioProtocol, and
I get the following in tomcat's logs:

2011-02-04 15:09:12 SEVERE:  #{11} [NioEndpoint.setSocketOptions] 
java.lang.IllegalArgumentException: Cannot support
TLS_DHE_RSA_WITH_AES_256_CBC_SHA with currently installed providers
        at com.sun.net.ssl.internal.ssl.CipherSuiteList.<init>(Unknown
Source)
        at
com.sun.net.ssl.internal.ssl.SSLEngineImpl.setEnabledCipherSuites(Unknow
n Source)
        at
org.apache.tomcat.util.net.NioEndpoint.createSSLEngine(NioEndpoint.java:
1141)
        at
org.apache.tomcat.util.net.NioEndpoint.setSocketOptions(NioEndpoint.java
:1096)
        at
org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:131
5)
        at java.lang.Thread.run(Unknown Source)

Is "ciphers" attribute supported with Http11NioProtocol implementation?

thanks in advance!
Parag


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to