Nginx 配置 SSL 及 HTTPS 协议通信过程
一、前言
基礎知識
1.1 公鑰密碼體制(public-key cryptography)
公鑰密碼體制分為三個部分,公鑰、私鑰、加密解密算法,它的加密解密過程如下:
加密:通過加密算法和公鑰對內容(或者說明文)進行加密,得到密文。加密過程需要用到公鑰。
解密:通過解密算法和私鑰對密文進行解密,得到明文。解密過程需要用到解密算法和私鑰。注意,由公鑰加密的內容,只能由私鑰進行解密,也就是說,由公鑰加密的內容,如果不知道私鑰,是無法解密的。
公鑰密碼體制的公鑰和算法都是公開的(這是為什么叫公鑰密碼體制的原因),私鑰是保密的。大家都以使用公鑰進行加密,但是只有私鑰的持有者才能解密。在實際的使用中,有需要的人會生成一對公鑰和私鑰,把公鑰發布出去給別人使用,自己保留私鑰。
1.2 對稱加密算法(symmetric key algorithms)
在對稱加密算法中,加密使用的密鑰和解密使用的密鑰是相同的。也就是說,加密和解密都是使用的同一個密鑰。因此對稱加密算法要保證安全性的話,密鑰要做好保密,只能讓使用的人知道,不能對外公開。這個和上面的公鑰密碼體制有所不同,公鑰密碼體制中加密是用公鑰,解密使用私鑰,而對稱加密算法中,加密和解密都是使用同一個密鑰,不區分公鑰和私鑰。密鑰,一般就是一個字符串或數字,在加密或者解密時傳遞給加密/解密算法。前面在公鑰密碼體制中說到的公鑰、私鑰就是密鑰,公鑰是加密使用的密鑰,私鑰是解密使用的密鑰。
1.3 非對稱加密算法(asymmetric key algorithms)
在非對稱加密算法中,加密使用的密鑰和解密使用的密鑰是不相同的。前面所說的公鑰密碼體制就是一種非對稱加密算法,他的公鑰和是私鑰是不能相同的,也就是說加密使用的密鑰和解密使用的密鑰不同,因此它是一個非對稱加密算法。
1.4 RSA簡介
RSA 是一種公鑰密碼體制,現在使用得很廣泛。如果對 RSA 本身有興趣的,可以查詢 RSA 相關的具體介紹。
RSA 密碼體制是一種公鑰密碼體制,公鑰公開,私鑰保密,它的加密解密算法是公開的。由公鑰加密的內容可以并且只能由私鑰進行解密,并且由私鑰加密的內容可以并且只能由公鑰進行解密。也就是說,RSA 的這一對公鑰、私鑰都可以用來加密和解密,并且一方加密的內容可以由并且只能由對方進行解密。
1.5 簽名和加密
我們說加密,是指對某個內容加密,加密后的內容還可以通過解密進行還原。 比如我們把一封郵件進行加密,加密后的內容在網絡上進行傳輸,接收者在收到后,通過解密可以還原郵件的真實內容。
這里主要解釋一下簽名,簽名就是在信息的后面再加上一段內容,可以證明信息沒有被修改過,怎么樣可以達到這個效果呢?一般是對信息做一個 hash 計算得到一個hash值,注意,這個過程是不可逆的,也就是說無法通過 hash 值得出原來的信息內容。在把信息發送出去時,把這個 hash 值加密后做為一個簽名和信息一起發出去。 接收方在收到信息后,會重新計算信息的 hash 值,并和信息所附帶的hash值(解密后)進行對比,如果一致,就說明信息的內容沒有被修改過,因為這里 hash 計算可以保證不同的內容一定會得到不同的 hash 值,所以只要內容一被修改,根據信息內容計算的 hash 值就會變化。當然,不懷好意的人也可以修改信息內容的同時也修改hash值,從而讓它們可以相匹配,為了防止這種情況,hash 值一般都會加密后(也就是簽名)再和信息一起發送,以保證這個 hash 值不被修改。
?
HTTPS 的通信過程
HTTPS 是 HTTP 的安全版本,它可以通過 SSL / TLS 連接保護在線傳輸的任何通信。簡而言之,HTTPS=HTTP+SSL。如果想要建立 HTTPS 連接,則首先必須從受信任的證書頒發機構(CA)Gworg 機構注冊 SSL證書。安裝 SSL 證書后,網站地址欄 HTTP 后面就會多一個 "S",還有綠色安全鎖標志。
SSL(Secure Sockets Layer,安全套接字層)協議,及其繼任者 TLS(Transport Layer Security,傳輸層安全)協議,是為網絡通信提供安全及數據完整性的一種安全協議。
1)瀏覽器發送一個 HTTPS 的請求給服務器;
2)服務器要有一套數字證書,可以自己制作,也可以向組織申請,區別就是自己頒發的證書需要客戶端驗證通過,才可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面,這套證書其實就是一對公鑰和私鑰;
3)服務器會把公鑰傳輸給客戶端;
4)客戶端(瀏覽器)收到公鑰后,會驗證其是否合法有效,無效會有警告提醒,有效則會生成一串隨機數,并用收到的公鑰加密;
5)客戶端把加密后的隨機字符串傳輸給服務器;
6)服務器收到加密隨機字符串后,先用私鑰解密(公鑰加密,私鑰解密),獲取到這一串隨機數后,再用這串隨機字符串加密傳輸的數據(該加密為對稱加密,所謂對稱加密,就是將數據和私鑰也就是這個隨機字符串通過某種算法混合在一起,這樣除非知道私鑰,否則無法獲取數據內容);
7)服務器把加密后的數據傳輸給客戶端;
8)客戶端收到數據后,再用自己的私鑰也就是那個隨機字符串解密;
9)客戶機和服務器都知道了對稱密鑰,并用它來加密會話期間的最終用戶。(流程圖如下所示)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?
2.1?client訪問url,
一種是?https://www.domain.com/...訪問直接走443端口到server;
另一種是http://www.domain.com/....訪問走80端口到server被nginx的rewrite成https://www.domain.com/...重新走443到server;
server部署了nginx監聽了80和443端口,80的全部重新轉換到443,這一步多了個重定向;
?
二、自己生成 SSL 證書
如果準備給 Nginx 安裝 SSL 證書,默認情況下,SSL 模塊是不被編譯的,需要在編譯 Nginx 時使用 --with-http_ssl_module 參數,而該編譯模塊需要 OpenSSL 庫文件,一般需要安裝 openssl 與 openssl-devel 軟件。
# cd /usr/local/src/nginx-1.12.2
# ./configure --prefix=/usr/local/nginx --with-http_ssl_module
# make
# make install
2.1 生成帶密碼私鑰 key
進入到 nginx.conf 所在的目錄,源碼安裝后,該文件目錄為 /usr/local/nginx/conf,如果是 yum安裝,該文件目錄為 /etc/nginx,進入目錄后,創建 ssl_cert 目錄,在該目錄中生成相應的密鑰,如下:
[root@masternode /]# cd /etc/nginx [root@masternode nginx]# mkdir ssl_cert [root@masternode nginx]# cd ssl_cert [root@masternode ssl_cert]# pwd /etc/nginx/ssl_cert [root@masternode ssl_cert]# openssl genrsa -des3 -out tmp.key 2048 Generating RSA private key, 2048 bit long modulus ..............+++ ............................................................+++ e is 65537 (0x10001) Enter pass phrase for tmp.key: Verifying - Enter pass phrase for tmp.key: [root@masternode ssl_cert]# ls -l total 4 -rw-r--r-- 1 root root 1751 Sep 21 23:45 tmp.key生成私鑰文件時需要輸入密碼,每次用瀏覽器訪問 HTTPS 都需要輸入密鑰是不現實的,需要轉換私鑰,取消密碼,如下步驟。
2.2 轉換成無密碼私鑰 key
[root@masternode ssl_cert]# openssl rsa -in tmp.key -out moonxy.key Enter pass phrase for tmp.key: writing RSA key [root@masternode ssl_cert]# ls -l total 8 -rw-r--r-- 1 root root 1679 Sep 21 23:46 moonxy.key -rw-r--r-- 1 root root 1751 Sep 21 23:45 tmp.key [root@masternode ssl_cert]# rm -f tmp.key [root@masternode ssl_cert]# ls -l total 4 -rw-r--r-- 1 root root 1679 Sep 21 23:46 moonxy.key將帶密碼的 tmp.key 刪除,只保留無密碼的 moonxy.key 私鑰。
2.3 生成證書請求文件
[root@masternode ssl_cert]# openssl req -new -key moonxy.key -out moonxy.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:HongKong Locality Name (eg, city) [Default City]:HongKong Organization Name (eg, company) [Default Company Ltd]:moonxy Organizational Unit Name (eg, section) []:Linux Common Name (eg, your name or your server's hostname) []:masternode Email Address []:moonxy@qq.comPlease enter the following 'extra' attributes to be sent with your certificate request A challenge password []:20190922 An optional company name []:amxx [root@masternode ssl_cert]# ls -l total 8 -rw-r--r-- 1 root root 1119 Sep 22 15:55 moonxy.csr -rw-r--r-- 1 root root 1679 Sep 21 23:46 moonxy.key生成證書請求文件 moonxy.csr 后,我們將拿它和私鑰 moonxy.key 文件一起生成最終的證書文件,也就是公鑰。
2.4 生成公鑰證書文件
[root@masternode ssl_cert]# openssl x509 -req -days 365 -in moonxy.csr -signkey moonxy.key -out moonxy.crt Signature ok subject=/C=CN/ST=HongKong/L=HongKong/O=moonxy/OU=Linux/CN=masternode/emailAddress=moonxy@qq.com Getting Private key [root@masternode ssl_cert]# ls -l total 12 -rw-r--r-- 1 root root 1298 Sep 22 16:02 moonxy.crt -rw-r--r-- 1 root root 1119 Sep 22 15:55 moonxy.csr -rw-r--r-- 1 root root 1679 Sep 21 23:46 moonxy.key這樣最終生成了 CRT 證書文件 moonxy.crt,也就是上面提到的公鑰。
三、Nginx 配置 SSL
在?/etc/nginx/vhost(如果是編譯安裝,通常為 /usr/local/nginx/conf/vhost)目錄下創建新的配置文件 ssl.conf,并添加如下內容:
[root@masternode vhost]# vim /etc/nginx/vhost/ssl.conf server {listen 443;server_name moonxy.com;index index.html index.php;root /data/www/nginx/moonxy;ssl on;ssl_certificate ssl_cert/moonxy.crt;ssl_certificate_key ssl_cert/moonxy.key;ssl_protocols TLSv1 TLSv1.1 TLSv1.2; }然后檢查配置文件語法,創建 index.html 并啟動 nginx 服務,如下:
[root@masternode vhost]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@masternode vhost]# mkdir -p /data/www/nginx/moonxy [root@masternode vhost]# vim /data/www/nginx/moonxy/index.html This is SSL test for moonxy.com [root@masternode vhost]# systemctl start nginx [root@masternode vhost]# ps aux |grep nginx root 8810 0.0 0.2 125008 2144 ? Ss 16:31 0:00 nginx: master process /usr/sbin/nginx nginx 8811 0.0 0.3 125404 3192 ? S 16:31 0:00 nginx: worker process root 8813 0.0 0.0 112708 976 pts/0 R+ 16:31 0:00 grep --color=auto nginx然后在本地 hosts 文件中配置域名映射:
C:\Windows\System32\drivers\etc 192.168.150.140 www.moonxy.com moonxy.com使用 Chrome 瀏覽器訪問 https://moonxy.com。
?
四、通過阿里云申請證書
可以通過阿里云申請免費的賽門鐵克(Sysmantec)SSL 證書,注意右側顯示的購置費用為 0.00,如下
?
總結
以上是生活随笔為你收集整理的Nginx 配置 SSL 及 HTTPS 协议通信过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【面向对象】面向对象程序设计测试题13-
- 下一篇: Nginx —— 检查配置文件ngi