On Wed, Apr 6, 2016 at 12:17 PM, Coty Sutherland <csuth...@redhat.com>
wrote:

> Hi Thad,
>
> Hopefully I can help clear up some confusion here. I'd also suggest
> watching the 8.5 connector video that markt presented here
> <https://www.youtube.com/watch?v=LBSWixIwMmU> for more information on the
> connector changes introduced by 8.5. I found the bits on the SSL change
> particularly informative as it was my first exposure to how tomcat9 handles
> TLS, if you're interested in moving to the way that tomcat 9 handles SSL
> with the upgrade to 8.5. Otherwise, you can use the same Connector tags
> that you had before without change (I think).
>
> In any case, I'll reply to your last inquiries in line below. I'm using
> Tomcat 8.5.0.Beta and OpenJDK 8.
>
> > Are you saying that to make the second <Connector> work I must remove
> either clientAuth or sslProtocol? (No, I must be mistaken--remove either/or
> and Tomcat still fails to start).
>
> Yes; you should remove _both_ of them and move that configuration into the
> SSLHostConfig. You can find the replacements for them in the docs for
> clientAuth and sslProtocol here
> <
> https://tomcat.apache.org/tomcat-8.5-doc/config/http.html#SSL_Support_-_Connector_-_NIO_and_NIO2
> >;
> I've tested this and it works for me. I believe that the reason behind this
> (although I am no expert) is that tomcat is taking the old Connector
> configuration that you have in place and creating a default SSLHostConfig
> behind the scenes; this action causes a conflict with your defined
> SSLHostConfig hence the exception about the multiple non-unique host names
> and such.
>
> > "BTW sslProtocol is really useless." does make sense. If so, I think I'm
> hearing
> that I should not use the sslProtocol="TLS" attribute or the
> <SSLHostConfig> element. Is that right?
>
> You don't need the sslProtocol attribute because you're just setting the
> default value for TLS. As far as the SSLHostConfig goes, I think that's up
> to you. For now, tomcat will take your old Connector configuration and
> translate it behind the scenes into what it needs to function. If you do
> use the SSLHostConfig tag, then you'll need to move all of the attributes
> from the Connector to the SSLHostConfig that belong there; this is
> basically upgrading your connector from the tomcat 8.0 syntax to tomcat 9's
> syntax.
>
> > This confuses me. The 8.5 server.xml uses <SSLHostConfig> in its
> commented examples while the 8.0 server.xml does not. And if SSL*
> attributes are going away, why is <SSLHostConfig> now the example?
>
> Tomcat 8.5 was forked from tomcat/trunk (tomcat9), which is where that
> comes from. I think that the example was left there to encourage movement
> to the tomcat 9 syntax because the older connector syntax will eventually
> be removed. I do notice that the ssl-howto docs still refer to the tomcat8
> syntax, so it doesn't seem like there is a unified message regarding which
> one is the preferred method (they're both still correct and will work when
> the hosts don't conflict).
>
> > And without SSL*, how do I specify the certificates in an APR connector
> like this one (which is the first I got working):
>
> All of the SSL* attributes from the connector were migrated to the
> SSLHostConfig and it's new tags.
>
> Let me know if any of my response was vague and I'll try and clarify.
>

Thank you, Coty. I think that answered my questions (the video was useful,
too).

So, for the record--and I hope I've labeled them correctly--I have gotten
the configurations below to come up on Mac OSX 10.10.5 with Java 1.8.0_77.
My OpenSSL is 1.0.2g 1 Mar 2016, and my Tomcat native library is 1.2.5,
both installed with Homebrew.

  <!-- NIO connector with JSSE -->
  <Connector port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
             maxThreads="200" SSLEnabled="true" compression="on"
             scheme="https" secure="true">
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig honorCipherOrder="false">
      <Certificate certificateKeystoreFile="conf/foo.jks"
                   certificateKeystorePassword="changeit"
                   certificateKeyAlias="tomcat"
                   type="RSA" />
    </SSLHostConfig>
  </Connector>

  <!-- NIO connector with OpenSSL -->
  <Connector port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
             maxThreads="200" SSLEnabled="true" compression="on"
             scheme="https" secure="true">
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig honorCipherOrder="false">
      <Certificate certificateKeyFile="conf/foo-nopp.pem"
                   certificateFile="conf/foo.pem"
                   type="RSA" />
    </SSLHostConfig>
  </Connector>

  <!-- APR/Tomcat native connector with OpenSSL -->
  <Connector port="8443"
protocol="org.apache.coyote.http11.Http11AprProtocol"
             maxThreads="200" SSLEnabled="true" compression="on"
             scheme="https" secure="true">
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig honorCipherOrder="false" >
      <Certificate certificateKeyFile="conf/foo-nopp.pem"
                   certificateFile="conf/foo.pem"
                   type="RSA" />
    </SSLHostConfig>
  </Connector>

Now to see if this breaks any of my apps. :)


