On Tue, Nov 22, 2016 at 3:41 PM, Christopher Schultz <
ch...@christopherschultz.net> wrote:

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA256
>
> William,
>
> On 11/16/16 1:06 PM, William Boyd wrote:
> > On Tue, Nov 15, 2016 at 2:17 PM, <john.e.gr...@wellsfargo.com>
> > wrote:
> >>
> >> I haven't been following this super closely, but it sounds like
> >> there is a lot of trial and error going on so let me try to
> >> explain how the key stores and trust stores are used.
> >
> > Will: Ultimately I am trying to determine why a configuration that
> > worked since Tomcat 5, stopped working in Tomcat 8.5.5 so I can
> > explain the issue to operations.  We used to be able to use the
> > same keystore for both keystoreFile in the Connector and the
> > javax.net.ssl.trustStore system property but that no longer works.
> > The only variable is Tomcat.  This will affect many TEST and PROD
> > sites.
> >
> >> The system properties affect things like outgoing connections
> >> that use SSL, like https calls.  javax.net.ssl.trustStore would
> >> contain the certs for the CAs that sign the backend server's
> >> cert.  javax.net.ssl.keyStore would come into play if the backend
> >> uses mutual authentication/client authentication/2-way SSL.  If
> >> that's required by the backend, you would put your own cert and
> >> private key in the key store.  I think you can combine them all
> >> into one file, but usually they're kept separate.
> >>
> >
> > Will: Thanks, I think this explains our need for
> > javax.net.ssl.trustStore. The system I'm supporting is using axis
> > jaxrpc to communicate between WARs over HTTPS within Tomcat. These
> > connections in axis must be the reason we require
> > javax.net.ssl.trustStore.
>
> Exactly. I think one of the confusing things here has been the
> confusion in my mind between exceptions you are getting on the client
> and exceptions being thrown on the server (which, oddly enough, is a
> client).
>
> In the absence of any specific Java-level calls to set the trust store
> for a SOAP connection, Axis is going to use the system-wide trust
> store which is in fact set using the javax.net.ssl.trustStore system
> property.
>
> Nothing in Tomcat's configuration can set this for you.
>
> So why does the Tomcat upgrade seem to have broken something that's
> been working? I can think of two possibilities:
>
> 1. The system property was set in CATALINA_HOME/bin/setenv.sh in your
> old Tomcat installation, and nobody copied that file to the new
> installation. Solution: use CATALINA_BASE/bin/setenv.sh instead of
> CATALINA_HOME/bin/setenv.sh
>
> 2. The system property was set in
> CATALINA_BASE/conf/catalina.properties in your old installation and
> nobody copied that configuration to the new installation. Solution:
> look at a diff between those two config files and fix the differences
> as appropriate.
>
> >> The Tomcat connector parameters are for Tomcat's use when serving
> >> https connections to clients.  I don't think they have any impact
> >> on outgoing calls.  The key store would contain Tomcat's cert and
> >> private key. Likewise the trust store would contain the certs of
> >> the CA or CAs who sign your client's certs if you have mutual
> >> auth enabled.  It might also be required to form the chain
> >> linking the server's cert to the CA.  In that case, though, I
> >> might be inclined to putting the CA in the key store itself for
> >> simplicity.  According to the docs, Tomcat will fall back to the
> >> system properties if the connector doesn't explicitly them.
> >>
> >
> > Will: Sorry I'm confused by the last bit here. Using "keytool
> > -genkeypair" I have a file containing a self-signed certificate yet
> > I now need to export, than import that cert into a separate
> > truststore in order for our servers to work.  If this is to spec
> > and Tomcat it tightening up the rules I could understand.
>
> I don't think anything really changed between Tomcat 8.5.4 and
> 8.5.5... I think your configuration must have changed slightly.
>
> If you need a webapp in server A to contact server B using Axis, then
> you'll need:
>
> serverA$ keytool -genkeypair -alias X -keystore serverA.jks
> serverA$ keytool -exportcert -alias X -keystore serverA.jks \
>          > trusted.crt
> serverA$ keytool -importcert -alias X -keystore truststore.jks \
>          < trusted.crt
>
> Tell Tomcat on server A to use serverA.jks as its keystore. No other
> configuration is required. Specifically, setting trustStoreFile on the
> <Connector> accomplishes nothing.
>
> Tell the JVM on server B to use truststore.jks as the trust store,
> using a system property if absolutely necessary.
>
> (I *really* don't like dong this, because it sets the trust store for
> the whole JVM and everything it might need to trust. I much prefer to
> explicitly-set the trust store for a particular connection. That might
> require re-writing code which is expensive and risky, but you are
> better-off in the long-run.)
>
> If you need a webapp in server B to contact server A using Axis, thn
> you need to reverse the process above so that A trusts B's cert and B
> trusts A's cert. If both servers are using the same cert, then both
> servers only need to trust the single cert, of course.
>
> > Will: I’m guessing its AXIS that can’t find the CA in the trust
> > store. Regarding IE, I can clarify, the error occurs in a servlet
> > which returns the message to the browser.
>
> The way a client trust store works is that the client will make a
> connection and obtain the certificate chain from the server. It starts
> with the first certificate in the chain and, if it's trusted, it will
> allow the connection to be established. If not, it moves on to the
> next certificate in the chain until it either trusts a certificate or
> runs out of certificates to check for trust, at which point, it will
> fail to establish a connection.
>
> If Axis can't connect, check the trust store it's using against the
> certificate(s) being presented by the server. If they don't match, fix
> that (usually by re-building the trust store from the certificate
> presented by the server). If they do match, something weird is happening
> .
>
> > So I think I understand why I need javax.net.ssl.trustStore and
> > keystoreFile configured to get our system working.  Thank you for
> > making me walk through it in more detail.
>
> So, things are in fact working again?
>
> > The question remains why does Tomcat 8.5.5 no longer allow me to
> > use a JKS file as a trustStore and raise the following exception at
> > startup?
> >
> >
> >
> > 16-Nov-2016 09:02:03.195 SEVERE [main]
> > org.apache.coyote.AbstractProtocol.init
> >
> > Failed to initialize end point associated with ProtocolHandler
> > ["https-openssl-nio-8001"]
> >
> > java.lang.IllegalArgumentException:
> > java.security.InvalidAlgorithmParameterException: the trustAnchors
> > parameter must be non-empty
>
> Which configuration was this, specifically?
>
> > 2. adding truststoreFile="C:\keystore\myAlias.cer"
>
> This isn't a keystore, so the "Invalid keystore format" error you got
> makes sense.
>
> > 3. adding truststoreFile="C:\keystore\keystore.jsk"
>
> This one? The error you are getting is probably because the keystore
> itself contains a single entry which is a key/cert combination and ...
> at this point we've reached the limit of my knowledge of keystores
> (which pretty much ends with me saying "#$%& IT!" and switching to a
> vanilla PEM-formatted certificate, etc.).
>
> By importing the certificate *only* into a separate keystore (trust
> store!) puts it into a different format which is acceptable to the
> Java API that is underlying everything, here.
>
> Why did this work before? I have absolutely no idea. I'm still
> thinking that there is a subtle change in your configuration from
> version to version (8.5.4 -> 8.5.5, right?), and that Tomcat's code
> isn't involved.
>
> - -chris
> -----BEGIN PGP SIGNATURE-----
> Comment: GPGTools - http://gpgtools.org
> Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/
>
> iQIcBAEBCAAGBQJYNNexAAoJEBzwKT+lPKRYEecQAKrAJU6+NAQMFDKGw1YESyOQ
> MTp9GUW+tXVX/v2h7ayVh8bfHPOTSZShJ1KMbdi9LQWXMNalfLaJSbaQIB6j5vNM
> E2GhoScWJ9AJ3nwiqD/knxMkXA2LEzN/z/JhqOH+RY3ql+YjDsc0v8lK9jdhjqPB
> p6nBXjDV5unD2p7HFLUoDtCVISilPLWE2o78qNVfKWM113U3eRG81P3lUyACLROV
> TthII61IQocOqwehDFzCDf0zlMnB06Mi/l5iCvQDGYfmFYh/CHDyNA4bFDin8zak
> jd9/5asTeZdEeNJ3+cU6ffjV+BVJwTPMpFRyj1hVGwLyS9FcCEBu9el2iiL+v2zQ
> 4fgRX0iXbrPvQgXDggvLE1pZoWHQNy7ONMzEEwTvCnPNLNL88VWM3WMeztWh9O6z
> TK4GClQGZcXHo3LFd1baQ8+lBsaCWF/NAYdBMwa+p4P0z9NBHf1RaBGeFBKhmY/H
> 0h7Pf8lJDPfRSlLjc6SX/U6nmyGHrCZ8LeJ3BxeTieJBcDDM2Leh8gyxacF+hFfT
> EMj8duIMgbfsBtvtQDMDxG3elQ5ZRPclkjhCSe3hVykWk7Ayx5XVd3HUOHzK6Z3E
> F4xpOgPBT5eaELpO8XqyUQL2x2M6BV6TxefXpKUw5p5PLdozbJH3C4KDTlugF3Yd
> i1X2Ubn8gAAqqBa+LMAV
> =GvhM
> -----END PGP SIGNATURE-----
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: users-h...@tomcat.apache.org
>
>
Hi Christopher,

