一些概念
在動手操作前先明確一些概念與原理。首先是http與https,簡單來說http使用的是明文傳輸,不安全,而https傳輸的信息是加密過的,比較安全。提到https,它又牽扯到SSL/TLS, 在此一併講一講,https的字母s代表安全(secure),安全這個功能由SSL/TLS協議來實現。SSL("Secure Sockets Layer)出現的時間比較早,由netspace公司搞出來的,有趣的是它從未發佈過1.0版本,直接在1995年的時候隨着netspace瀏覽器發佈了2.0版本,當年netspace和微軟的瀏覽器之爭在《浪潮之巔》中描述的比較精彩。1999年TLS 1.0發佈(其實就是SSL 3.1,SSL改名了!),再到後來2006年TLS1.1發佈,2018年TLS1.3已經發布,而SSL作爲一個古董已經退出了歷史舞臺。
https是如何工作的?
來看看https是如何工作就能知道爲什麼說它是安全的。參考博客[6]
實踐
實踐前須知
以下操作參考文章[3],將在CentOS7上執行,使用Nginx作爲web服務器,使用自己頒發的證書,所以,由於它不是CA頒發的,瀏覽器無法驗證服務器的身份,當我們訪問服務器的時候瀏覽器會提示它不安全。之所以要自己給自己頒發證書是有原因的,例如沒有域名,或者服務器在私網內,如果是在公網有域名最好用CA頒發的證書,其操作與本文有差異,需要另行參考。
安裝Nginx並配置防火牆
安裝Nginx:
yum install epel-release
yum install -y nginx
systemctl start nginx
systemctl status nginx
systemctl enable nginx
配置防火牆
#如果使用的是firewalld
firewall-cmd --add-service=http
firewall-cmd --add-service=https
firewall-cmd --runtime-to-permanent
#如果使用的是iptables
iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT
現在,在瀏覽器中輸入服務器的ip就可以看到Nginx的默認頁面了。
創建SSL證書
TLS/SSL採用非對稱加密,服務器拿着私鑰,客戶端拿着公鑰(公共證書)。
在服務器上/etc/ssl/certs
目錄用來存放公鑰(公共證書),檢查其是否存在,不存在則創建,再創建一個/etc/ssl/private
目錄用來存入私鑰:
mkdir /etc/ssl/private
chmod 700 /etc/ssl/private
使用OpenSSL創建證書:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
執行命令後會提示輸入一些信息,注意其中的Common Name
,輸入域名或者服務器IP,後面會用這個。
生成Diffie-Hellman(DH)組:
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
生成的文件將會用於Nginx的配置。
配置Nginx
在/etc/nginx/conf.d
目錄下創建一個ssl.conf
文件並編輯它:
vi /etc/nginx/conf.d/ssl.conf
輸入如下內容:
server {
listen 443 http2 ssl;
listen [::]:443 http2 ssl;
server_name server_IP_address; # 修改爲前面寫的server_name
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
# 額外配置
# ...
# 自己的一些配置
# ...
}
server_name
即前面生成證書的時候填的,ssl_certificate_key
、ssl_certificate_key
、ssl_dhparam
也是前面生成的文件,填寫相應的路徑。
到此最基本的配置就完成了,當然,這個配置文件裏可能還有一些額外配置(例如加強安全、將http重定向到https)以及自己項目所需配置,可自行配置。接下來讓Nginx生效:
# 檢查配置文件是否有錯
nginx -t
# 重啓Nginx
systemctl restart nginx
這個時候在瀏覽器中輸入https://IP
就可以訪問了,瀏覽器會提示網站不安全繼續瀏覽就好了,需要注意的是http不會被禁止掉,輸入http依然能夠訪問,需要不想讓人使用http需要配置重定向,將http重定向到https。
Nginx額外配置(可選)
將http重定向到https
新建文件:
vi /etc/nginx/default.d/ssl-redirect.conf
輸入如下內容:
return 301 https://$host$request_uri/;
然後重啓Nginx即可。
參考:
[1] https://www.geeksforgeeks.org/whats-difference-http-https/
[2] https://howhttps.works/https-ssl-tls-differences/
[4] https://en.wikipedia.org/wiki/X.509
[5] https://en.wikipedia.org/wiki/Diffie–Hellman_key_exchange