微信小程序域名+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】。

如此,大功告成。

posted on 2021-01-10 10:11  淡墨痕  阅读(3143)  评论(0编辑  收藏  举报