Thanks again for your input.  Yes, I've managed to get it working with a
separate keystore and truststore file as you've suggested.

Ok, sanity check.  I revisited this with unmodified
apache-tomcat-8.5.#-windows-x64.zip files downloaded from the distribution
site.

In this case, all I did was unpack the ZIP content and change two files;
server.xml and setclasspath.bat.

In each case I added this one line to the top of setclasspath.bat

    set JAVA_OPTS=%JAVA_OPTS%
-Djavax.net.ssl.trustStore="C:\keys\keystore.jsk"
In tomcat 8.5.4 and 8.5.5 > server.xml, I updated the default connector to
this:

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               keystoreFile="C:\keys\keystore.jsk"
               keystorePass="changeit"
               keyAlias="tomcat"
               scheme="https"
               secure="true"
               SSLEnabled="true"
               clientAuth="false" />

In tomcat 8.5.8 > server.xml, I updated the default connector to this:

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               scheme="https"
               secure="true"
               SSLEnabled="true">
        <SSLHostConfig certificateVerification="none">
            <Certificate certificateKeystoreFile="C:\keys\keystore.jsk"
                         certificateKeystorePassword="changeit"
                         certificateKeyAlias="tomcat"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>

On startup both tomcat 8.5.5 and 8.5.8 raise the error I've describe above:
"InvalidAlgorithmParameterException: the trustAnchors parameter must be
non-empty"

Tomcat 8.5.4 starts up without error.

Each was run in the same environment:
    OS Name:     Windows 7 SP1
    JVM Version: 1.8.0_102-b14

Sorry for beating this to death.  I had to be sure I wasn't losing my mind.
Regards,

William Boyd

Reply via email to