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.
-
¿Por qué no puedo pasar un SchemeRegistry al ThreadSafeClientConnManager y no se usa al construir el HttpClient? En su lugar, tengo que usar HttpClientConfigurer
-
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
nohttp4
-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.