準備知識
-
SSL/TLS:這兩個分別是Secure Socket Layer(安全套接字層),Transport Layer Security(傳輸層安全)的縮寫。TLS是SSL的繼承者,如果不是搞安全的專業人員,完全可以認爲他們是一樣的東西。
關於這兩者的差異可以參考https://kb.cnblogs.com/page/197396/
-
key:因爲SSL/TLS使用非對稱加密算法進行認證,所以會有一對公鑰、私鑰。這裏我們說的key通常指的是私鑰。
它長這個樣子
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-UWEAyiTx-1591153845252)(https://img-blog.csdn.net/20180205155616129?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9sbW9meQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
-
csr: Certificate Signing Request,即證書籤名請求。這個文件是我們在申請數字證書的過程中使用CSP(Cryptographic Service Provider,加密服務提供程序)生成私鑰的時候一起生成的。
它一般張這樣:
-
crt:Certificate的縮寫,這就是我們想要的證書。我們只要把CSR文件提交給證書頒發機構(CA)後,證書頒發機構使用其根證書私鑰簽名就生成了證書公鑰文件,也就是頒發給用戶的證書。
使用openssl自己頒發證書
openssl的命令詳細說明可以參考http://linux.51yip.com/search/openssl
1. 生成私鑰
openssl genrsa -out server.key -des3 -passout pass:123456 2048
生成2048位RSA私鑰,並用DES3對稱算法加密它,加密口令爲123456,將生成的私鑰輸出到server.key文件中。
2. 生成CSR請求
openssl req -new -key server.key -out server.csr
3. 生成CA證書
openssl req -new -x509 -key server.key -out ca.crt -days 3650
證書的認證者總是CA或者是CA指定的第三方,這裏我們只是生成一個CA證書自己玩玩。
4. 用CA證書給自己頒發一個證書
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt
執行完成後server.crt就是我們要的證書了。
在Nginx中配置SSL證書
ngx_http_ssl_module模塊的配置參考鏈接:https://nginx.org/en/docs/http/ngx_http_ssl_module.html
要在nginx中使用ssl需要在編譯時安裝ssl模塊。可以用nginx -V
命令檢查當前nginx安裝的模塊
如果沒有安裝過nginx,可以參考http://blog.csdn.net/holmofy/article/details/78639670
如果沒有http_ssl_module,需要重新編譯nginx源碼。在執行./configuration
的時候加上該模塊
./configure --prefix=/usr/local/nginx --with-http_ssl_module
配置完成後用make && make install
命令重新編譯安裝nginx。
安裝完成後在nginx.conf
文件中添加如下配置:
server {
listen 80;
server_name *.hufeifei.cn;
# 告訴瀏覽器有效期內只准用 https 訪問
add_header Strict-Transport-Security max-age=15768000;
# 永久重定向到 https 站點
return 301 https://$server_name$request_uri;
}
# HTTPS server
#
server {
listen 443 ssl;
server_name *.hufeifei.cn;
# 證書文件路徑
ssl_certificate /usr/local/nginx/ssl/server.crt;
# 私鑰文件路徑
ssl_certificate_key /usr/local/nginx/ssl/server.key;
ssl_password_file /usr/local/nginx/ssl/passwd.pwd;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
添加配置後,就可以啓動了。
如果啓動的時候有類似於下面的報錯信息,請檢查證書和私鑰文件路徑有沒有寫錯。
瀏覽器打開網站看看
這是因爲我們的證書是我們自己頒發的,瀏覽器不信任自己頒發的證書,如果要信任該證書需要在Internet選項中添加信任的證書。自己頒發的證書玩玩就行,實際上我們並不會用自己頒發的證書。
使用免費的SSL證書
我們要向獲得受信任的證書,我們的csr必須得交給受信任的CA簽名纔行。要想獲取這樣的證書也很簡單,國內有很多CA代理,不過一般需要請毛爺爺幫忙纔行。
用不起花錢的,也有免費的給你用:https://letsencrypt.org/
letsencrypt有很多第三方工具提供了向(sha)導(gua)式的證書生成工具,這裏介紹一個zerossl
開始製作免費證書:
在網站上添加相應的文件,驗證網站是受你管理。
證書申請成功,可以在nginx中配置證書了。
注意是配置最後生成的domain-crt.txt和domain-key.txt兩個文件。而且這個證書的有效時間是90天,也就是說3個月後這個證書就過期了,到時候你可以用第一步生成的account-key.txt和domain-csr.txt再次申請。
除了這種方式手動申請,還有certbot提供的腳本自動申請:https://certbot.eff.org/,鏈接扔這了,你們自己玩吧。