在實(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)備案過的域名
步驟
-
登錄進(jìn)騰訊云兔沃,在產(chǎn)品中找到 SSL 證書這一項(xiàng),點(diǎn)擊進(jìn)去
點(diǎn)擊立即購買
我使用的域名型免費(fèi)版级及,如果你有其他的需求乒疏,也可以選擇其他的選項(xiàng),點(diǎn)擊快速免費(fèi)申請(qǐng)
填寫基本的信息饮焦,通用名稱就寫證書綁定的域名怕吴,填寫自己的郵箱,備注名可以隨便填县踢,私鑰密碼可以不填寫转绷,所屬項(xiàng)目選默認(rèn),進(jìn)入下一步
到身份驗(yàn)證時(shí)殿雪,選擇手動(dòng) DNS 驗(yàn)證暇咆,點(diǎn)擊確認(rèn)。注:若你的域名和服務(wù)器已經(jīng)關(guān)聯(lián)起來了丙曙,則選擇自動(dòng)就行
點(diǎn)擊查看證書詳情爸业,進(jìn)入下一個(gè)頁面
在這一步,需要 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
此段摘錄自江南一點(diǎn)雨的專欄
在入口類中添加相應(yīng)的轉(zhuǎn)向Bean,代碼如下:
@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ì),下面說一下我在操作過程中踩過的一些坑
-
無法將 crt 和 key 文件利用 FileZilla 軟件直接傳輸?shù)?etc/nginx 文件中去
- 可以先復(fù)制到其他文件夾中券勺,再在服務(wù)器內(nèi)部復(fù)制到 etc/nginx 中去
-
在利用
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代理的配置
步驟
- 在剛剛配置的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;
}
}
- 在springboot當(dāng)中實(shí)現(xiàn)一個(gè)簡單的helloworld程序
@RestController
public class helloController {
@RequestMapping("hello")
public String hello(){
return "hello world!";
}
}
- 啟動(dòng)項(xiàng)目
結(jié)果
當(dāng)配置完成后蒜哀,發(fā)現(xiàn)通過nginx的代理依然能夠使用https協(xié)議斩箫,如下所示: