我們在做一些項目或者網站的時候需要配置https,以加強網站的安全性等,記錄一下學習之路~
HTTPS認識
HTTP:是互聯網上應用最爲廣泛的一種網絡協議,是一個客戶端和服務器端請求和應答的標準(TCP),用於從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議,它可以使瀏覽器更加高效,使網絡傳輸減少。
HTTPS:是以安全爲目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。HTTPS協議的主要作用可以分爲兩種:一種是建立一個信息安全通道,來保證數據傳輸的安全;另一種就是確認網站的真實性。
HTTPS和HTTP的區別主要如下:
1、https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。
2、http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協議。
3、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,後者是443。
4、http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
本文測試環境
服務環境:nginx-1.7
系統環境:windows10/CentOS7
1) 通過openssl自己辦法證書測試https服務
2)通過let`s Encrypt申請免費證書
Https項目服務部署(linux-CentOS7)
1)openssl
1. 首先確保機器上安裝了openssl和openssl-devel
1)#yum install openssl
2)#yum install openssl-devel
2. 創建服務器私鑰,命令會讓你輸入一個口令:
openssl genrsa -des3 -out server.key 1024 //生成私鑰
3. 創建簽名請求的證書(CSR):
openssl req -new -key server.key -out server.csr //生成證書頒發機構,用於頒發公鑰
4. 在加載SSL支持的Nginx並使用上述私鑰時除去必須的口令:
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key //除去密碼以便reload詢問時不需要密碼
5. 配置nginx,最後標記證書使用上述私鑰和CSR:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
6. 修改Nginx配置文件,讓其包含新標記的證書和私鑰:
server {
listen 9003 ssl; //監聽端口爲9003 同時兼容http和https
server_name www.aecccloud.com;
#ssl on; //開啓ssl 指定https時打開註釋
ssl_certificate /usr/share/nginx/html/sslfile/server.crt; #證書位置
ssl_certificate_key /usr/share/nginx/html/sslfile/server.key; #私鑰位置
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1; //指定密碼爲openssl支持的格式
ssl_ciphers HIGH:!aNULL:!MD5; //密碼加密方式
ssl_prefer_server_ciphers on; //依賴SSLv3和TLSv1協議的服務器密碼將優先於客戶端密碼
location / {
root html; //根目錄的相對位置
index index.html index.htm;
}
}
2)let`s Encrypt
certbot是Let's Encrypt官網推薦的自動化配置工具,工具官網可以選擇針對Apache/Nginx/Haproxy/Plesk等不同服務器不同操作系統的安裝配置方法
根據官網https://certbot.eff.org選擇服務類型系統版本來執行命令:
certbot有幾個不得不解決的依賴問題:
1) certbot依賴的python2的urllib3庫版本爲1.21.1版本,如果已經安裝了更高版本的urllib3庫,那麼降級吧pip install urllib3==1.21.1
2) 如果python2的requests庫版本小於2.6.0,那麼自覺升級pip install --upgrade --force-reinstall 'requests==2.6.0'
3) 接下來真正的安裝過程:
yum install epel-release -y && yum update -y
yum install python2-certbot-nginx -y
4) 確保你的nginx配置已經有配置域名,並且域名解析也已經指向該IP地址,域名能夠通過80端口正常訪問(或配置其他端口)
5) 當安裝完成以後,一切就簡單了,運行certbot --nginx,會以提問的方式詢問你幾個配置問題:
# 第一步會讀取你的nginx配置,詢問你需要對哪些域名需要添加ssl
Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: a.haofly.net
2: b.haofly.net
-------------------------------------------------------------------------------
# 第二步詢問你在遇到http的時候是否需要重定向到https
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
就這樣,配置就算完成了,可以看到新的nginx配置已經寫入到配置文件中,訪問域名也會自動跳轉到https了
6)當然,Let's Encrypted只有90天的有效期,可以使用這條命令更新證書: sudo certbot renew --dry-run,官方建議每天隨機運行兩次該命令,如果證書沒有過期,運行命令並不會對你的服務器造成什麼影響,所以就添加如下定時任務:
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew
Https項目服務部署(windows)
1. 安裝perl(非必須)
下載地址:https://www.activestate.com/activeperl/downloads
以管理員身份運行cmd或者重啓cmd重啓電腦,驗證是否安裝成功
2. 安裝openssl
下載地址:http://slproweb.com/products/Win32OpenSSL.html
按照提示更改存放目錄,一直next即可,安裝完成之後配置一下環境變量。把openssl安裝路徑bin的路徑(例如 D:\OpenSSL-Win64\bin)加入到操作系統的系統環境變量Path中
運行cmd,命令行openssl查看是否安裝成功
1)生成證書
首先在nginx安裝目錄中創建新文件夾sslfile用於存放證書,如:D:\niginx\sslfile
在控制檯執行命令:cd D:\nginx\ssl
2) 創建私鑰
genrsa -des3 -out test.key 1024 # test文件名是自己隨便起即可
輸入密碼後,再次重複輸入確認密碼
3) 創建csr證書
openssl req -new -key test.key -out test.csr
#其中key文件爲剛纔生成的文件
執行上述命令後,需要輸入一系列的信息。輸入的信息中最重要的爲Common Name,這裏輸入的域名即爲我們要使用https訪問的域名
4) 去除密碼
在加載SSL支持的Nginx並使用上述私鑰時除去必須的口令,否則會在啓動nginx的時候需要輸入密碼。
複製test.key並重命名爲test.copy.key。
在命令行中執行如下命令以去除口令:
openssl rsa -in test.copy.key -out test.key
#然後輸入密碼,這個密碼就是上文中在創建私鑰的時候輸入的密碼。
5) 生成crt證書
openssl x509 -req -days 365 -in test.csr -signkey test.key -out test.crt
證書生成完畢。我們發現,ssl文件夾中一共生成了4個文件。下面,配置https服務器的時候,我們需要用到的是其中的test.crt和test.key這兩個文件
3. 修改nginx配置
listen 9003 ssl; #監聽端口爲9003 且同時支持http和https
server_name www.aecccloud.com; #域名
ssl_certificate /usr/share/nginx/html/sslfile/server.crt; #證書位置
ssl_certificate_key /usr/share/nginx/html/sslfile/server.key; #私鑰位置
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1; #指定密碼爲openssl支持的格式
ssl_ciphers HIGH:!aNULL:!MD5; #密碼加密方式
ssl_prefer_server_ciphers on; #依賴SSLv3和TLSv1協議的服務器密碼將優先
關閉nginx服務,重啓服務即可。