Spring Boot中實現HTTPS for localhost
Spring Boot中實現HTTPS for localhost
當今時代,幾乎所有能訪問的網站都是受HTTPS保護的,使用HTTPS保護您的服務器也就意味着您無法從非HTTPS的服務器發送請求到此服務器。
這對使用本地開發環境的開發人員來說是一個問題,因為這些本地開發環境都是運行在http://localhost下的。
本文主要介紹在Spring Boot項目中,localhost如何實現HTTPS。
創建安全套接層(SSL)證書
SSL 證書就是遵守 SSL 安全套接層協議的服務器數字證書,由瀏覽器中“受信任的根證書頒發機構”在驗證服務器身份后頒發,具有網站身份驗證和加密傳輸雙重功能。可確保互聯網連接安全,保護兩個系統之間發送的任何敏感數據,防止網絡犯罪分子讀取和修改任何傳輸信息。
如果您能使用 https:// 來訪問某個網站,就表示此網站是部署了SSL證書。一般來講,如果此網站部署了SSL證書,則在需要加密的頁面會自動從 http:// 變為 https:// ,如果沒有變,你認為此頁面應該加密,您也可以嘗試直接手動在瀏覽器地址欄的http后面加上一個英文字母“ s ”后回車,如果能正常訪問並出現安全鎖,則表明此網站實際上是部署了SSL證書,只是此頁面沒有做 https:// 鏈接;如果不能訪問,則表明此網站沒有部署 SSL證書。
如果 SSL 證書不是由瀏覽器中“受信任的根證書頒發機構”頒發的,則瀏覽器會有安全警告。
獲取SSL證書的途徑
- 通過OpenSSL生成證書
- 通過keytool簽名
- 從SSL證書授權中心購買
前兩種方法都試過了,網上也看到兩篇很有用的博客——localhost 添加 SSL 證書 、Springboot配置使用ssl
通過OpenSSL生成證書
-
首先安裝OpenSSL,默認目錄安裝即可。下載地址
-
新建配置文件localhost.cnf,文件內容如下
[dn] CN=localhost [req] distinguished_name = dn [EXT] subjectAltName=DNS:localhost keyUsage=digitalSignature extendedKeyUsage=serverAuth
-
以管理員身份進入命令行界面
假設 OpenSSL 的安裝位置為 ‘C:\Program Files (x86)\GnuWin32’,使用cd命令進入 ‘C:\Program Files (x86)\GnuWin32\bin’
然后執行命令
.\openssl req -x509 -out localhost.crt -keyout localhost.key -newkey rsa:2048 -nodes -sha256 -subj ‘/CN=localhost’ -extensions EXT -config {localhost.cnf文件目錄}
證書就會生成成功,如下圖所示。
- 此時再打開chrome瀏覽器,點擊設置,找到證書管理,import剛才生成的證書即可。
通過keytool簽名
keytool是一個證書管理工具,可以生成自簽名證書,個人認為通過keytool生成更便捷一些。
1.在JDK中輸入如下命令。
keytool -genkey -alias tomcat -keyalg RSA -keystore tomcat.keystore
2.將tomcat.keystore拷貝到項目根目錄下
3.配置application.yml
server:
port: 8443
servlet:
context-path: '/identity'
ssl:
key-store: tomcat.keystore
key-store-password: 123456
key-store-type: JKS
key-alias: tomcat
此時啟動項目就可以直接訪問https://localhost:8443/,但尚未實現自動跳轉到HTTPS。
4.在運行主類中加入如下代碼,即可實現自動跳轉。
此時你在瀏覽器輸入http://localhost:8081/identity/login訪問,會自動跳轉到https://localhost:8443/identity/login
@Bean
public Connector connector(){
Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8081);
connector.setSecure(false);
connector.setRedirectPort(8443);
return connector;
}
@Bean
public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){
TomcatServletWebServerFactory tomcat=new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint=new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection=new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(connector);
return tomcat;
}
總結
本文主要是結合個人實踐,探討了Spring Boot中實現HTTPS for localhost,以及獲取SSL證書的兩種方式。
希望能對大家有所幫助~ 有問題歡迎留言交流,不足之處還請多多指正。