在Spring Boot中配置ssl證書實(shí)現(xiàn)https

在實(shí)際項(xiàng)目開發(fā)過程中,使用 http 是不安全的莫辨,所以很多時(shí)候我們要用到 https刃唤。https 是以安全為目標(biāo)的 http 通道,而 https 的安全基礎(chǔ)是 SSL坎缭。

我在使用 SSL 的過程中竟痰,使用了實(shí)際的證書,踩了一些坑掏呼,鑒于網(wǎng)上的很多教程的ssl 都是使用的 java 自帶的 keytool 命令來生成的坏快,但是對(duì)實(shí)際證書的使用方法涉及的并不多,所以將我使用過程中的一些步驟記錄下來憎夷,一是讓自己記住莽鸿,其次希望可以給大家在實(shí)際過程中有一些啟發(fā)。

申請(qǐng) SSL 證書

前提

  • 我申請(qǐng)的是騰訊云的 SSL 證書。
  • 如果你要申請(qǐng) SSL 證書祥得,需要有一個(gè)已經(jīng)備案過的域名

步驟

  1. 登錄進(jìn)騰訊云兔沃,在產(chǎn)品中找到 SSL 證書這一項(xiàng),點(diǎn)擊進(jìn)去


    ssl證書入口
  2. 點(diǎn)擊立即購買

  3. 我使用的域名型免費(fèi)版级及,如果你有其他的需求乒疏,也可以選擇其他的選項(xiàng),點(diǎn)擊快速免費(fèi)申請(qǐng)

  4. 填寫基本的信息饮焦,通用名稱就寫證書綁定的域名怕吴,填寫自己的郵箱,備注名可以隨便填县踢,私鑰密碼可以不填寫转绷,所屬項(xiàng)目選默認(rèn),進(jìn)入下一步

  5. 到身份驗(yàn)證時(shí)殿雪,選擇手動(dòng) DNS 驗(yàn)證暇咆,點(diǎn)擊確認(rèn)。注:若你的域名和服務(wù)器已經(jīng)關(guān)聯(lián)起來了丙曙,則選擇自動(dòng)就行

  6. 點(diǎn)擊查看證書詳情爸业,進(jìn)入下一個(gè)頁面

  7. 在這一步,需要 DNS 驗(yàn)證亏镰,添加解析記錄扯旷,具體的步驟在操作指引中已經(jīng)詳細(xì)寫出。簡略來說就是通過解析制定的 DNS 記錄來驗(yàn)證域名所有權(quán)索抓,操作指引中使用的是騰訊云云解析平臺(tái)钧忽,首先添加您的域名,首先增加一條記錄指向你的服務(wù)器進(jìn)行綁定逼肯,即那條類型為A的記錄耸黑。其次,添加給出的 DNS 記錄篮幢。均添加成功后大刊,需要回到證書詳情頁面,點(diǎn)擊自助診斷三椿,若成功則等待系統(tǒng)給你頒發(fā) SSL 證書即可缺菌。

在 Spring Boot 項(xiàng)目中使用 https

前提

  • 建立一個(gè) Spring Boot 項(xiàng)目

  • 已經(jīng)完成了上一步

步驟

  • 在騰訊云中的證書列表,下載頒發(fā)給你的證書
下載證書界面
  • 下載并解壓后內(nèi)容如下圖
文件目錄
  • 我們可以使用 p12 和 jks 兩種格式的證書來實(shí)現(xiàn)使用 https 的目的搜锰,下面分別進(jìn)行介紹

jks

  • 把剛剛下載的文件中的 Tomcat 文件夾中的jks文件復(fù)制到 spring boot 項(xiàng)目中的 src/main/resources/ 目錄下伴郁,和 application.properties 平級(jí)

  • 并且在 application.properties 中配置如下命令

server.port: 8092
server.ssl.key-store= classpath:server.jks
server.ssl.key-store-password=你的密碼
server.ssl.keyStoreType = JKS
  • key-store: 生成的證書文件的存儲(chǔ)路徑,其中 server.jks 需要改為你剛剛復(fù)制進(jìn)來的jks文件名

  • key-store-password: 指定簽名的密碼,打開下載文件中 Tomcat 文件夾中的 txt 文件蛋叼,即為此處填寫的密碼

  • keyStoreType:為制定秘鑰倉庫的類型焊傅,這里我們需要填寫為 JKS

p12

  • 打開你的遠(yuǎn)程服務(wù)端剂陡,新建一個(gè)文件夾,并且把剛剛下載的文件中的 Nginx 文件夾中的 crt 文件和 key 文件復(fù)制到此文件夾中

  • 輸出命令

openssl pkcs12 -export -clcerts -in yourDomain.crt -inkey myPrivateKey.key -out server.p12 
  • yourDomain.crt 替換為你的 crt 文件

  • myPrivateKey.key 替換為你的 key 文件

  • 在此過程中需要讓你輸入密碼狐胎,記住這個(gè)密碼鹏倘,后面會(huì)用到

  • 執(zhí)行此命令,生成了我們需要的 p12 文件顽爹,將其復(fù)制到 spring boot 項(xiàng)目中的 src/main/resources/ 目錄下纤泵,和 application.properties 平級(jí)

  • 并且在 application.properties 中配置如下命令

server.port: 8092
server.ssl.key-store: classpath:server.p12
server.ssl.key-store-password: 剛剛設(shè)置的密碼
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: 
  • key-store: 生成的證書文件的存儲(chǔ)路徑,其中 server.p12 需要改為你生成的 p12 文件的名字

  • key-store-password: 指定簽名的密碼,要設(shè)置成剛剛你設(shè)置的密碼

  • keyStoreType:為制定秘鑰倉庫的類型镜粤,這里我們需要填寫為 PKCS12

  • keyAlias: 為別名

  • 注:如果不知道別名捏题,可以在服務(wù)器中輸入

keytool -list -keystore server.p12

會(huì)顯示:

獲取別名界面

這個(gè)1即為別名

驗(yàn)證

  • 至此,所有的基本步驟就完成了

  • 可以寫一個(gè)基本的 helloworld 來進(jìn)行驗(yàn)證肉渴,將項(xiàng)目打包運(yùn)行公荧,可以看到已經(jīng)可以在 Spring Boot 項(xiàng)目中使用 https 了

配置成功界面

擴(kuò)展:同時(shí)只用 http 并將 http 自動(dòng)轉(zhuǎn)向 https

@Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(httpConnector());
        return tomcat;
    }

    @Bean
    public Connector httpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        //Connector監(jiān)聽的http的端口號(hào)
        connector.setPort(8080);
        connector.setSecure(false);
        //監(jiān)聽到http的端口號(hào)后轉(zhuǎn)向到的https的端口號(hào)
        connector.setRedirectPort(8092);
        return connector;
    }
  • 通過這段配置同规,訪問http://localhost:8080的時(shí)候系統(tǒng)會(huì)自動(dòng)重定向到https://localhost:8092這個(gè)地址上循狰。

在 Nginx 上配置證書

  • Nginx 證書部署在騰訊云中有官方教程

  • 教程中描述的很詳細(xì),下面說一下我在操作過程中踩過的一些坑

  1. 無法將 crt 和 key 文件利用 FileZilla 軟件直接傳輸?shù)?etc/nginx 文件中去

    • 可以先復(fù)制到其他文件夾中券勺,再在服務(wù)器內(nèi)部復(fù)制到 etc/nginx 中去
  2. 在利用bin/nginx –t來測(cè)試時(shí)绪钥,會(huì)報(bào)錯(cuò)nginx: [emerg] "user" directive is not allowed here in /etc/nginx/conf.d/nginx.conf:1

    • 可能是因?yàn)樵?nginx 目錄下有不止一份 nginx 的配置文件所以產(chǎn)生了沖突,刪除多余的那一份就行关炼。

    ?

結(jié)果

當(dāng)配置完成后,輸入對(duì)應(yīng)的地址儒拂,當(dāng)出現(xiàn)如下界面則配置成功寸潦。

配置成功界面

擴(kuò)展:如何將springboot項(xiàng)目和nginx代理聯(lián)合起來

前提

  • 完成了上述的springboot項(xiàng)目的配置和nginx代理的配置

步驟

  1. 在剛剛配置的nginx.conf文件中添加一些配置信息,如下:
server {
        listen 443;
        server_name #填寫綁定證書的域名;
        ssl on;     
        ssl_certificate   #填寫你的證書.crt;
        ssl_certificate_key #填寫你的證書.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照這個(gè)協(xié)議配置
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照這個(gè)套件配置
        ssl_prefer_server_ciphers on;
        location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_pass http://服務(wù)器地址:端口號(hào)/;#這里填寫你的端口號(hào)社痛,要和在springboot項(xiàng)目中配置的端口號(hào)一致,若是在本機(jī)操作见转,則服務(wù)器地址可以填0.0.0.0或者127.0.0.1
            proxy_redirect off;
        }
    }
  1. 在springboot當(dāng)中實(shí)現(xiàn)一個(gè)簡單的helloworld程序
@RestController
public class helloController {
    @RequestMapping("hello")
    public String hello(){
        return "hello world!";
    }
}
  1. 啟動(dòng)項(xiàng)目

結(jié)果

當(dāng)配置完成后蒜哀,發(fā)現(xiàn)通過nginx的代理依然能夠使用https協(xié)議斩箫,如下所示:


配置成功界面
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凡怎,隨后出現(xiàn)的幾起案子校焦,更是在濱河造成了極大的恐慌赊抖,老刑警劉巖统倒,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異氛雪,居然都是意外死亡房匆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浴鸿,“玉大人井氢,你說我怎么就攤上這事≡懒矗” “怎么了花竞?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長掸哑。 經(jīng)常有香客問我约急,道長,這世上最難降的妖魔是什么苗分? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任厌蔽,我火速辦了婚禮,結(jié)果婚禮上摔癣,老公的妹妹穿的比我還像新娘奴饮。我一直安慰自己,他們只是感情好择浊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布戴卜。 她就那樣靜靜地躺著,像睡著了一般琢岩。 火紅的嫁衣襯著肌膚如雪叉瘩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天粘捎,我揣著相機(jī)與錄音薇缅,去河邊找鬼。 笑死攒磨,一個(gè)胖子當(dāng)著我的面吹牛泳桦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播娩缰,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼灸撰,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了拼坎?” 一聲冷哼從身側(cè)響起浮毯,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泰鸡,沒想到半個(gè)月后债蓝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盛龄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年饰迹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芳誓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啊鸭,死狀恐怖锹淌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赠制,我是刑警寧澤赂摆,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站钟些,受9級(jí)特大地震影響库正,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜厘唾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一褥符、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抚垃,春花似錦喷楣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至罕伯,卻和暖如春曲伊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背追他。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工坟募, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人邑狸。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓懈糯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親单雾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赚哗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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