>
> On Tue, Apr 5, 2016 at 4:57 PM, Thad Humphries <thad.humphr...@gmail.com>
> wrote:
>
> > On Tue, Apr 5, 2016 at 4:25 PM, Rémy Maucherat <r...@apache.org> wrote:
> >
> > > 2016-04-05 15:11 GMT-05:00 Thad Humphries <thad.humphr...@gmail.com>:
> > >
> > > > My primary interest in Tomcat 8.5 is HTTP/2, so I must set up HTTPS
> and
> > > > TLS.
> > > >
> > > > Since I eventually must demonstrate the various HTTPS approaches to
> > > others,
> > > > I have tried both the APR and the NIO implementation, as well as the
> > > > different <Connector> layouts in the docs (
> > > >
> > > >
> > >
> >
> http://tomcat.apache.org/tomcat-8.5-doc/ssl-howto.html#Edit_the_Tomcat_Configuration_File
> > > > ),
> > > > and the $CATALINA_BASE/conf/server.xml comments.  I've gotten APR is
> > > > working both ways, but not quite NIO.
> > > >
> > > > When I use the following connector for NIO (from the docs), my SSL
> > works:
> > > >
> > > >     <Connector
> > > >            protocol="org.apache.coyote.http11.Http11NioProtocol"
> > > >            port="8443" maxThreads="200" compression="on"
> > > >            scheme="https" secure="true" SSLEnabled="true"
> > > >            keystoreFile="conf/foo.jks" keystorePass="changeit"
> > > >            clientAuth="false" sslProtocol="TLS">
> > > >       <UpgradeProtocol
> > className="org.apache.coyote.http2.Http2Protocol"
> > > />
> > > >     </Connector>
> > > >
> > > > However when I try the approach in the server.xml comments, Tomcat
> does
> > > not
> > > > start:
> > > >
> > > >     <Connector port="8443"
> > > > protocol="org.apache.coyote.http11.Http11NioProtocol"
> > > >                maxThreads="200" SSLEnabled="true"
> > > >                scheme="https" secure="true" clientAuth="false"
> > > >                sslProtocol="TLS">
> > > >       <UpgradeProtocol
> > className="org.apache.coyote.http2.Http2Protocol"
> > > />
> > > >       <SSLHostConfig honorCipherOrder="false">
> > > >         <Certificate certificateKeystoreFile="conf/foo.jks"
> > > >                      certificateKeystoreType="JKS"
> > > >                      certificateKeystorePassword="changeit"
> > > >                      certificateKeyAlias="tomcat"
> > > >                      type="RSA" />
> > > >       </SSLHostConfig>
> > > >     </Connector>
> > > >
> > > > The error at the top of catalina.out is below. I'm trying to
> understand
> > > > why, both for myself and so that I can explain it to others. The
> > "Caused
> > > > by: java.lang.IllegalArgumentException: Multiple SSLHostConfig
> elements
> > > > were provided for the host name [_default_]. Host names must be
> > unique."
> > > > has me stumped as I have only the one uncommented SSLHostConfig in
> > > > server.xml.
> > > >
> > > > (Once I have this second <Connector> working, I must make a write-up
> > for
> > > > folks here, a write-up which I hope will be clearer and more direct
> > than
> > > > the docs. I would be happy to offer that write-up to the wiki or
> docs.)
> > > >
> > >
> > > You still have some attributes which should go into SSLHostConfig, so
> you
> > > have two SNI for the default host (clientAuth and sslProtocol). BTW
> > > sslProtocol is really useless.
> > >
> > > Rémy
> > >
> >
> > I'm sorry, I'm not following you. Are you saying that to make the second
> > <Connector> work I must remove either clientAuth or sslProtocol? (No, I
> > must be mistaken--remove either/or and Tomcat still fails to start).
> >
> > "BTW sslProtocol is really useless." does make sense. If so, I think I'm
> > hearing that I should not use the sslProtocol="TLS" attribute or the
> > <SSLHostConfig>
> > element. Is that right?
> >
> > The 8.5 docs say
> > "As of Tomcat 9, the majority of the SSL configuration attributes in the
> > Connector are deprecated. If specified, they will be used to configure a
> > SSLHostConfig and Certificate for the sslDefaultHost. Note that if an
> > explicit SSLHostConfig element also exists for the sslDefaultHost then
> that
> > will be treated as a configuration error. It is expected that Tomcat 10
> > will drop support for the SSL configuration attributes in the Connector."
> >
> > This confuses me. The 8.5 server.xml uses <SSLHostConfig> in its
> commented
> > examples while the 8.0 server.xml does not. And if SSL* attributes are
> > going away, why is <SSLHostConfig> now the example? And without SSL*, how
> > do I specify the certificates in an APR connector like this one (which is
> > the first I got working):
> >
> >     <Connector
> >            protocol="org.apache.coyote.http11.Http11AprProtocol"
> >            port="8443" maxThreads="200" compression="on"
> >            scheme="https" secure="true" SSLEnabled="true"
> >            SSLCertificateFile="conf/foo.pem"
> >            SSLCertificateKeyFile="conf/foo-nopp.pem"
> >            SSLVerifyClient="none" SSLProtocol="TLSv1+TLSv1.1+TLSv1.2">
> >       <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol"
> />
> >     </Connector>
> >
> >
> > >
> > > >
> > > > 05-Apr-2016 15:32:42.642 SEVERE [main]
> > > > org.apache.tomcat.util.digester.Digester.endElement End event threw
> > > > exception
> > > >  java.lang.reflect.InvocationTargetException
> > > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> > > > at
> > > >
> > > >
> > >
> >
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> > > > at
> > > >
> > > >
> > >
> >
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> > > > at java.lang.reflect.Method.invoke(Method.java:498)
> > > > at
> > > >
> > > >
> > >
> >
> org.apache.tomcat.util.IntrospectionUtils.callMethod1(IntrospectionUtils.java:377)
> > > > at
> > org.apache.tomcat.util.digester.SetNextRule.end(SetNextRule.java:145)
> > > > at
> > org.apache.tomcat.util.digester.Digester.endElement(Digester.java:966)
> > > > at
> > > >
> > > >
> > >
> >
> com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609)
> > > > at
> > > >
> > > >
> > >
> >
> com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1783)
> > > > at
> > > >
> > > >
> > >
> >
> com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2970)
> > > > at
> > > >
> > > >
> > >
> >
> com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
> > > > at
> > > >
> > > >
> > >
> >
> com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
> > > > at
> > > >
> > > >
> > >
> >
> com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
> > > > at
> > > >
> > > >
> > >
> >
> com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
> > > > at
> > > >
> > > >
> > >
> >
> com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
> > > > at
> > > >
> > > >
> > >
> >
> com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
> > > > at
> > > >
> > > >
> > >
> >
> com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)
> > > > at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1461)
> > > > at org.apache.catalina.startup.Catalina.load(Catalina.java:578)
> > > > at org.apache.catalina.startup.Catalina.load(Catalina.java:629)
> > > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> > > > at
> > > >
> > > >
> > >
> >
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> > > > at
> > > >
> > > >
> > >
> >
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> > > > at java.lang.reflect.Method.invoke(Method.java:498)
> > > > at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:311)
> > > > at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:494)
> > > > Caused by: java.lang.IllegalArgumentException: Multiple SSLHostConfig
> > > > elements were provided for the host name [_default_]. Host names must
> > be
> > > > unique.
> > > > at
> > > >
> > > >
> > >
> >
> org.apache.tomcat.util.net.AbstractEndpoint.addSslHostConfig(AbstractEndpoint.java:201)
> > > > at
> > > >
> > > >
> > >
> >
> org.apache.coyote.http11.AbstractHttp11Protocol.addSslHostConfig(AbstractHttp11Protocol.java:398)
> > > > at
> > > >
> > > >
> > >
> >
> org.apache.catalina.connector.Connector.addSslHostConfig(Connector.java:876)
> > > > ... 26 more
> > > >
> > > >
> > > > --
> > > > "Hell hath no limits, nor is circumscrib'd In one self-place; but
> where
> > > we
> > > > are is hell, And where hell is, there must we ever be" --Christopher
> > > > Marlowe, *Doctor Faustus* (v. 121-24)
> > > >
> > >
> >
> >
> >
> > --
> > "Hell hath no limits, nor is circumscrib'd In one self-place; but where
> we
> > are is hell, And where hell is, there must we ever be" --Christopher
> > Marlowe, *Doctor Faustus* (v. 121-24)
> >
>
>
>
> --
> Coty Sutherland, RHCSA, RHCE, JBCAA
> Senior Software Engineer @ Red Hat, Inc.
> 100 East Davie Street
> Raleigh, NC 27606
>
> Email: c...@redhat.com
> IRC Nickname: coty
> Office: 919-890-8303
>



-- 
"Hell hath no limits, nor is circumscrib'd In one self-place; but where we
are is hell, And where hell is, there must we ever be" --Christopher
Marlowe, *Doctor Faustus* (v. 121-24)

Reply via email to