自签证书
win+r cmd
![](https://img-blog.csdnimg.cn/img_convert/3baee4b8b079c5109196a8cff0e9e339.png)
生成自己jks文件,指向自己要生成jks的文件位置下,我直接生成到项目resources下
#换成自己的本地ip keytool -genkey -alias server -keyalg RSA -validity 3650 -keystore D:\code\my_code\netty-demo-m\src\main\resources\mystore.jks -ext san=ip:192.168.3.7,ip:127.0.0.1,dns:localhost -storepass 1234567
|
![](https://img-blog.csdnimg.cn/img_convert/d05ec243994a9201d9bea6a5d073b6df.png)
keytool -list -keystore mystore.jks -v //查看信息
生成证书
keytool -alias server -exportcert -keystore D:\code\my_code\netty-demo-m\src\main\resources\mystore.jks -file D:\code\my_code\netty-demo-m\src\main\resources\mystore.cer -storepass 1234567
|
![](https://img-blog.csdnimg.cn/img_convert/19ad09da62b9a1dfc97d19d8358cd5bc.png)
成功生成证书
![](https://img-blog.csdnimg.cn/img_convert/38ccafef3cea235d1131cd86bb229d4a.png)
项目运行
将jks文件考入项目resources下
![](https://img-blog.csdnimg.cn/img_convert/7f69a93212c77b058a766ae9dae906dd.png)
yaml配置:
server: port: 8080 ssl: key-store: classpath:mystore.jks key-store-password: 1234567 key-store-type: JKS # key-alias: server enabled: true
|
netty证书加载
这里我就只上关键代码了
@Override protected void initChannel(SocketChannel ch) throws Exception { if (openssl){ SSLEngine sslEngine = getServerSslContext().createSSLEngine(); sslEngine.setNeedClientAuth(false); sslEngine.setUseClientMode(false); SslHandler sslHandler = new SslHandler(sslEngine); ch.pipeline().addLast(sslHandler); } ch.pipeline().addLast("http-codec", new HttpServerCodec()); ch.pipeline().addLast("aggregator", new HttpObjectAggregator(65536)); ch.pipeline().addLast("http-chunked", new ChunkedWriteHandler()); ch.pipeline().addLast("websocket-handler",webSocketServerHandler); ch.pipeline().addLast("http-handler",websocketNettyRequestHandler); } public SSLContext getServerSslContext() throws Exception { DefaultResourceLoader resourceLoader = new DefaultResourceLoader(); org.springframework.core.io.Resource resource = resourceLoader.getResource("classpath:mystore.jks"); InputStream inputStream = resource.getInputStream(); log.info("加载了密码: {}", sslPassword); char[] passArray = sslPassword.toCharArray(); SSLContext sslContext = SSLContext.getInstance("SSLv3"); KeyStore ks = KeyStore.getInstance("JKS"); ks.load(inputStream, passArray); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(ks, passArray); sslContext.init(kmf.getKeyManagers(), null, null); inputStream.close(); return sslContext; }
|
不添加信任netty websocket ssl Received fatal alert: certificate_unknown。
![](https://img-blog.csdnimg.cn/img_convert/a8aaeea4c977e04fae5636c0d794109f.png)
错误原因
这并不是程序的问题,这是证书本身的问题,主机并不承认这个证书导致的。
![](https://img-blog.csdnimg.cn/img_convert/2d1ab8cfe4bb1bc585713c8805198189.png)
对证书添加信任
打开证书
![](https://img-blog.csdnimg.cn/img_convert/aeee6ed1f0fa3d8e4b906f68b9a3f232.png)
计算机添加信任
点击安装证书 - 选择本地计算机 - 将所有的证书都放入下列存储 - 受信任的根证书颁发机构
![](https://img-blog.csdnimg.cn/img_convert/ce27cec8054ff074541b167f6017bba8.png)
添加完成后就不会有不信任了。
![](https://img-blog.csdnimg.cn/img_convert/4fec8e96a34ff81c1a58d437d4559cd7.png)
导入证书到信任库中
keytool -import -alias server -keystore mycacert -file D:\code\my_code\netty-demo-m\src\main\resources\mystore.cer -storepass changeit
|
![](https://img-blog.csdnimg.cn/img_convert/b3f54fad1a0f05aef80fe49ed1f0a558.png)
在java bin 目录下会出现
![](https://img-blog.csdnimg.cn/img_convert/4bc000af58b31f234bcad9d7472833dd.png)
再次运行
![](https://img-blog.csdnimg.cn/img_convert/0900967055648e0655031e6f4d331412.png)
注意
值得一提的是,自签的证书有且之能在本机使用,如将A机生成的证书拷贝B机使用也会出现同样的错误。