2015-10-24 1 views
10

Ich habe einige web crawler basierend auf netty (4.1b7), wo ich massiv fordere verschiedene seiten http und https ein und ich versuche netty client zu umgehen mit https sites mit verschiedenen Authentifizierungseinstellungen.netty 4 client ssl konfiguration um alle https sites zu beantragen

Wenn ich eine einfache netty Konfiguration w/o eigene Zertifikate:

SslContext sslCtx = SslContextBuilder.forClient().build(); 

      SSLEngine sslEngine = sslCtx.newEngine(ch.alloc(), host, port); 
      p.addLast("ssl", new SslHandler(sslEngine)); 

ca. die Hälfte der https-Sites werden gebeten, in Ordnung, aber andere gescheitert wie:

Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem 
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1728) 
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:304) 
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296) 
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1506) 
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) 
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979) 
at sun.security.ssl.Handshaker$1.run(Handshaker.java:919) 
at sun.security.ssl.Handshaker$1.run(Handshaker.java:916) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.security.ssl.Handshaker$DelegatedTask.run(Handshaker.java:1369) 
at io.netty.handler.ssl.SslHandler.runDelegatedTasks(SslHandler.java:1164) 
at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1067) 
... 19 moreCaused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387) 
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) 
at sun.security.validator.Validator.validate(Validator.java:260) 
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) 
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:281) 
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:136) 
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1493) 
... 27 more Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:146) 
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131) 
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) 
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382) 
... 33 more 

oder:

Caused by: javax.net.ssl.SSLException: Received fatal alert: handshake_failure 
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208) 
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1666) 
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1634) 
at sun.security.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1800) 
at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1083) 
at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:907) 
at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781) 
at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624) 
at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1138) 

Als ich versuchte, generate own local certificates und setzen Sie sie als:

System.setProperty("javax.net.ssl.trustStore", "/etc/ssl/my/cacerts.jks"); 
    System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); 
    System.setProperty("javax.net.ssl.keyStore", "/etc/ssl/my/keystore.jks"); 
    System.setProperty("javax.net.ssl.keyStorePassword", "changeit"); 

dann scheiterte alle https-Sites mit Fehlern wie:

Caused by: java.security.cert.CertificateException: found no certificates: /etc/ssl/my/cacerts.jks 
at io.netty.handler.ssl.PemReader.readCertificates(PemReader.java:83) ~[netty-all-4.1.0.Beta7.jar:4.1.0.Beta7] 
at io.netty.handler.ssl.SslContext.toX509Certificates(SslContext.java:967) 
.... 
Caused by: java.security.KeyException: found no private key: /etc/ssl/my/keystore.jks 
at io.netty.handler.ssl.PemReader.readPrivateKey(PemReader.java:99) ~[netty-all-4.1.0.Beta7.jar:4.1.0.Beta7] 
at io.netty.handler.ssl.SslContext.toPrivateKey(SslContext.java:923) 

Auch habe ich versucht, rät from that SO, aber ohne noch Glück.

Was ist falsch oder kann jemand irgendeine Art von Schritt für Schritt Anleitung für die Konfiguration Netty 4+ Client, um mit https Websites mit allen möglichen Auth-Einstellungen umgehen.

Antwort

5

Schließlich ich Problem gelöst durch Trustmanager in Code-Hacking (diese Technik auf SO gefunden):

TrustManager[] trustAllCerts = new TrustManager[]{ 
      new X509TrustManager() { 
       public X509Certificate[] getAcceptedIssuers() { 
        return new X509Certificate[0]; 
       } 

       public void checkClientTrusted(X509Certificate[] certs, String authType) { 
       } 

       public void checkServerTrusted(X509Certificate[] certs, String authType) { 
       } 
      }}; 

    // Ignore differences between given hostname and certificate hostname 
     SSLContext sc = SSLContext.getInstance("SSL"); 
     sc.init(null, trustAllCerts, new SecureRandom()); 
     HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
     HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true); 

... 
final SSLEngine sslEngine = sc.createSSLEngine(host, port); 
      sslEngine.setUseClientMode(true); 
      sslEngine.setNeedClientAuth(false); 

      p.addLast("ssl", new SslHandler(sslEngine)); 

Jetzt werden alle https-Seiten, die im Browser OK sind (Chrome zeigt keine Warnung), von Netty gelesen.

+0

Ich habe ein ähnliches Problem, wo ich ein clientseitige cert, äquivalent zu 'curl --cacert' Option verwenden muss. Wo sind die Pipeline 'p',' host' und 'port', die in Ihrem Code kommen - ohne diese ist der oben gezeigte Code nutzlos. –

1

versuchen, die sslCtx buidling wie folgt SslContext sslCtx = SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build();

und zu der Pipeline p.addLast(sslCtx.newHandler(ch.alloc()));

+0

es hat nicht geholfen, gleiche Fehler – yetanothercoder