HTTPS 是超文本传输协议和 SSL/TLS 的组合,用以提供加密通讯及对网络服务器身份的鉴定。HTTPS 可以保证客户端连接到的 Web 服务器是认证过的,连接过程是加密的,可以避免中间人攻击和窃听。下面介绍 Nginx 如何配置 HTTPS 服务器。
获取 SSL 证书
HTTPS 的信任继承基于预先安装在浏览器中的证书颁发机构。因此一个合法的HTTPS服务器必须从证书颁发机构处申请/购买证书。有很多证书颁发机构,大部分是要收费的,免费的有 StartSLL。
我的证书是从 StartSSL 申请的,具体过程就略过了,只要能看懂英文就没多大问题。证书申请完成后,会得到几个文件:
- ca.pem
StartSSL 的根证书 - sub.class1.server.ca.pem
证书链 - yourdomain.crt
你自己的证书 - yourdomain.key
你自己的密钥(非常重要,必须保密)
需要先合并证书链:
cat ca.pem sub.class1.server.ca.pem >> yourdomain.crt
然后把证书复制到 /etc/nginx/
中:
sudo cp yourdomain.crt yourdomain.key /etc/nginx/
配置 Nginx
配置 HTTPS 主机,必须在 server 配置块中打开 SSL 协议,还需要指定服务器端证书和密钥文件的位置:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name yourdomain;
ssl on;
ssl_certificate yourdomain.crt;
ssl_certificate_key yourdomain.key;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:1m;
root /home/user/www/yourdomain/html;
index index.html;
charset utf-8;
location / {
try_files $uri $uri/ =404;
}
error_page 404 /404.html;
}
有时可能需要 HTTP 自动跳转到 HTTPS,可以添加下面的 server 配置块:
server {
listen 80;
listen [::]:80;
server_name yourdomain;
rewrite ^/(.*)$ https://yourdomain/$1 permanent;
}
然后重启 Nginx 即可:
# Debian/CentOS 6
sudo service nginx restart
# Arch Linux
sudo systemctl restart nginx