netty配置SSL、netty配置https(生产环境)
上一篇提到了如何在开发环境使用SSL:https://lingkang.top/archives/netty-pei-zhi-ssl
那么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);
}
}
@Override
protected 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开发~