一些概念
在动手操作前先明确一些概念与原理。首先是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
[6] https://blog.youkuaiyun.com/sean_cd/article/details/6966130