netty偶发报错sun.security.validator.ValidatorException:PKIX path building failed:sun.security.provider.certpath.SunCertPathBuiledrExcepyion: unable to find valid certification path to requested target
时间: 2023-06-28 13:14:43 浏览: 188
这个报错是因为 SSL 证书验证失败导致的。Netty 提供了一个 SSL 客户端的实现,可以在客户端与服务端之间进行安全通信。但是,如果服务端的 SSL 证书没有被客户端信任,就会出现这个报错。
解决这个问题有两种方法:
1. 忽略证书验证:这种方法不够安全,但是可以用来临时解决问题。可以在客户端代码中添加以下代码,来忽略证书验证:
```java
SslContext sslCtx = SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build();
```
不过要注意,这种方法适用于测试环境和开发环境,不适用于生产环境。
2. 配置服务端 SSL 证书:这种方法更加安全,但是需要在客户端代码中配置服务端的 SSL 证书。可以使用以下代码:
```java
InputStream certInput = new FileInputStream("path/to/certificate.crt");
X509Certificate cert = (X509Certificate) CertificateFactory.getInstance("X.509").generateCertificate(certInput);
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null); // You don't need the KeyStore instance to come from a file.
keyStore.setCertificateEntry("cert_alias", cert);
trustManagerFactory.init(keyStore);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
SslContext sslCtx = SslContextBuilder.forClient().sslProvider(SslProvider.JDK).trustManager(trustManagerFactory).build();
```
其中,path/to/certificate.crt 是服务端 SSL 证书的路径。这种方法可以在生产环境中使用,但是需要保证客户端代码和服务端 SSL 证书的安全性。
阅读全文