Roman Vottner created CAMEL-11482:
-------------------------------------

             Summary: SSLContextParameters settings are not properly copied to 
SslContextFactory
                 Key: CAMEL-11482
                 URL: https://issues.apache.org/jira/browse/CAMEL-11482
             Project: Camel
          Issue Type: Bug
          Components: camel-jetty
    Affects Versions: 2.19.1, 2.19.0
         Environment: Max OS X, Java 8 Update 131
Ubuntu 14.04 LTS, Java 8 Update 111
Camel 2.19.0
Jetty9 9.4.5v20170502 and 9.3.14.v20161028
            Reporter: Roman Vottner
            Priority: Critical


Jetty 9.3+ excludes unsecure ciphers which end on either MD5, SHA or SHA1 by 
default now. This will however remove all ciphers that are used by either TLSv1 
or TLSv1.1 and thus no ciphers remain in order to agree on a cipher for TLSv1 
or TLSv1.1 connection attempts. (Further reading: 
https://github.com/eclipse/jetty.project/issues/860)

The Jetty 9 SSL configuration documentation 
(https://www.eclipse.org/jetty/documentation/9.3.x/configuring-ssl.html) states 
that this exclusion cipher suites can be customized by providing an own 
exclusion list. On specifying SSLContextParameters like below however will not 
correctly propagate this exclution cipher suites to the SslContextFactory of 
Jetty and thus use the default setting which prevents TLSv1 and TLSv1.1 
connections.

{code:title=SSLContextParameters Spring Config|borderStyle=solid}
  @Bean(name = "sslContextParameters")
  public SSLContextParameters sslContextParameters() {
    String keyStore = env.getProperty("ssl.keyStore.resource");
    URL keyStoreUrl = this.getClass().getResource(keyStore);

    // http://camel.apache.org/jetty.html
    KeyStoreParameters ksp = new KeyStoreParameters();
    ksp.setResource(keyStoreUrl.getPath());
    ksp.setPassword(env.getProperty("ssl.keyStore.password"));

    KeyManagersParameters kmp = new KeyManagersParameters();
    kmp.setKeyStore(ksp);
    kmp.setKeyPassword(env.getProperty("ssl.key.password"));

    SSLContextParameters scp = new SSLContextParameters();
    scp.setKeyManagers(kmp);

    // Jetty 9.3+ support only TLSv1.2 by default hence clients not supporting 
this protocol will fail
    List<String> supportedSslProtocols = Arrays.asList("TLSv1", "TLSv1.1", 
"TLSv1.2");
    SecureSocketProtocolsParameters protocolsParameters = new 
SecureSocketProtocolsParameters();
    protocolsParameters.setSecureSocketProtocol(supportedSslProtocols);
    scp.setSecureSocketProtocols(protocolsParameters);

    // TLS 1.0 / 1.1 have been disabled by jetty 9.3
    // this is a first attempt to re-enable them
    // see
    // - https://www.eclipse.org/jetty/documentation/9.3.x/configuring-ssl.html
    // - https://github.com/eclipse/jetty.project/issues/860
    // - http://camel.apache.org/camel-configuration-utilities.html
    FilterParameters cipherParameters = new FilterParameters();
    cipherParameters.getInclude().add(".*");
    cipherParameters.getExclude().add("^.*_(MD5|SHA1)$");
    scp.setCipherSuitesFilter(cipherParameters);

    return scp;
  }
{code}

A workaround is to use a custom JettyHttpComponent9 implementation that sets 
the excludedCipherSuites manually like depicted below:

{code:title=Workaround|borderStyle=solid}
  /**
   * A custom jetty http component which explicitly sets the 
excludedCipherSuites during creation of
   * the jetty connector.
   *
   * Why? It seems camel does not push included/excluded cipherSuites from 
{@link
   * SSLContextParameters} to the {@link SslContextFactory} nor does push 
explicitly listed cipher
   * suites (i.e. like <em>TLS_RSA_WITH_AES_256_CBC_SHA</em>) to the Jetty SSL 
context factory.
   */
  public static class HackedJettyHttpComponent extends JettyHttpComponent9 {

    @Override
    protected AbstractConnector createConnectorJettyInternal(Server server,
                                                             JettyHttpEndpoint 
endpoint,
                                                             SslContextFactory 
sslcf) {

      sslcf.setExcludeCipherSuites("^.*_(MD5|SHA1)$");
      return super.createConnectorJettyInternal(server, endpoint, sslcf);
    }
  }
{code}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to