在使用netty的时候,经常需要对通信进行SSL加密,这就需要相关的证书和秘钥;
当我们在自己的开发环境中进行测试的时候,有一个非常简单的方法来创建证书和私钥文件,netty提供了SelfSignedCertificate类。
SelfSignedCertificate ssc = new SelfSignedCertificate();
只需要这样一行代码,Netty就会帮我们自动生成自签名的证书和私钥。
生成的证书和私钥文件在Windows下的Temp目录:
C:\Users\xxx\AppData\Local\Temp
文件名前缀为:keyutil_example.com_
一般为:
C:\Users\xxx\AppData\Local\Temp\keyutil_example.com_13784598500529759262.crt
C:\Users\xxx\AppData\Local\Temp\keyutil_example.com_9168231614251199235.key
PS: 自动生成的证书和私钥会在程序结束后自动删除,当然也可以调用ssc.delete()进行手动删除。
下面记录下,使用SelfSignedCertificate的过程中的一些问题:
1. 代码执行过程中,报错:
Exception in thread "main" java.security.cert.CertificateException: No provider succeeded to generate a self-signed certificate. See debug log for the root cause.
at io.netty.handler.ssl.util.SelfSignedCertificate.<init>(SelfSignedCertificate.java:157)
at io.netty.handler.ssl.util.SelfSignedCertificate.<init>(SelfSignedCertificate.java:110)
at io.netty.handler.ssl.util.SelfSignedCertificate.<init>(SelfSignedCertificate.java:88)
at io.netty.handler.ssl.util.SelfSignedCertificate.<init>(SelfSignedCertificate.java:79)
at com.freddy.netty.n12_securechat.SecureChatServer.main(SecureChatServer.java:25)
Caused by: java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider
at io.netty.handler.ssl.util.SelfSignedCertificate.<init>(SelfSignedCertificate.java:154)
... 4 more
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.BouncyCastleProvider
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
... 5 more
SelfSignedCertificate会自动将证书文件和私钥文件生成在系统的temp文件夹中,所以这个类在生产环境中是不推荐使用的。默认情况下该类会使用OpenJDK's X.509来生成证书的私钥,如果不可以,则使用 Bouncy Castle作为替代。
解决:添加boucycastle的依赖
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.68</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.68</version>
</dependency>
参考:
RocketMQ 初次尝试受挫篇【ssl错误】_rocketmq failed to create sslcontext for server-CSDN博客