Spring boot(二):HTTPS之自簽名證書配置

其實為Spring Boot配置HTTPS非常簡單慷垮,只需要兩步:

  • 生成或者獲取ssl證書
  • 在Spring Boot中配置HTTPS
    • 內(nèi)嵌Tomcat配置
    • Local Tomcat 配置

1. 生成或者獲取ssl證書

獲取SSL證書主要有兩種,一種是自己通過工具自動生成,另外一種是通過SSL證書服務商獲取会油,當然了后一種是需要收費的贾富。

本文主要介紹用JDK自帶的keytool工具來生成SSL證書筑累。如何查看我們的JDK是否帶有keytool工具臭笆,只需要windows 控制臺輸入如下命令

keytool --help

若輸出如圖1信息,則證明此JDK版本帶有keytool工具市咆。


圖1

接下來開始生成證書汉操,在命令行終端輸入

keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore keystore.p12 -validity 3650

簡單說明一下各個參數(shù)的含義

1.-storetype 指定密鑰倉庫類型

2.-keyalg 生證書的算法名稱,RSA是一種非對稱加密算法

3.-keysize 證書大小

4.-keystore 生成的證書文件的存儲路徑

5.-validity 證書的有效期

當然了床绪,我們也可以不指定密鑰倉庫類型客情,JDK會默認選用JKS, 如

keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 3650

兩種都可以,但Oracle推薦使用第一種.

C:\Users\liting.wang>keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RS
A -keysize 2048  -keystore keystore.p12 -validity 3650
輸入密鑰庫口令:
再次輸入新口令:
您的名字與姓氏是什么?
  [Unknown]:
您的組織單位名稱是什么?
  [Unknown]:
您的組織名稱是什么?
  [Unknown]:
您所在的城市或區(qū)域名稱是什么?
  [Unknown]:
您所在的省/市/自治區(qū)名稱是什么?
  [Unknown]:
該單位的雙字母國家/地區(qū)代碼是什么?
  [Unknown]:
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown是否正確?
  [否]:  是

執(zhí)行完上面一行命令后癞己,在你的系統(tǒng)的當前用戶目錄下會生成一個keystore.p12文件

我們也可以使用下面的命令查看我們證書內(nèi)容

keytool -list -v -storetype pkcs12 -keystore keystore.p12
C:\Users\liting.wang>keytool -list -v -storetype pkcs12 -keystore keystore.p12
輸入密鑰庫口令:

密鑰庫類型: PKCS12
密鑰庫提供方: SunJSSE

您的密鑰庫包含 1 個條目

別名: tomcat
創(chuàng)建日期: 2017-11-29
條目類型: PrivateKeyEntry
證書鏈長度: 1
證書[1]:
所有者: CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
發(fā)布者: CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
序列號: 6b628be1
有效期開始日期: Wed Nov 29 18:52:33 CST 2017, 截止日期: Sat Nov 27 18:52:33 CST
2027
證書指紋:
         MD5: D6:71:F9:ED:11:A7:8A:AB:69:DC:9A:99:E2:4B:94:CE
         SHA1: 88:E5:A7:1C:77:5E:D9:83:F4:14:76:D2:E3:1F:31:FB:37:29:31:13
         SHA256: D6:52:D8:56:A7:07:E6:99:3D:EB:BB:E8:D5:E7:E1:D0:66:B6:AD:D5:BC:
65:01:9D:60:6D:95:BA:CD:63:75:C0
         簽名算法名稱: SHA256withRSA
         版本: 3

擴展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 31 84 6B E8 DB 63 6B 5E   63 CE A9 DA C8 72 82 88  1.k..ck^c....r..
0010: EB F9 71 5B                                        ..q[
]
]



*******************************************
*******************************************

如果你已經(jīng)有SSL證書膀斋,你也可將其導入到keystore里,供Spring Boot使用

keytool -import -alias tomcat -file myCertificate.crt -keystore keystore.p12 -storepass password

2. 在Spring Boot里配置開記HTTPS

2.1 內(nèi)嵌Tomcat配置

將這個文件拷貝到我們項目的resources目錄下痹雅,與application.properties同一目錄仰担,然后修改application.properties文件,添加HTTPS支持绩社。在application.properties中添加如下代碼:

# Define a custom port instead of the default 8080
server.port = 8443
# Tell Spring Security (if used) to require requests over HTTPS
security.require-ssl=true
# The format used for the keystore 
server.ssl.key-store-type:PKCS12
# The path to the keystore containing the certificate
server.ssl.key-store=classpath:keystore.p12
# The password used to generate the certificate
server.ssl.key-store-password=password
# The alias mapped to the certificate
server.ssl.key-alias=tomcat

第一行指定https請求訪問的端口;

第二行是告訴Spring Security 請求也需要透過HTTPS, 簽名文件;

第三行指定密鑰倉庫類型;

