赞
踩
win+r cmd
生成自己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
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
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下
-
- server:
- port: 8080
- ssl:
- key-store: classpath:mystore.jks
- key-store-password: 1234567
- key-store-type: JKS
- # key-alias: server
- enabled: true
这里我就只上关键代码了
-
- @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。
这并不是程序的问题,这是证书本身的问题,主机并不承认这个证书导致的。
打开证书
计算机添加信任
点击安装证书 - 选择本地计算机 - 将所有的证书都放入下列存储 - 受信任的根证书颁发机构
添加完成后就不会有不信任了。
导入证书到信任库中
<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机使用也会出现同样的错误。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。