https://bz.apache.org/bugzilla/show_bug.cgi?id=62461

            Bug ID: 62461
           Summary: Configuration of JSSE HTTPS Virtual Hosts throws
                    exception
           Product: Tomcat 9
           Version: 9.0.8
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Util
          Assignee: dev@tomcat.apache.org
          Reporter: rad...@gmail.com
  Target Milestone: -----

Old configuration that works on Tomcat 9.0.8

<Service name="Catalina">

  <Connector port="443" address="178.79.132.165"
    protocol="HTTP/1.1"
    scheme="https"
    secure="true"
    SSLEnabled="true"
    sslProtocol="TLS"
    keystoreFile="file.jks"
    keystorePass="pass"
    keyAlias="alias"
    keyPass="pass"
  />

  <Engine name="Catalina" defaultHost="xxx">
    <Host name="xxx" appBase="xxx" autoDeploy="true" unpackWARs="true"
deployXML="false">
      ....
    </Host>
  </Engine>
</Service>


New one (may be I am missing something, but for me seems correct)

<Service name="Catalina">

  <Connector port="443" address="192.168.1.2"
    scheme="https"
    secure="true"
    SSLEnabled="true"
    protocol="org.apache.coyote.http11.Http11NioProtocol"
    sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
    defaultSSLHostConfigName="xxx">

    <SSLHostConfig hostName="xxx">
      <Certificate
        certificateKeystoreFile="file_xxx.jks"
        certificateKeystorePassword="pass"
        certificateKeyAlias="alias"
        certificateKeyPassword="pass" />
    </SSLHostConfig>

    <SSLHostConfig hostName="yyy">
      <Certificate
        certificateKeystoreFile="file_yyy.jks"
        certificateKeystorePassword="pass"
        certificateKeyAlias="alias"
        certificateKeyPassword="pass" />
    </SSLHostConfig>

  </Connector>

  <Engine name="Catalina" defaultHost="xxx">
    <Host name="xxx" appBase="xxx" autoDeploy="true" unpackWARs="true"
deployXML="false">
       ...
    </Host>
    <Host name="yyy" appBase="yyy" autoDeploy="true" unpackWARs="true"
deployXML="false">
       ...
    </Host>
  </Engine>

</Service>


Exception is:

Caused by: java.lang.IllegalArgumentException: SSLHostConfig attribute
certificateFile must be defined when using an SSL connector
        at
org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:114)
        at
org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:85)
        at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:216)
        at
org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1043)
        at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:540)
        at
org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:74)
        at
org.apache.catalina.connector.Connector.initInternal(Connector.java:932)
        ... 13 more
Caused by: java.io.IOException: SSLHostConfig attribute certificateFile must be
defined when using an SSL connector
        at
org.apache.tomcat.util.net.jsse.JSSEUtil.getKeyManagers(JSSEUtil.java:203)
        at
org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:112)


After looking into source code of Tomcat 9.0.8 (not latest from repo) and
putting some printouts I saw that SSLHostConfig has zero
SSLHostConfigCertificate although seems they are loaded properly?!?!

At this place org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext
line 101 SSLHostConfigCertificate is empty - e.g. certificate is a new one
created with default values.

After hardcoding those in the method it worked. :)


@Override
protected void createSSLContext(SSLHostConfig sslHostConfig) throws
IllegalArgumentException {
  boolean firstCertificate = true;
  for (SSLHostConfigCertificate certificate :
sslHostConfig.getCertificates(true)) {
    if ("xxx".equals(sslHostConfig.getHostName())) {
      sslHostConfig.setCertificateKeystoreFile("file_xxx.jks");
      sslHostConfig.setCertificateKeystorePassword("pass");
      sslHostConfig.setCertificateKeyAlias("alias");
      sslHostConfig.setCertificateKeyPassword("pass");
    }
    if ("yyy".equals(sslHostConfig.getHostName())) {
      sslHostConfig.setCertificateKeystoreFile("file_yyy.jks");
      sslHostConfig.setCertificateKeystorePassword("pass");
      sslHostConfig.setCertificateKeyAlias("alias");
      sslHostConfig.setCertificateKeyPassword("pass");
    }
    SSLUtil sslUtil = sslImplementation.getSSLUtil(certificate);
    ...
    ...


It is really strange, because I am looking into it and cannot find the error.


Also protocol should be "org.apache.coyote.http11.Http11NioProtocol" with NIO2
it has some other additional errors - recognizing only one of the contexts - it
serves host yyy, but cannot recognize xxx. And that happens not on startup time
but when you try to access host.

15-Jun-2018 16:28:15.756 SEVERE [https-jsse-nio2-192.168.1.2-443-exec-2]
org.apache.tomcat.util.net.Nio2Endpoint$SocketProcessor.doRun Error running
socket processor
 java.lang.IllegalStateException: No SSLContext could be found for the host
name [xxx]
        at
org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLEngine(AbstractJsseEndpoint.java:173)
        at
org.apache.tomcat.util.net.SecureNio2Channel.processSNI(SecureNio2Channel.java:403)
        at
org.apache.tomcat.util.net.SecureNio2Channel.handshakeInternal(SecureNio2Channel.java:214)
        at
org.apache.tomcat.util.net.SecureNio2Channel.handshake(SecureNio2Channel.java:205)
        at
org.apache.tomcat.util.net.Nio2Endpoint$SocketProcessor.doRun(Nio2Endpoint.java:1724)
        at
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at
org.apache.tomcat.util.net.AbstractEndpoint.processSocket(AbstractEndpoint.java:1007)
        at
org.apache.tomcat.util.net.SecureNio2Channel$HandshakeReadCompletionHandler.completed(SecureNio2Channel.java:99)
        at
org.apache.tomcat.util.net.SecureNio2Channel$HandshakeReadCompletionHandler.completed(SecureNio2Channel.java:92)
        at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:127)
        at java.base/sun.nio.ch.Invoker$2.run(Invoker.java:219)
        at
java.base/sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112)
        at
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
        at
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.base/java.lang.Thread.run(Thread.java:844)

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to