背景:
根据苹果 APPSTORE 于 2017年1月1日起 启用ATS 协议的要求(即客户端和服务器的HTTP 请求 需要启用SSL连接)需要尽快将我们 服务端的HTTP 转换成HTTPS,详见
版本要求: 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加密算法
由于我们使用的是内置的Tomcat,改造过程其实和外置Tomcat有类似点,但也有差别:差别之处。在application.properties中加些参数:
server.ssl.key-store=inner.pfx
server.ssl.key-store-password=12345678987654321
server.ssl.keyStoreType=PKCS12
重启应用,应用就支持HTTPS了。
在内网调试过程中,https只要证书和密码对的上就行,只要通信能成功就可以了,不用介意红叉的问题,外置Tomcat的改造和Nginx的改造请参照阿里云的文档,不赘述。