微信小程序域名+https的使用
前言
有开发过微信小程序的园友们应该都知道,微信小程序生产版本的前端对后端调用时,必须是用https+域名的方式调用(测试版本不受此限制),而且必须用默认端口不能手动指定端口,否则微信会给拦截下来无法调用。前段时间博主走了一遍这样的流程,特此记录下在此过程中遇到的坑,希望后面再有人遇到能躲避过去。
正文
首先是域名申请。使用的云服务器、申请域名和申请SSL证书要尽量在同一家服务商(尤其是域名和SSL证书的申请),因为服务商们为了提高用户粘性,会给本家的服务提供便捷的处理方式。比如博主用的是阿里云的服务器,就在阿里云申请的域名和SSL证书,你要是用的腾讯云,在腾讯云上申请就好了。
域名申请后需要实名认证、配置ip的解析。做完这些之后如果你用域名访问服务器的接口,会提示连接被重置。为什么呢?因为还需要备案,在国内未备案的域名是不会调到对应IP的。备案还是在申请域名的地方申请,一般需要走两个流程,一个是阿里云这边的处理流程,一个是工信部的处理流程。前者一般一两天就好了,后者大约需要十天半个月的时间。等备案完成之后,你才能用域名访问到对应IP的后台。
其次是SSL证书申请。同样在对应的服务平台申请,这时如果证书与域名是在同一个平台申请的,直接点点点就好了。证书审批比较快,一般几分钟就好了。
最后是证书安装。证书可下载之后,将tomcat对应的证书下载下来。解压之后有两个文件,一个pfx后缀的,一个存放密码的txt文件。yaml文件这样配置:
1 server: 2 port: 443 3 tomcat: 4 uri-encoding: UTF-8 5 max-http-form-post-size: 0 6 7 ssl: 8 key-store: xxoo.pfx 9 key-store-password: yyy 10 key-store-type: PKCS12
暴露https的默认端口443(注意云服务器上也要放开该端口的访问权限),key-store是对应pfx文件,下面password是密码,type固定如图所填。注意key-store后面没用classpath,因为博主将pfx文件放在了jar包所在的目录下,与jar包同级。
yaml文件配置完之后还要配置tomcat,springboot的tomcat可以直接用注解+代码的方式来配置,如下所示:
1 @Bean 2 public ConfigurableServletWebServerFactory webServerFactory() { 3 TomcatServletWebServerFactory tomcatFactory = new TomcatServletWebServerFactory(); tomcatFactory.setProtocol("org.apache.coyote.http11.Http11NioProtocol"); 4 tomcatFactory.addConnectorCustomizers(new TomcatConnectorCustomizer() { 5 @Override 6 public void customize(Connector connector) { 7 Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler(); 8 connector.setPort(443); 9 connector.setScheme("https"); 10 connector.setEnableLookups(false); 11 connector.setProperty("acceptCount", "2000"); 12 connector.setURIEncoding("UTF-8"); 13 connector.setMaxPostSize(-1); 14 connector.setMaxSavePostSize(-1); 15 16 protocol.setProperty("bufferPoolSize", "-1"); 17 protocol.setMaxConnections(2500); 18 protocol.setConnectionTimeout(60000); 19 protocol.setDisableUploadTimeout(true); 20 protocol.setCompression("on"); 21 protocol.setCompressionMinSize(860); 22 protocol.setNoCompressionUserAgents("gozilla, traviata"); 23 protocol.setMaxThreads(500); 24 protocol.setSSLEnabled(true); 25 protocol.setSecure(true); 26 protocol.setCiphers("TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"); // *** 27 protocol.setMinSpareThreads(25); 28 protocol.setKeepAliveTimeout(3000); 29 protocol.setMaxKeepAliveRequests(100000000); 30 } 31 }); 32 Connector connector2 = new Connector("org.apache.coyote.http11.Http11NioProtocol"); 33 Http11NioProtocol protocol = (Http11NioProtocol) connector2.getProtocolHandler(); 34 connector2.setPort(httpPort); 35 connector2.setEnableLookups(false); 36 connector2.setProperty("acceptCount", "2000"); 37 connector2.setURIEncoding("UTF-8"); 38 connector2.setMaxPostSize(-1); 39 connector2.setMaxSavePostSize(-1); 40 41 protocol.setProperty("bufferPoolSize", "-1"); 42 protocol.setMaxConnections(2500); 43 protocol.setConnectionTimeout(60000); 44 protocol.setDisableUploadTimeout(true); 45 protocol.setCompression("on"); 46 protocol.setCompressionMinSize(860); 47 protocol.setNoCompressionUserAgents("gozilla, traviata"); 48 protocol.setMaxThreads(500); 49 protocol.setMinSpareThreads(25); 50 protocol.setKeepAliveTimeout(3000); 51 protocol.setMaxKeepAliveRequests(100000000); 52 tomcatFactory.addAdditionalTomcatConnectors(connector2); 53 return tomcatFactory; 54 }
因为博主的服务同时暴露了两个端口,所以配置了两个connector。其中第26行是比较关键的,如果未设置的话,访问时浏览器会提示【ERR_SSL_VERSION_OR_CIPHER_MISMATCH】。
如此,大功告成。