前言
有開發過微信小程序的園友們應該都知道,微信小程序生產版本的前端對后端調用時,必須是用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】。
如此,大功告成。