Saltar al contenido

Apache Camel Http y SSL

Queremos darte la mejor solución que hemos encontrado en todo internet. Deseamos que te resulte de ayuda y si deseas aportar cualquier detalle que nos pueda ayudar a crecer siente la libertad de hacerlo..

Solución:

Bien, trabajando ahora, resulta que tuve un malentendido fundamental de los puntos finales y los protocolos dentro de Camel. Debería haber estado registrando un esquema con el protocolo https4 y configurando mi SSLSocketFactory / SSLContext en él. Dado que estaba registrando un esquema con https, el componente Http4 nunca lo utilizó.

Aquí está mi solución de trabajo con 2 advertencias.

  1. ¿Por qué no puedo pasar un SchemeRegistry al ThreadSafeClientConnManager y no se usa al construir el HttpClient? En su lugar, tengo que usar HttpClientConfigurer

  2. Jetty tiene un problema donde el almacén de claves y el almacén de confianza deben configurarse por ruta en SslSelectChannelConnector en lugar de a través de SSLContext (el error está en al menos embarcadero 7.2.2 y 7.4.0 -> más reciente)

Código:

public class CamelProxy 

/**
 * @param args
 */
public static void main(String[] args) throws Exception 
    CamelContext context = new DefaultCamelContext();

    final Endpoint jettyEndpoint = configureJetty(context);

    final Endpoint https4Endpoint = configureHttpClient(context);

    context.addRoutes(new RouteBuilder() 

        @Override
        public void configure() 
            from(jettyEndpoint).to("log:com.smithforge.request?showAll=true").to(https4Endpoint);
        
    );

    context.start();

    context.stop();


private static Endpoint configureHttpClient(CamelContext context) throws Exception 
    KeyStore keystore = KeyStore.getInstance("PKCS12");
    keystore.load(new FileInputStream(new File("/home/brian/User2.p12")), "Password1234!".toCharArray());

    KeyStore truststore = KeyStore.getInstance("JKS");
    truststore.load(new FileInputStream(new File("/home/brian/jboss.truststore")), "changeit".toCharArray());

    KeyManagerFactory keyFactory = KeyManagerFactory.getInstance("SunX509");
    keyFactory.init(keystore, "Password1234!".toCharArray());

    TrustManagerFactory trustFactory = TrustManagerFactory.getInstance("SunX509");
    trustFactory.init(truststore);

    SSLContext sslcontext = SSLContext.getInstance("TLSv1");
    sslcontext.init(keyFactory.getKeyManagers(), trustFactory.getTrustManagers(), null);

    SSLSocketFactory factory = new SSLSocketFactory(sslcontext, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

    SchemeRegistry registry = new SchemeRegistry();
    final Scheme scheme = new Scheme("https4", 443, factory);
    registry.register(scheme);

    HttpComponent http4 = context.getComponent("http4", HttpComponent.class);
    http4.setHttpClientConfigurer(new HttpClientConfigurer() 

        @Override
        public void configureHttpClient(HttpClient client) 
            client.getConnectionManager().getSchemeRegistry().register(scheme);
        

    );
    http4.setClientConnectionManager(new ThreadSafeClientConnManager());
    return http4
            .createEndpoint("https4://soafa-lite-staging:443/axis2/services/SigActService?bridgeEndpoint=true&throwExceptionOnFailure=false");


private static Endpoint configureJetty(CamelContext context) throws Exception 
    JettyHttpComponent jetty = context.getComponent("jetty", JettyHttpComponent.class);

    SslSelectChannelConnector sslConnector = new SslSelectChannelConnector();
    sslConnector.setPort(4443);
    sslConnector.setKeystore("/home/brian/jboss.keystore");
    sslConnector.setKeyPassword("changeit");
    sslConnector.setTruststore("/home/brian/jboss.truststore");
    sslConnector.setTrustPassword("changeit");
    sslConnector.setPassword("changeit");
    sslConnector.setNeedClientAuth(true);
    sslConnector.setAllowRenegotiate(true);

    Map connectors = new HashMap();
    connectors.put(4443, sslConnector);

    jetty.setSslSocketConnectors(connectors);
    return jetty.createEndpoint("jetty:https://localhost:4443/service");


// .to("log:com.smithforge.response?showHeaders=true");

Me puse a trabajar un proxy ssl con el siguiente código

La ruta

public class MyRouteBuilder extends RouteBuilder 

public void configure() 

    configureSslForJetty();
    configureSslForHttp4();

    from("jetty:https://0.0.0.0:4443/topython/?matchOnUriPrefix=true")
    .to("https4://backend.fake.com:4444/?q=ssl&bridgeEndpoint=true&throwExceptionOnFailure=false");

...

Configuración para embarcadero (proporcione un certificado cuando actuemos como servidor)

private void configureSslForJetty()

    KeyStoreParameters ksp = new KeyStoreParameters();
    ksp.setResource("c:\Projects\blah\fakefilter.jks");
    ksp.setPassword("123456");

    KeyManagersParameters kmp = new KeyManagersParameters();
    kmp.setKeyStore(ksp);
    kmp.setKeyPassword("export-password");

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

    JettyHttpComponent jettyComponent = getContext().getComponent("jetty", JettyHttpComponent.class);
    jettyComponent.setSslContextParameters(scp);

Configuración para https4 (en qué firmantes de certificados confiamos cuando actuamos como clientes)

private void configureSslForHttp4()

    KeyStoreParameters trust_ksp = new KeyStoreParameters();
    trust_ksp.setResource("c:\Projects\blah\fakeca.jks");
    trust_ksp.setPassword("123456");

    TrustManagersParameters trustp = new TrustManagersParameters();
    trustp.setKeyStore(trust_ksp);

    SSLContextParameters scp = new SSLContextParameters();
    scp.setTrustManagers(trustp);

    HttpComponent httpComponent = getContext().getComponent("https4", HttpComponent.class);
    httpComponent.setSslContextParameters(scp);

Cosas dignas de mención

  • necesitas configurar el componente https4 no http4
  • -Djavax.net.debug=ssl en la línea de comando proporcionó una gran cantidad de registros útiles

Tienes la posibilidad dar recomendación a esta reseña si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *