2015-10-24 12 views
10

Tôi có một số trình thu thập dữ liệu web dựa trên netty (4.1b7), nơi tôi ồ ạt yêu cầu các trang web khác nhau cả http và https và tôi đang cố gắng để cấu hình khách hàng netty để đối phó với các trang web https với các cài đặt xác thực khác nhau.netty 4 client ssl cấu hình để yêu cầu tất cả các trang web https

Khi tôi có một cấu hình Netty đơn giản w/o chứng chỉ riêng:

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

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

Khoảng một nửa trong số các trang web https được yêu cầu OK nhưng những người khác thất bại như:

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 

hay:

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) 

Khi tôi cố gắng generate own local certificates và đặt chúng làm:

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"); 

sau đó tất cả các trang web https thất bại với lỗi như:

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) 

Ngoài ra tôi đã cố gắng khuyên from that SO, nhưng không có may mắn được nêu ra.

Có gì không ổn hoặc ai cũng có thể cung cấp một số hướng dẫn từng bước để định cấu hình máy khách 4+ netty để xử lý các trang web https với tất cả các cài đặt xác thực có thể có.

Trả lời

5

Cuối cùng tôi giải quyết vấn đề bằng cách hack TrustManager trong mã (tìm thấy kỹ thuật này trên SO):

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)); 

Bây giờ tất cả các trang web https được OK trong trình duyệt (chrome không hiển thị cảnh báo ít nhất) - được đọc bởi Netty.

+0

Tôi có một vấn đề tương tự khi tôi cần phải sử dụng một cert phía khách hàng, tương đương với tùy chọn 'curl --cacert'. Đường ống 'p',' host' và 'port' đến từ đâu trong mã của bạn - không có mã, ở trên là vô dụng. –

1

thử buidling các sslCtx như sau SslContext sslCtx = SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build();

Và thêm vào các đường ống dẫn p.addLast(sslCtx.newHandler(ch.alloc()));

+0

nó không giúp ích, cùng một lỗi – yetanothercoder

Các vấn đề liên quan