netty配置SSL、netty配置https(生产环境)
上一篇提到了如何在开发环境使用SSL:https://lingkang.top/archives/netty-pei-zhi-ssl
转自:https://lingkang.top/archives/netty-pei-zhi-https
那么netty如何使用可信任的证书呢?分以下步骤:
- 1、可靠机构颁发正规证书
- 2、正规证书转换为netty可加载的证书
- 3、netty加载证书处理channel初始化
1、搞一个证书
需要的证书有那些要求?
证书 | 格式 |
---|---|
公钥 | PEM格式的X.509证书链文件 |
私钥 | PKCS#8 |
假设你从不知名机构(阿里云、腾讯、华为云、Let’s Encrypt等)搞了个证书:
# 从nginx中搞来的
ssl_certificate /www/sites/lingkang.top/ssl/fullchain.pem;
ssl_certificate_key /www/sites/lingkang.top/ssl/privkey.pem;
其中nginx使用的privkey.pem
是PKCS#1
,你需要将它转为PKCS#8
证书域名:lingkang.top
2、转为netty可加载证书
fullchain.pem
可直接加载,privkey.pem
是PKCS#1
需要转换为PKCS#8
需要用到工具 openssl
- 任意找一台Linux服务器,它通常自带了
openssl
- window下直接使用 git 命令行
我这里就不用Linux了,用的是git命令行,相信经常开发的朋友都人手安装一个git了
执行命令将PKCS#1
转为PKCS#8
:
openssl pkcs8 -topk8 -nocrypt -in privkey.pem -out privkey_pkcs8.pem
netty加载证书
代码如下:
/*** @author lingkang* Created by 2024/5/5*/
@Slf4j
public class ServerInitHandler extends ChannelInitializer<SocketChannel> {private final RouterConfig config;public ServerInitHandler(RouterConfig config) {this.config = config;}private static SslContext sslContext;static {SslContextBuilder forServer = SslContextBuilder.forServer(new File("C:\\Users\\Administrator\\Desktop\\temp\\key\\fullchain.pem"),new File("C:\\Users\\Administrator\\Desktop\\temp\\key\\privkey_pkcs8.pem"),null);try {// 你可以在构建之前手动配置信任、安全管理启sslContext = forServer.build();} catch (Exception e) {throw new RuntimeException("证书加载失败", e);}}@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();// ssl处理pipeline.addLast(sslContext.newHandler(ch.alloc()));pipeline.addLast(new HttpServerCodec());// http编解码pipeline.addLast(new FinalHttpObjectAggregator(config.getMaxContentLength()));pipeline.addLast(new DispatcherHandler(config));}
}
访问证书地址:https://lingkang.top:9595/
证书情况:
不用域名访问时:
提示
1、我的netty程序是把请求转发到 https://1it.top 这个域名上
2、我window下开发需要将
127.0.0.1 lingkang.top
配置到hosts
文件下,让它域名解析到本地
最后,点个关注吧。我会更新很多好玩的java开发~