Windows下使用netty的SelfSignedCertificate进行SSL加密通信
在使用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.(SelfSignedCertificate.java:157)
at io.netty.handler.ssl.util.SelfSignedCertificate.(SelfSignedCertificate.java:110)
at io.netty.handler.ssl.util.SelfSignedCertificate.(SelfSignedCertificate.java:88)
at io.netty.handler.ssl.util.SelfSignedCertificate.(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.(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的依赖
org.bouncycastle
bcprov-jdk15on
1.68
org.bouncycastle
bcpkix-jdk15on
1.68
参考:
RocketMQ 初次尝试受挫篇【ssl错误】_rocketmq failed to create sslcontext for server-CSDN博客
java.io.tmpdir_${java.io.tmpdir}-CSDN博客
【SM2证书】利用BC的X509v3CertificateBuilder组装X509国密证书-CSDN博客