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

如此,大功告成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章