Nginx HTTPS 配置

2014-12-27 web linux software

简单介绍如何使用 Nginx 搭建 https 服务。

简介

在 CentOS 中,默认根目录为 /usr/share/nginx/html ,这里使用域名 www.foobar.com 测试,直接将配置添加到 /etc/hosts 文件中。

127.0.0.1   www.foobar.com

1. 确认支持 SSL

通过 -V 参数查看编译时是否添加了 --with-http_ssl_module 参数,对于 CentOS 来说,一般是已经安装了的,否则需要重新从源码编译。

2. 生成证书

可以通过以下步骤生成一个简单的自签名证书,保存在 /etc/pki/nginx 目录下。

2.1 生成自签 CA 证书

对于私钥需要妥善保存。

----- 生成根证书私钥pem,也可以通过AES进行加密
openssl genrsa -out cakey.pem 2048
openssl genrsa -aes256 -passout pass:123456 -out cakey.pem 2048

----- 生成根证书签发申请文件csr
openssl req -new -key cakey.pem -out ca.csr    \
	-subj "/C=CN/ST=MyProvince/L=MyCity/O=MyOrganization/OU=MyGroup/CN=MyCA"

----- 自签发根证书 cer
openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey cakey.pem -in ca.csr -out cacert.pem

2.2 生成服务端私钥和证书

----- 生成服务端私钥
openssl genrsa -out key.pem 2048

----- 生成证书请求文件
openssl req -new -key key.pem -out server.csr  \
	-subj "/C=CN/ST=MyProvince/L=MyCity/O=MyOrganization/OU=MyGroup/CN=*.foobar.com"

----- 使用根证书签发服务端证书
openssl x509 -req -days 365 -sha1 -extensions v3_req -CA cacert.pem     \
	-CAkey cakey.pem -CAserial ca.srl -CAcreateserial -in server.csr -out cert.pem

----- 使用CA证书验证server端证书
openssl verify -CAfile cacert.pem cert.pem

注意上述的 CN 设置,需要匹配访问的网站,可以使用通配符 *,不过只能匹配一级,上述可以满足 www.foobar.com 但不能满足 main.www.foobar.com 域名。

3. 修改配置文件

在默认的配置文件 /etc/nginx/nginx.conf 文件中,添加如下的内容。

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  www.foobar.com;
    rewrite ^(.*) https://$server_name$1 permanent;
}

server {
    listen       443 ssl default_server;
    listen       [::]:443 ssl default_server;
    server_name  www.foobar.com;
    root         /usr/share/nginx/html;

    ssl_certificate "/etc/pki/nginx/cert.pem";
    ssl_certificate_key "/etc/pki/nginx/key.pem";
}

会将 http 的请求跳转到 https 中。

4. 重启 Nginx

需要注意的是,如果采用 systemctl 重启,上述的配置不能保存在 tmp 目录下,因为 systemd 会为进程启动不同的 tmp 目录,从而导致无法查找到上述的配置文件。

这样就可以访问 https://www.foobar.com,注意需要将 www.foobar.com 添加到 /etc/hosts 中。另外,还可以加入如下代码实现 80 端口重定向到 443。

server {
    listen 80;
    server_name www.foobar.com;
    rewrite ^(.*) https://$server_name$1 permanent;
}

不过现在无法识别根证书,在访问时会有些安全提示,对于不同的浏览器可以通过如下方式设置。

Firefox

Preference->Privacy&Security->Certificates->Certificate Manager 选项中导入上述生成的 cacert.pem 文件即可,列表中是按照 Organize 排序的。

5. 其它

在 2 中的配置中,可设置密钥,此时会在重启 nginx 时输入密码,不过会导致 systemctl 失效。

TLSv1.3

通过 -V 参数检查编译时使用的 OpenSSL 版本,

server {
	... ...
	ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1;
	#ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256;
	... ...
}

验证

可以通过如下方式进行验证。

$ openssl s_client -connect www.foobar.com:443 -tls1_3
... ...
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
... ...

或者打开浏览器也可以看到具体的 TLS 版本号。