背景:

1、因为私有云的迁移,需要使用新域名,所以SSL证书必然也进行替换。



2、证书我们从阿里云购买(阿里云的证书购买有个注意的地方,购买ov正式 审核基本半天,而dv估计要半个月+)。


3、因为中途接手项目,所以对原来的一些坑也不甚了解。


出现问题:

 https证书替换后没问题,但TCP和WSS 无法使用。




解决过程:

1、网上查找资料解决,发现千篇一律的都是自定义证书,并且大多实现方式采用jks类型证书,

如果采用这种方式,我们要改代码,要验证,风险比较大,放弃。

2、查找netty 官网,找到如下文章:http://netty.io/wiki/sslcontextbuilder-and-private-key.html  


3、然后用上面方法替换证书,问题解决,这里有两点要注意,容易踩坑:


 (1)阿里云下载的证书有好几类,包括 nginx,apache、iis 、其他等。

针对TCP和WSS,我们选其他,然后选择前两个文件 xxx.key和xxx.pem。

 (2)文档上的示例会误导,原文内容如下:

  

For example to convert a non-encrypted PKCS1 key to PKCS8 you would use:

openssl pkcs8 -topk8 -nocrypt -in pkcs1_key_file -out pkcs8_key.pem


这里out的文件命名为.pem结尾,会让我们误以为转化的是pem文件,其实应该是 key文件。






另外证书使用方法如下:

工具类:

public class SslContextHelper {
  public static SslContext getSslContext(Environment environment)
      throws SSLException, CertificateException {
    final SslContext sslCtx;
    final File certFile = new File( "/root/cert/cert.pem");
    final File keyFile = new File( "/root/cert/key.key");
    sslCtx = SslContextBuilder.forServer(certFile, keyFile).build();
    return sslCtx;
  }
}


启动WSS示例:

final SslContext sslCtx = getSslContext(env);

.....

EventLoopGroup workGroup = new NioEventLoopGroup();

ServerBootstrap b = new ServerBootstrap();
b.group(workGroup)
    .channel(NioServerSocketChannel.class)
    .handler(new LoggingHandler(LogLevel.INFO))
    .childHandler(
        new ChannelInitializer() {
          @Override
          protected void initChannel(Channel ch) throws Exception {
            ChannelPipeline pipeline = ch.pipeline();
            //这里使用证书的设置
            pipeline.addLast(sslCtx.newHandler(ch.alloc()));
            pipeline.addLast(new HttpServerCodec());
            pipeline.addLast(new HttpObjectAggregator(64 * 1024));
            pipeline.addLast(new WebSocketServerProtocolHandler(filterWSUri));
            pipeline.addLast(
                "idleStateHandler",
                new IdleStateHandler(readIdleTimeout, writeIdleTimeout, idleTimeout));
            pipeline.addLast(
                new NoLoginDisconnectHandler(5, TimeUnit.MINUTES, terminalContextService));
            pipeline.addLast(new HexStringForTextWebSocketFrameDecoder());
            pipeline.addLast(new HexStringForTextWebSocketFrameEncoder());
            pipeline.addLast(new BinaryFrameDecoder(256));
            pipeline.addLast(new ByteArrayEncoder());
            pipeline.addLast(new SampleCellularLongConnectNettyHandler(callback));
          }
        });

ChannelFuture f = b.bind(port).syncUninterruptibly();

log.info("wss server start success!");

f.channel().closeFuture().syncUninterruptibly();




本文版权归作者,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。