前言:java
個人後端項目是Java寫的,用的Springboot框架。在部署服務器並配置https訪問過程當中,由於作了一些使人窒息的操做(過後發現),因此總是不能成功。web
不成功具體點說就是:域名地址能夠正常訪問(http/https都可),而部署在服務器上的API仍然只能經過http訪問,經過https訪問會顯示不安全鏈接!spring
經過提交工單,獲得阿里雲工做人員的幫助,他們給出了答案:shell
而後我想,我好像知道是咋回事了呢。apache
1. Springboot框架是內嵌有tomcat的!!我只是把項目打成Jar包放到了我配置在服務器上的tomcat的webapps下,而後手動經過命令來運行程序。因此我用的仍是內嵌的tomcat。後端
2. 我從阿里雲上下載的SSL證書直接配置在服務器的tomcat上,因此它天然而然就跟我寫的接口沒啥關係了。瀏覽器
先思考一個問題:到底準備用Springboot內嵌的tomcat仍是用服務器上的外部tomcat?tomcat
因此我無外乎兩條路走:安全
1. 內嵌tomcat:在Springboot項目中直接配置SSL證書,使其能夠經過https被訪問;項目依然以Jar形式在服務器被運行。springboot
2. 外部tomcat:剔除Springboot項目中的內嵌tomcat,修改項目相關配置,將其打成War包放到服務器的tomcat下加載運行。
前提:
參考文章:部署到阿里雲,配置https,springboot項目同時支持http和https請求,阿里雲配置https
1. 將在阿里雲下載好的SSL證書文件(.pfx格式)和密碼文件,先放到src/main/resource文件夾下,再在項目下application.properties文件中配置證書信息。
2. 在Springboot啓動程序中修改增長一些信息,以下:
1 import org.apache.catalina.Context; 2 import org.apache.catalina.connector.Connector; 3 import org.apache.coyote.http11.Http11NioProtocol; 4 import org.apache.tomcat.jni.File; 5 import org.apache.tomcat.util.descriptor.web.SecurityCollection; 6 import org.apache.tomcat.util.descriptor.web.SecurityConstraint; 7 import org.springframework.boot.SpringApplication; 8 import org.springframework.boot.autoconfigure.SpringBootApplication; 9 import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer; 10 import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; 11 import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory; 12 import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; 13 import org.springframework.context.annotation.Bean; 14 import org.springframework.core.io.ClassPathResource; 15 16 @SpringBootApplication 17 public class HappyseatApplication implements EmbeddedServletContainerCustomizer { 18 19 public static void main(String[] args) { 20 SpringApplication.run(HappyseatApplication.class, args); 21 } 22 23 // 根據spring boot 1.5.X如下版本,添加這個!注意,版本不一樣添加的不同↓↓↓↓ 24 @Bean 25 //攔截全部請求 26 public EmbeddedServletContainerFactory servletContainer() { 27 TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(); 28 tomcat.addAdditionalTomcatConnectors(httpConnector()); // 添加http 29 return tomcat; 30 } 31 // 根據spring boot 1.5.X如下版本,添加這個!注意,版本不一樣添加此方法有所不一樣 ↑↑↑↑ 32 33 //配置http轉https 34 @Bean 35 public Connector httpConnector() { 36 Connector connector = new Connector(TomcatEmbeddedServletContainerFactory.DEFAULT_PROTOCOL); 37 connector.setScheme("http"); 38 //Connector監聽的http的端口號 39 connector.setPort(80); 40 connector.setSecure(false); 41 //監聽到http的端口號後轉向到的https的端口號 42 connector.setRedirectPort(443); 43 return connector; 44 } 45 46 //這裏設置默認端口爲443,即https的,若是這裏不設置,會https和http爭奪80端口 47 @Override 48 public void customize(ConfigurableEmbeddedServletContainer container) { 49 container.setPort(443); 50 } 51 52 53 }
3. 直接用 eclipse生成Jar包😀
4. 上傳服務器:將Jar包和證書文件傳到新建的/home/myapp目錄下,如圖:(ps:使用rz工具包能夠傳本地文件到服務器上,但須要在本地的遠程鏈接工具中使用纔可行)
5. 啓動程序!使用命令 nohup java -jar happyseat.jar >runlog.txt 2>&1 & 啓動程序,加上nohup是爲了讓程序在shell窗口關閉後依舊運行在後臺。
6. 使用命令 netstat -atunlp 查看有關接口狀況:發現剛剛啓動的程序中止了,而443端口在運行的進程也不是剛剛啓動獲得的進程號。
7. 查看日誌也能夠發現是說443端口已經被佔用了,因此我就直接 kill 1907 ,再從新啓動了個人程序。正常加載運行了~
8. 接下來在瀏覽器中測試 https + 域名 + /hello,發現成功啦!
9. 不過我很憂桑地發現,訪問域名不能正常加載以前的頁面了。。。由於以前的域名對應的網站是WordPress裏的網站信息,我試着登網站也登不上了。
而後我嘗試把我本身程序的端口改了,443端口也沒有被佔用,但是仍是不行orz...tomcat日誌裏仍是Address already in use.多是配置文件出毛病了,回頭再試試吧。。
後續:修改了訪問接口的端口號,在項目文件中,第二步的配置信息都刪了(( ╯□╰ ))。而後重啓服務器後Wordpress站點和接口均可以了。
我特地看了一下端口對應的進程狀況,正常的時候443端口和80端口是有httpd服務在運行,因此仍是建議換端口哦(⊙o⊙)。
(大前提:服務器上安裝了項目對應的tomcat版本喏!
按照網上不少方案試過,暫時還沒成功,成功了更。。