背景:
根据苹果 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加密算法
改造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的改造请参照阿里云的文档,不赘述。