我是靠谱客的博主 虚幻西装,最近开发中收集的这篇文章主要介绍netty整合websocket支持自签证书出现netty websocket ssl Received fatal alert: certificate_unknown,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

自签证书

  1. win+r cmd

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

#换成自己的本地ip
keytool -genkey -alias server -keyalg RSA -validity 3650 -keystore D:codemy_codenetty-demo-msrcmainresourcesmystore.jks -ext san=ip:192.168.3.7,ip:127.0.0.1,dns:localhost -storepass 1234567

keytool -list -keystore  mystore.jks -v  //查看信息
  1. 生成证书

keytool  -alias server -exportcert  -keystore D:codemy_codenetty-demo-msrcmainresourcesmystore.jks -file D:codemy_codenetty-demo-msrcmainresourcesmystore.cer -storepass 1234567

成功生成证书

项目运行

将jks文件考入项目resources下

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){ //true
                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()); // HTTP编码解码器
        ch.pipeline().addLast("aggregator", new HttpObjectAggregator(65536)); // 把HTTP头、HTTP体拼成完整的HTTP请求
        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");
        //加载keytool 生成的文件
        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。

错误原因

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

对证书添加信任

  1. 打开证书

  1. 计算机添加信任

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

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

  1. 导入证书到信任库中

keytool -import -alias server -keystore mycacert -file D:codemy_codenetty-demo-msrcmainresourcesmystore.cer -storepass changeit

在java bin 目录下会出现

再次运行

注意

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

最后

以上就是虚幻西装为你收集整理的netty整合websocket支持自签证书出现netty websocket ssl Received fatal alert: certificate_unknown的全部内容,希望文章能够帮你解决netty整合websocket支持自签证书出现netty websocket ssl Received fatal alert: certificate_unknown所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部