自簽證書(shū)
-
win+r cmd

-
生成自己jks文件,指向自己要生成jks的文件位置下,我直接生成到項(xiàng)目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.生成證書(shū)
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
成功生成證書(shū)

項(xiàng)目運(yùn)行
將jks文件考入項(xiàng)目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證書(shū)加載
這里我就只上關(guān)鍵代碼了
@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請(qǐng)求
ch.pipeline().addLast("http-chunked", new ChunkedWriteHandler()); // 方便大文件傳輸,不過(guò)實(shí)質(zhì)上都是短的文本數(shù)據(jù)
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。

錯(cuò)誤原因
這并不是程序的問(wèn)題,這是證書(shū)本身的問(wèn)題,主機(jī)并不承認(rèn)這個(gè)證書(shū)導(dǎo)致的。

對(duì)證書(shū)添加信任
-
打開(kāi)證書(shū)

-
計(jì)算機(jī)添加信任
點(diǎn)擊安裝證書(shū) - 選擇本地計(jì)算機(jī) - 將所有的證書(shū)都放入下列存儲(chǔ) - 受信任的根證書(shū)頒發(fā)機(jī)構(gòu)

添加完成后就不會(huì)有不信任了。

-
導(dǎo)入證書(shū)到信任庫(kù)中
keytool -import -alias server -keystore mycacert -file D:\code\my_code\netty-demo-m\src\main\resources\mystore.cer -storepass 1234567

在java bin 目錄下會(huì)出現(xiàn)

再次運(yùn)行文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-781335.html

注意
值得一提的是,自簽的證書(shū)有且之能在本機(jī)使用,如將A機(jī)生成的證書(shū)拷貝B機(jī)使用也會(huì)出現(xiàn)同樣的錯(cuò)誤。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-781335.html
到了這里,關(guān)于netty整合websocket支持自簽證書(shū)出現(xiàn)netty websocket ssl Received fatal alert: certificate_unknown的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!