Nginx 配置 HTTPS 服务器

日期: 06 月 24日, 2014
标签:

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