青蛙學Linux—Nginx提供HTTPS服務

傳統的HTTP協議傳輸的是明文信息,這就致使了必定的安全風險。而HTTPS則解決了這一問題,HTTPS在HTTP協議的基礎上增長了SSL/TLS,用於經過證書來驗證服務器的身份,而且爲客戶端和服務器之間的通訊提供加密服務。如今大部分的網站都開始使用HTTPS協議提供服務。html

使用HTTPS協議須要先向CA申請一個SSL證書,其使用的端口號爲443而不是HTTP的80端口。

一、CA和SSL證書類型

CA,Certificate Authority,證書頒發機構,負責發放和管理數字證書的權威機構,並作爲受信任的第三方,承擔公鑰體系中公鑰的合法性驗證。CA制定政策和具體步驟來驗證、識別用戶身份,並對用戶證書進行簽名,以確保證書持有者的身份和公鑰的擁有權。node

根據使用環境的不一樣,SSL證書可分爲如下幾種:nginx

  • 加強型SSL證書(EV SSL,即爲Extended Validation SSL),適合銀行金融類電子商務網站(網上購物)使用,證書裏顯示單位名稱,顯示綠色地址欄;有EV超安SSL和EV超安SSL Pro兩個型號
  • 機構驗證型SSL證書(OV SSL, 即爲Organization Validation SSL),適合電子商務、電子政務網站、企事業單位管理系統、電子郵件系統使用,證書裏顯示單位名稱; 有OV超真 SSL和OV 超真SSL Pro兩個型號
  • 我的驗證型SSL證書(IV SSL,即爲IdentityValidation SSL),適用於我的專業網站使用,顯示我的姓名
  • 域名驗證型SSL證書(DV SSL 即爲Domain Validation SSL),不顯示任何信息,是最基礎級的SSL 證書。一般是驗證域名下某個指定文件的內容,或者驗證與域名相關的某條 TXT 記錄

二、申請SSL證書

SSL使用的是公鑰私鑰體系,因此向CA申請SSL證書前必須先生成一個私鑰文件(.key)並使用該私鑰簽署一個證書籤署請求文件(.crs),證書籤署請求文件包含申請者的DN(Distinguished Name,標識名)和公鑰信息。申請者將該文件提交給CA後,CA會向申請者返回一個證書文件(.crt)。算法

可以使用openssl來生成私鑰和證書籤署請求文件,命令以下:shell

[root@localhost ~]# openssl req -new -newkey rsa:2048 -sha256 -nodes -out abc.csr -keyout abc.key -subj '/C=CN/ST=fujian/L=fuzhou/O=abc Inc./OU=Web/CN=abc.com'

命令詳解:生成一個新的RSA密鑰並輸出abc.csr和abc.key兩個文件。瀏覽器

  • -nodes:私鑰不加密,若是不加該參數,則訪問私鑰時須要輸入密碼
  • C:Country,表示所在國家,使用兩位數的國家縮寫
  • ST:State/Province,所在的州或省
  • L:Locality,所在的城市或縣區
  • O:Organization,此網站所屬的單位|公司|我的的名稱
  • OU:Organization Unit,下屬部門,也用於顯示其餘證書相關信息,如證書類型、證書產品名稱、身份驗證類型或驗證內容等
  • CN:Common Name,網站的域名

命令執行後會在當前目錄下生成abc.csr和abc.key兩個文件。其中的abc.csr就能夠提交給CA以申請SSL證書,CA經過驗證後會提供給咱們證書文件。緩存

因爲這裏的域名abc.com沒有進行域名解析,CA是沒法驗證這個域名的,因此也沒法爲它頒發證書。爲了解決這種狀況,咱們可使用openssl本身頒發一張證書,固然,這張證書是沒有通過認證的,使用時就會發現問題了。運行如下命令:安全

[root@localhost nginx]# openssl req -new -newkey rsa:2048 -sha256 -nodes -x509 -days 365 -out abc.crt -keyout abc.key -subj '/C=CN/ST=fujian/L=fuzhou/O=abc Inc./OU=Web/CN=abc.com'

此時,當前目錄下會生成abc.crt和abc.key兩個文件。服務器

三、Nginx配置HTTPS

Nginx的配置文件中已經有一段關於HTTPS的配置,內容以下:session

# HTTPS server
#
#server {
#    listen       443 ssl;
#    server_name  localhost;

#    ssl_certificate      cert.pem;
#    ssl_certificate_key  cert.key;

#    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;
#    }
#}

詳解:

  • ssl_certificate:指定證書文件crt的路徑,可使用絕對路徑或相對路徑
  • ssl_certificate_key:指定私鑰文件key的路徑
  • ssl_session_cache:設置session緩存
  • ssl_session_timeout:session的超時時間
  • ssl_ciphers:選擇加密套件和加密算法,不一樣瀏覽器支持的套件順序可能不一樣,這裏使用默認值
  • ssl_prefer_server_ciphers:在與客戶端協商加密算法時,優先使用服務端的加密套件,on表示打開

還能夠添加如下設置:

  • ssl_protocols:啓動指定的加密協議,建議設置爲TLSv1 TLSv1.1 TLSv1.2,使用TLSv1.1和TLSv1.2要保證當前的openssl版本大於等於1.0.1;不建議使用SSLv3,由於存在一些容易被攻擊的漏洞
  • add_header X-Frame-Options:加強安全,設置爲DENY表示減小點擊劫持
  • add_header X-Frame-Options:加強安全,設置爲nosniff表示禁止服務器自動解析資源類型
  • add_header X-Xss-Protection:加強安全,設置爲1表示防止XSS攻擊

這裏爲這臺運行Nginx的主機的www.abc.com配置了HTTPS,並在客戶端hosts文件中作了本地解析,而後訪問https://www.abc.com:

1

安裝的ESET殺毒軟件跳出了安全警告,不信任的證書。

2

由於SSL證書沒有通過CA的認證,因此火狐也阻止了。可是已經出現了證書的驗證信息,就說明Nginx的HTTPS配置成功。

相關文章
相關標籤/搜索