搭建有效SSL證書的HTTPS站點
1.搭建HTTPS站點,首先必須的就是證書問題,渠道有好多,但是一定要有自己的域名(keytool生成的除外),否則無法進行SSL證書的申請!
(1)付費版:騰訊雲,阿里雲之類的一大把。土豪請隨意,但這裡要提一下,阿里雲可以申請免費的,但是手續很麻煩,有空的朋友可以瞭解下。
進入阿里雲:https://cn.aliyun.com/product/cas
然後選擇立即購買,進入購買頁後,要先選擇證書品牌,選擇Symantec,然後才會彈出免費型DV的選項,後續的操作就自己操作吧。
-------------------------------------------------------------------------------------------
(2)免費版
免費版之前有篇文章講解如何通過java的KeyTools生成免費證書,但是這種純粹用來玩玩就好了,下面說下LetsEncrypt這個免費證書,官方網站:https://letsencrypt.org,瞭解了相關資訊後,我們去申請該證書,當然,也可以自己動手,按照官方的手冊,自己搭建環境生成SSL證書,但這裡我是通過第三方網站來生成的,網址如下:https://freessl.org,一句話概括就是簡單無腦有成效,我們需要做的就是登陸自己域名所在伺服器去驗證下該伺服器的所有權是不是本人的就可以了,其他它幫你搞定!步驟如下:
1.輸入自己的域名,當然這裡的域名是我虛構的,然後選擇證書品牌,點選建立免費域名
2.根據自己的需要選擇,郵箱是接收一些通知資訊的,比如快到期的時候,他會發通知給你進行續期(其實是要重新申請),這裡驗證方式我推薦是檔案認證,因為只要把它要求的檔案放到域名所對應的伺服器上,然後我們通過他指定的路徑能訪問到這個檔案,他就認為這個伺服器的所有權是你的才給你驗證通過
點選建立後,會出來下面的介面
這裡他給出了一個檔案路徑do1shoje.cn/.well-known/pki-validation/fileauth.txt,什麼意思呢?上面已經說到了,我任何一個瀏覽器,只要我能訪問到正常訪問到這個url,然後該檔案內記錄的值等於它給定的值
(這裡是201805200304223ek9pdaejm21kzl47ih45fvw5j76w7fqx05gag9nou4zb2uoru),滿足了這2個條件即認證成功,所以我們要把這個檔案下載下來,放到伺服器上,然後想辦法通過這個地址do1shoje.cn/.well-known/pki-validation/fileauth.txt可以訪問到這個檔案即可,當我們瀏覽器測試成功後,點選【檔案驗證】按鈕,一般你瀏覽器測試可以訪問,這一步基本上沒問題了。來看看我是怎麼做的,因為我的伺服器上搭了Nginx,通過nginx做跳板,所以我nginx配置檔案裡是這樣配置的:
location /.well-known/pki-validation/ {
root E:/soft/nginx/nginx-1.14.0;
autoindex on;
}
因為我是把nginx看成了一個靜態資源伺服器,所以需要自己建個目錄,來對應上面的路徑,然後把指定的檔案扔到指定的目錄即可
重啟nginx,最終測試瀏覽器訪問成功,點選檔案驗證,ok,然後他就自動幫你生成了一系列東西,然後下載他給的zip檔案,裡面有ca證書和私鑰,我測試時時壓縮包裡的2個檔案是xxx.pem檔案和xxx.key檔案,好的,證書拿到手了,現在就是考慮怎麼應用到站點裡,
------------------------應用到站點--------------------------
如果用nginx做跳板,那就需要啟用nginx的https模組,然後rewrite到https站點,即原理就是,https訪問nginx,nginx再重定向到https站點,這種情況一般都是nginx單獨作為一臺代理伺服器,站點作為一臺web伺服器,另外https都是跟域名掛鉤的,因為SSL證書認證的是域名,不是IP,即使你訪問百度https://14.215.177.38/,也是會提示證書不信任,因為證書認證的是www.baidu.com,而不是baidu的ip。這也就是為什麼申請時一定需要域名了
我的伺服器場景是:nginx和tomcat都裝在一臺機裡,上nginx的配置檔案好了:
#HTTPS
server {
listen 8889 ssl;#預設是443,但是我的443埠被佔用了,改成了8889server_name do1shoje.cn;
ssl_certificate ../ca/cert.pem;#上面下載下來的CA證書
ssl_certificate_key ../ca/cert.key;#上面下載下來的祕鑰
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
#rewrite 自己寫
}
好的,nginx配置完畢,nginx只需配置該內容即可,然後我們回到tomcat,修改tomcat的server.xml檔案,
#如果不需要nginx,則只配置tomcat就可以了
<Connector port="8889" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
SSLCertificateFile="D:\ca\cert.pem"
SSLCertificateKeyFile="D:\ca\cert.key"
SSLProtocol="TLSv1+TLSv1.1+TLSv1.2" URIEncoding="UTF-8"/>
這裡請注意protocol="org.apache.coyote.http11.Http11AprProtocol"這個地方,
tomcat預設的協議是protocol="org.apache.coyote.http11.Http11Protocol",這樣,HTTPS搭建站點即告一段落,後續通過域名加埠號+專案的URL即可(因為我這裡預設的80被用了,所以只能加上埠號,do1shoje.cn不加埠號其實預設是do1shoje.cn:80)
但這樣只能通過https訪問,要是需要輸入http://do1shoje.cn也能跳轉到https://do1shoje.cn呢?
在專案web.xml末尾加上如下配置即可:
<security-constraint>
<web-resource-collection >
<web-resource-name >SSL</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
然後我們訪問Http埠時就會跳轉到https協議埠
最後,上最終效果圖
如果搭建的是IIS站點,需要將PEM轉成.pfx格式,在Linux或者Mac執行
openssl pkcs12 -export -out cert.p12 -in cert.pem -inkey cert_key.key -passin pass:root -passout pass:root
(cert.p12:轉換PEM後生成的檔名,cert.pem:申請的pem格式證書名,cert_key.key申請的pem格式證書祕鑰,root:開啟或安裝證書時需要該密碼)
然後需要在IIS的伺服器證書上匯入該證書