当前位置:   article > 正文

netty整合websocket支持自签证书出现netty websocket ssl Received fatal alert: certificate_unknown_alert certificate unknown

alert certificate unknown

自签证书

  1. win+r cmd

  1. 生成自己jks文件,指向自己要生成jks的文件位置下,我直接生成到项目resources下

  1. #换成自己的本地ip
  2. 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

keytool -list -keystore  mystore.jks -v  //查看信息

2.生成证书

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
3.迁移到行业标志
keytool -importkeystore -srckeystore D:\code\my_code\netty-demo-m\src\main\resources\mystore.jks -destkeystore D:\code\my_code\netty-demo-m\src\main\resources\mystore.jks -deststoretype pkcs12

成功生成证书

项目运行

将jks文件考入项目resources下

yaml配置:

  1. server:
  2. port: 8080
  3. ssl:
  4. key-store: classpath:mystore.jks
  5. key-store-password: 1234567
  6. key-store-type: JKS
  7. # key-alias: server
  8. enabled: true

netty证书加载

这里我就只上关键代码了

  1. @Override
  2. protected void initChannel(SocketChannel ch) throws Exception {
  3. if (openssl){ //true
  4. SSLEngine sslEngine = getServerSslContext().createSSLEngine();
  5. sslEngine.setNeedClientAuth(false);
  6. sslEngine.setUseClientMode(false);
  7. SslHandler sslHandler = new SslHandler(sslEngine);
  8. ch.pipeline().addLast(sslHandler);
  9. }
  10. ch.pipeline().addLast("http-codec", new HttpServerCodec()); // HTTP编码解码器
  11. ch.pipeline().addLast("aggregator", new HttpObjectAggregator(65536)); // 把HTTP头、HTTP体拼成完整的HTTP请求
  12. ch.pipeline().addLast("http-chunked", new ChunkedWriteHandler()); // 方便大文件传输,不过实质上都是短的文本数据
  13. ch.pipeline().addLast("websocket-handler",webSocketServerHandler);
  14. ch.pipeline().addLast("http-handler",websocketNettyRequestHandler);
  15. }
  16. public SSLContext getServerSslContext() throws Exception {
  17. DefaultResourceLoader resourceLoader = new DefaultResourceLoader();
  18. org.springframework.core.io.Resource resource = resourceLoader.getResource("classpath:mystore.jks");
  19. InputStream inputStream = resource.getInputStream();
  20. log.info("加载了密码: {}", sslPassword);
  21. char[] passArray = sslPassword.toCharArray();
  22. SSLContext sslContext = SSLContext.getInstance("SSLv3");
  23. KeyStore ks = KeyStore.getInstance("JKS");
  24. //加载keytool 生成的文件
  25. ks.load(inputStream, passArray);
  26. KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
  27. kmf.init(ks, passArray);
  28. sslContext.init(kmf.getKeyManagers(), null, null);
  29. inputStream.close();
  30. return sslContext;
  31. }

不添加信任netty websocket ssl Received fatal alert: certificate_unknown。

错误原因

这并不是程序的问题,这是证书本身的问题,主机并不承认这个证书导致的。

对证书添加信任

  1. 打开证书

  1. 计算机添加信任

点击安装证书 - 选择本地计算机 - 将所有的证书都放入下列存储 - 受信任的根证书颁发机构

添加完成后就不会有不信任了。

  1. 导入证书到信任库中


<code class="language-plaintext hljs">keytool -import -alias server -keystore mycacert -file D:\code\my_code\netty-demo-m\src\main\resources\mystore.cer -storepass 1234567</code>

在java bin 目录下会出现

再次运行

注意

值得一提的是,自签的证书有且之能在本机使用,如将A机生成的证书拷贝B机使用也会出现同样的错误。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/987984
推荐阅读
相关标签
  

闽ICP备14008679号