Apache Camel-Http und SSL
Habe ich versucht, eine 2-Wege-ssl/https-proxy arbeitet mit Kamel. Ich war in der Lage, die Jetty-Komponente mit 2-Wege-ssl und bin jetzt versucht, um es arbeiten mit dem Http4-Komponente zur Vervollständigung der client-Seite des proxy.
Wenn ich die route Steg-Verkehr, um eine log-Komponente, alles ist gut und der 2-Wege-ssl-trust-Kette ist in Ordnung. Wenn ich werfen in das Http4 Komponente, es explodiert mit einem peer nicht authentifiziert Ausnahme. Ich bin mit Camel 2.7.0
Hier ist was ich bisher
public static void main(String[] args) throws Exception {
CamelContext context = new DefaultCamelContext();
JettyHttpComponent jetty = context.getComponent("jetty", JettyHttpComponent.class);
SslSelectChannelConnector sslConnector = new SslSelectChannelConnector();
sslConnector.setPort(9443);
sslConnector.setKeystore("/home/brian/jboss.keystore");
sslConnector.setKeyPassword("changeit");
sslConnector.setTruststore("/home/brian/jboss.truststore");
sslConnector.setTrustPassword("changeit");
sslConnector.setPassword("changeit");
sslConnector.setNeedClientAuth(true);
Map<Integer, SslSelectChannelConnector> connectors = new HashMap<Integer, SslSelectChannelConnector>();
connectors.put(9443, sslConnector);
jetty.setSslSocketConnectors(connectors);
final Endpoint jettyEndpoint = jetty.createEndpoint("jetty:https://localhost:9443/service");
KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(new FileInputStream(new File("/home/brian/User2.p12")), "Password1234!".toCharArray());
X509KeyManager keyManager = new CTSKeyManager(keystore, "user2", "Password1234!".toCharArray());
KeyManager[] keyManagers = new KeyManager[] { keyManager };
X509TrustManager trustManager = new EasyTrustManager();
TrustManager[] trustManagers = new TrustManager[] { trustManager };
SSLContext sslcontext = SSLContext.getInstance("TLS");
sslcontext.init(keyManagers, trustManagers, null);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("https", 443, new SSLSocketFactory(sslcontext,
SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)));
HttpComponent http4 = context.getComponent("http4", HttpComponent.class);
http4.setClientConnectionManager(new ThreadSafeClientConnManager(registry));
final Endpoint https4Endpoint = http4
.createEndpoint("https4://soafa-lite-staging:443/axis2/services/SigActService?bridgeEndpoint=true&throwExceptionOnFailure=false");
context.addRoutes(new RouteBuilder() {
@Override
public void configure() {
from(jettyEndpoint).to(https4Endpoint);
}
});
context.start();
context.stop();
}
private static class EasyTrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
private static class CTSKeyManager extends X509ExtendedKeyManager {
private final KeyStore keystore;
private final char[] privateKeyPassword;
private final String privateKeyAlias;
public CTSKeyManager(KeyStore keystore, String privateKeyAlias, char[] privateKeyPassword) {
this.keystore = keystore;
this.privateKeyAlias = privateKeyAlias;
this.privateKeyPassword = privateKeyPassword;
}
@Override
public String[] getServerAliases(String keyType, Principal[] issuers) {
String[] serverAliases = null;
try {
List<String> aliasList = new ArrayList<String>();
int count = 0;
Enumeration<String> aliases = keystore.aliases();
while (aliases.hasMoreElements()) {
String alias = aliases.nextElement();
aliasList.add(alias);
count++;
}
serverAliases = aliasList.toArray(new String[count]);
} catch (Exception e) {
}
return serverAliases;
}
@Override
public PrivateKey getPrivateKey(String alias) {
PrivateKey privateKey = null;
try {
privateKey = (PrivateKey) keystore.getKey(alias, privateKeyPassword);
} catch (Exception e) {
}
return privateKey;
}
@Override
public String[] getClientAliases(String keyType, Principal[] issuers) {
return privateKeyAlias == null ? null : new String[] { privateKeyAlias };
}
@Override
public X509Certificate[] getCertificateChain(String alias) {
X509Certificate[] x509 = null;
try {
Certificate[] certs = keystore.getCertificateChain(alias);
if (certs == null || certs.length == 0) {
return null;
}
x509 = new X509Certificate[certs.length];
for (int i = 0; i < certs.length; i++) {
x509[i] = (X509Certificate) certs[i];
}
} catch (Exception e) {
}
return x509;
}
@Override
public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket) {
return privateKeyAlias;
}
@Override
public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) {
return privateKeyAlias;
}
@Override
public String chooseEngineClientAlias(String[] keyType, Principal[] issuers, SSLEngine engine) {
return privateKeyAlias;
}
@Override
public String chooseEngineServerAlias(String keyType, Principal[] issuers, SSLEngine engine) {
return privateKeyAlias;
}
}
}
Soweit ich sagen kann, das Vertrauen sollte in Ordnung sein, zwischen allen keystores/truststores verwendet, die auf beiden Seiten des proxy-verbindungen.
Hier ist mein stack trace
[ qtp25584663-14] HttpProducer DEBUG Ausführen von http-POST-Methode: https4://soafa-lite-staging:443/axis2/services/SigActService?bridgeEndpoint=true&throwExceptionOnFailure=false [ qtp25584663-14] DefaultErrorHandler DEBUG Fehlgeschlagen Lieferung für exchangeId: ID-ubuntu-46528-1303140195358-0-1. Auf Zustellversuch: 0 gefangen: javax.net.ssl.SSLPeerUnverifiedException: peer nicht authentifiziert [ qtp25584663-14] DefaultErrorHandler FEHLER Fehlgeschlagen Lieferung für exchangeId: ID-ubuntu-46528-1303140195358-0-1. Erschöpft nach einem Zustellversuch: 1 gefangen: javax.net.ssl.SSLPeerUnverifiedException: peer nicht authentifiziert javax.net.ssl.SSLPeerUnverifiedException: peer nicht authentifiziert bei com.Sonne.net.ssl.intern.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:352) bei org.apache.http.conn.ssl.AbstractVerifier.überprüfen Sie(AbstractVerifier.java:128) bei org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:390) bei org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148) bei org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149) bei org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121) bei org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:561) bei org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415) bei org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) bei org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) bei org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732) bei org.apache.camel.Komponente.http4.HttpProducer.executeMethod(HttpProducer.java:187) bei org.apache.camel.Komponente.http4.HttpProducer.Prozess(HttpProducer.java:101) bei org.apache.camel.impl.converter.AsyncProcessorTypeConverter$ProcessorToAsyncProcessorBridge.process(AsyncProcessorTypeConverter.java:50) bei org.apache.camel.util.AsyncProcessorHelper.Prozess(AsyncProcessorHelper.java:77) bei org.apache.camel.Prozessor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:104) bei org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:272) bei org.apache.camel.Prozessor.SendProcessor.Prozess(SendProcessor.java:98) bei org.apache.camel.util.AsyncProcessorHelper.Prozess(AsyncProcessorHelper.java:77) bei org.apache.camel.Prozessor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98) bei org.apache.camel.Prozessor.DelegateAsyncProcessor.Prozess(DelegateAsyncProcessor.java:89) bei org.apache.camel.Prozessor.interceptor.TraceInterceptor.Prozess(TraceInterceptor.java:99) bei org.apache.camel.util.AsyncProcessorHelper.Prozess(AsyncProcessorHelper.java:77) bei org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:299) bei org.apache.camel.Prozessor.RedeliveryErrorHandler.Prozess(RedeliveryErrorHandler.java:208) bei org.apache.camel.Prozessor.DefaultChannel.Prozess(DefaultChannel.java:269) bei org.apache.camel.Prozessor.UnitOfWorkProcessor.Prozess(UnitOfWorkProcessor.java:109) bei org.apache.camel.util.AsyncProcessorHelper.Prozess(AsyncProcessorHelper.java:77) bei org.apache.camel.Prozessor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98) bei org.apache.camel.Prozessor.DelegateAsyncProcessor.Prozess(DelegateAsyncProcessor.java:89) bei org.apache.camel.management.InstrumentationProcessor.Prozess(InstrumentationProcessor.java:68) bei org.apache.camel.Komponente.jetty.CamelContinuationServlet.service(CamelContinuationServlet.java:109) bei javax.- servlet.http.HttpServlet.service(HttpServlet.java:820) bei org.eclipse.jetty.- servlet.ServletHolder.Griff(ServletHolder.java:534) bei org.eclipse.jetty.- servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1351) bei org.eclipse.jetty.servlets.MultiPartFilter.doFilter(MultiPartFilter.java:97) bei org.apache.camel.Komponente.jetty.CamelMultipartFilter.doFilter(CamelMultipartFilter.java:41) bei org.eclipse.jetty.- servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1322) bei org.eclipse.jetty.- servlet.ServletHandler.doHandle(ServletHandler.java:473) bei org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:929) bei org.eclipse.jetty.- servlet.ServletHandler.doScope(ServletHandler.java:403) bei org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:864) bei org.eclipse.jetty.server.handler.ScopedHandler.Griff(ScopedHandler.java:117) bei org.eclipse.jetty.server.handler.HandlerWrapper.Griff(HandlerWrapper.java:114) bei org.eclipse.jetty.server.Server.Griff(auf dem Server.java:352) bei org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:596) bei org.eclipse.jetty.server.HttpConnection$RequestHandler.Inhalt(HttpConnection.java:1068) bei org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:805) bei org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:218) bei org.eclipse.jetty.server.HttpConnection.Griff(HttpConnection.java:426) bei org.eclipse.jetty.io.nio.SelectChannelEndPoint.Griff(SelectChannelEndPoint.java:508) bei org.eclipse.jetty.io.nio.SelectChannelEndPoint.access$000(SelectChannelEndPoint.java:34) bei org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:40) bei org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:451) bei java.lang.Thread.run(Thread.java:662)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok funktioniert jetzt, wie es sich herausstellte, hatte ich ein grundlegendes Missverständnis der Endpunkte und Protokolle in Camel. Ich hätte das registrieren eines Systems mit dem die https4 Protokoll und Einstellung meiner SSLSocketFactory/SSLContext auf Sie. Da War es in der Registrierung ein Programm mit https-es wurde nie über das Http4-Komponente.
Hier ist meine funktionierende Lösung mit 2 Einschränkungen.
Warum kann ich nicht den pass in einer SchemeRegistry der ThreadSafeClientConnManager und es wird nicht verwendet bei der Konstruktion der HttpClient? Ich habe die HttpClientConfigurer statt
Steg hat ein Problem, bei dem die Keystore-und Truststore-muss eingestellt werden, durch den Pfad auf dem SslSelectChannelConnector statt über SSLContext (Fehler in mindestens Steg 7.2.2 und 7.4.0 ->neueste)
Code:
Bekam ich auf Arbeit einen ssl-proxy mit dem folgenden code
Die route
Konfiguration für jetty (bieten, ein Zertifikat, wenn wir als server fungiert)
Konfiguration für https4 (was-Zertifikat Unterzeichner Vertrauen wir wenn er als client)
}
Dinge erwähnenswert
https4
nichthttp4
-Djavax.net.debug=ssl
in der Befehlszeile bereitgestellt viele hilfreiche ProtokollierungSieht aus wie du bist, die Probleme mit 'unsichere ssl-Neuverhandlung'. Bitte stellen Sie sicher, dass Sie über die neueste JDK/JRE (mindestens 1.6.0_24).
https4
incontext.getComponent("https4",HttpComponent.class);
, nicht http4 (da ich ihn für mehrere Stunden sinnlos...)