您的位置:首页 > 理论基础 > 计算机网络

如何让Embed Tomcat和Netty支持HTTPS

2016-12-16 11:49 330 查看
背景:

根据苹果 APPSTORE 于 2017年1月1日起 启用ATS 协议的要求(即客户端和服务器的HTTP 请求 需要启用SSL连接)需要尽快将我们 服务端的HTTP 转换成HTTPS,详见
【SSL证书】应对IOS安全策略升级,你准备好了吗?

版本要求: JDK:1.8

               Embed Tomcat 8.0.33 

               Netty  4.0.33

申请证书:目前是在阿里云上申请证书服务:->传送门<-,我选择的是Tomcat类型的PFX证书,我们需要获得的是ooxx.pfx证书,和一串数字的证书密码。

改造Netty:

把证书放到应用下,主要是对HttpServerPipelineFactory增加对SSL的处理:

public class HttpsServerPipelineFactory extends ChannelInitializer<Channel> {
@Override
protected void initChannel(Channel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
//=====================以下为为SSL处理新增的代码=================================
// Uncomment the following line if you want HTTPS
SSLContext sslcontext = SSLContext.getInstance("TLS");
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
KeyStore ks = KeyStore.getInstance("PKCS12");
String keyStorePath ="inner.pfx";
String keyPassword ="123456787654321";
ks.load(new FileInputStream(keyStorePath), keyPassword.toCharArray());
kmf.init(ks, keyPassword.toCharArray());
sslcontext.init(kmf.getKeyManagers(), null, null);
SSLEngine engine = sslcontext.createSSLEngine();
engine.setUseClientMode(false);
engine.setNeedClientAuth(false);
pipeline.addFirst("ssl", new SslHandler(engine));
//=====================以上为为SSL处理新增的代码=================================
pipeline.addLast("decoder", new HttpRequestDecoder(16 * 1024 * 1024, 8192, 8192));
pipeline.addLast("encoder", new HttpResponseEncoder());
pipeline.addLast("deflater", new HttpContentCompressor());
pipeline.addLast("handler", new HttpServerHandler());
}
}






从中我们可以看到,我们已按要求支持最新的TLSv1.2协议和ECDH加密算法

改造Embed Tomcat:

由于我们使用的是内置的Tomcat,改造过程其实和外置Tomcat有类似点,但也有差别:差别之处。在application.properties中加些参数:

server.ssl.key-store=inner.pfx
server.ssl.key-store-password=12345678987654321
server.ssl.keyStoreType=PKCS12


重启应用,应用就支持HTTPS了。

在内网调试过程中,https只要证书和密码对的上就行,只要通信能成功就可以了,不用介意红叉的问题,外置Tomcat的改造和Nginx的改造请参照阿里云的文档,不赘述。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: