在使用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/BouncyCastleProviderat io.netty.handler.ssl.util.SelfSignedCertificate.<init>(SelfSignedCertificate.java:154)... 4 more
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.BouncyCastleProviderat 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博客
java.io.tmpdir_${java.io.tmpdir}-CSDN博客
【SM2证书】利用BC的X509v3CertificateBuilder组装X509国密证书-CSDN博客