第四行指定密鑰倉庫路徑;

第五行指定簽名密碼;

第六行是別名摔蓝。

OK,這樣配置完成之后我們就可以通過HTTPS來訪問我們的Web了.

2.2 Local Tomcat配置

以上是針對Spring Boot內(nèi)嵌Tomcat愉耙,如果Local的Tomcat贮尉,那應該如何配置呢?

首先到你的Tomcat安裝目錄的conf目錄下找到server.xml配置文件朴沿,打開https connector猜谚,即將

<!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
        maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
        clientAuth="false" sslProtocol="TLS" />
-->

去掉注釋并修改為

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" 
               keystoreFile="${user.home}/keystore.p12"
               keystorePass="123456" />

其中 keystoreFile="${user.home}/keystore.p12"為SSL證書的路徑败砂,keystorePass="123456"為你證書的密碼。

以上為Tomcat8.0的配置魏铅。
Tomcat9.0跟Tomcat8.0有點不太一樣昌犹,但原理是一樣的,將

<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true">
    <SSLHostConfig>
        <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                     type="RSA" />
    </SSLHostConfig>
</Connector>
-->

去掉注釋并修改為:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
    <SSLHostConfig>
        <Certificate certificateKeystoreFile="conf/keystore.p12"
                     certificateKeystorePassword="123456"
                     certificateKeyAlias="tomcat"
                     type="RSA" />
    </SSLHostConfig>
</Connector>

其實也就是換了個表達形式而已览芳,換湯不換藥斜姥。具體可參考TOMCAT9.0的官方配置文檔http://tomcat.apache.org/tomcat-9.0-doc/ssl-howto.html

重啟Tomcat Service沧竟,如果有看到輸出Starting ProtocolHandler ["http-nio-8443"]的log信息铸敏,則說明配置成功


圖2

這樣就可以通過HTTPS來訪問我們的Web了

3. HTTP自動重定向到HTTPS

光有HTTPS肯定還不夠,很多用戶可能并不知道屯仗,用戶有可能繼續(xù)使用HTTP來訪問你的網(wǎng)站搞坝,這個時候我們需要添加HTTP自動重定向到HTTPS的功能,當用戶使用HTTP來進行訪問的時候自動轉(zhuǎn)為HTTPS的方式魁袜。

3.1 內(nèi)嵌Tomcat配置

配置很簡單,在入口類中添加相應的重定向Bean就行了敦第,如下:

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ConnectorConfig {

    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
            @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(getHttpConnector());
        return tomcat;
    }

    private Connector getHttpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8443);
        return connector;
    }

}

這個時候當我們訪問http://localhost:8080/SpringBootBase的時候系統(tǒng)會自動重定向到https://localhost:8443/SpringBootBase這個地址上峰弹。這里的Connector實際就是server.xml中配置的Tomcat的Connector節(jié)點。

3.2 Local Tomcat 配置

同樣在conf目錄下芜果,打開web.xml鞠呈,在最后一個的節(jié)點后加上

<security-constraint>
  <web-resource-collection>
    <web-resource-name>OPENSSL</web-resource-name>
    <url-pattern>/*</url-pattern>
  </web-resource-collection>
  <user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
  </user-data-constraint>
</security-constraint>

重啟Tomcat Service即可,這個時候當我們訪問http://localhost:8080/SpringBootBase的時候Tomcat也會將其自動重定向到https://localhost:8443/SpringBootBase這個地址上.


完整代碼可到我的github下載: https://github.com/onroadtech/SpringbootBase/tree/spring_boot_https

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末右钾,一起剝皮案震驚了整個濱河市蚁吝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舀射,老刑警劉巖窘茁,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異脆烟,居然都是意外死亡山林,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門邢羔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驼抹,“玉大人,你說我怎么就攤上這事拜鹤】蚣剑” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵敏簿,是天一觀的道長明也。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么诡右? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任安岂,我火速辦了婚禮,結(jié)果婚禮上帆吻,老公的妹妹穿的比我還像新娘域那。我一直安慰自己,他們只是感情好猜煮,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布次员。 她就那樣靜靜地躺著,像睡著了一般王带。 火紅的嫁衣襯著肌膚如雪淑蔚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天愕撰,我揣著相機與錄音刹衫,去河邊找鬼。 笑死搞挣,一個胖子當著我的面吹牛带迟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播囱桨,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼仓犬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舍肠?” 一聲冷哼從身側(cè)響起搀继,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎翠语,沒想到半個月后叽躯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡啡专,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年险毁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片们童。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡畔况,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出慧库,到底是詐尸還是另有隱情跷跪,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布齐板,位于F島的核電站吵瞻,受9級特大地震影響葛菇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜橡羞,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一眯停、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卿泽,春花似錦莺债、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至第租,卻和暖如春措拇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背慎宾。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工丐吓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人趟据。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓汰蜘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親之宿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容