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.pemPKCS#1,你需要将它转为PKCS#8
证书域名:lingkang.top

2、转为netty可加载证书

fullchain.pem可直接加载,privkey.pemPKCS#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

image-1715581667608
image-1715581696699

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/

image-1715582046118
证书情况:
image-1715582144053

不用域名访问时:
image-1715582334658

提示

1、我的netty程序是把请求转发到 https://1it.top 这个域名上

2、我window下开发需要将 127.0.0.1 lingkang.top 配置到hosts 文件下,让它域名解析到本地

image-1715582373934

最后,点个关注吧。我会更新很多好玩的java开发~