Nginx使用ssl


Nginx使用ssl

nginx往往通过反向代理屏蔽服务端,nginx使用ssl的可以让客户端使用https协议与nginx通信,在一定程度上保证整个链路的数据安全。

证书生成

自签CA与证书生成可参考《TLS证书与自签ca》

于是得到

文件 用途
ws-serverca.crt 服务端证书
ws-serverca.key 服务端私钥
ws-trust.crt 服务端可信的ca证书

nginx配置ssl

证书与私钥配置相对路径起点为位置为nginx安装目录,假设nginx安装目录下存在ssl文件夹

1
2
3
4
5
6
7
8
9
server {

listen 443;
server_name ip;# ip 或域名
ssl_certificate ssl/ws-serverca.crt;# 证书位置
ssl_certificate_key ssl/ws-serverca.key;# 证书私钥
ssl on;# 开启ssl
# 其它配置 ......
}

一般我们还会配置http请求的80端口重定向到443端口

1
2
3
4
5
server{
listen 80;
server_name ip;# ip 或域名
rewrite ^/(.*)$ https://ip:443/$1 permanent;
}

此配置方式为https的单向认证,一般自签证书使用这种方式较多

双向认证

前文介绍的是nginx使用ssl完成https单向认证的操作,此章节介绍双向认证。

1
2
3
4
5
6
7
8
9
10
11
12
server {

listen 443;
server_name ip;# ip 或域名
ssl_certificate ssl/ws-ssl-server.crt;# 证书位置
ssl_certificate_key ssl/ws-ssl-server.key;# 证书私钥
ssl on;# 开启ssl
ssl_client_certificate ssl/ws-ssl-client.cer; #客户端证书
ssl_verify_client on; # 开启客户端证书验证
ssl_trusted_certificate ssl/ws-trust.crt; # 信任的证书
# 其它配置 ......
}

ssl常用指令

  • ssl on | off;

    为指定的虚拟主机配置是否启用ssl功能,此功能在1.15.0废弃,使用listen [ssl]替代。

  • ssl_certificate server.crt;

    当前虚拟主机使用使用的证书文件,一般是crt文件

  • ssl_certificate_key server.key;

    当前虚拟主机使用的私钥文件,一般是key文件

  • ssl_client_certificate ssl client.cer;

    客户端证书

  • ssl_verify_client on;

    开启客户端证书验证

  • ssl_protocols [SSLv2][SSLv3][TLSv1][TLSv1.1][TLSv1.2]

    支持ssl协议版本,早期为ssl现在是TSL,默认为后三个

  • ssl_session_cache off | none | [builtin[:size]][shared:name:size];

    配置ssl缓存:off:关闭缓存;none: 通知客户端支持ssl session cache,但实际不支持;

    builtin[:size]:使用OpenSSL内建缓存,为每worker进程私有

    [shared:name:size]:在各worker之间使用一个共享的缓存,需要定义一个缓存名称和缓存空间大小,一兆可以存储4000个会话信息,多个虚拟主机可以使用相同的缓存名称。

  • ssl_session_timeout time;

    客户端连接可以复用ssl session cache中缓存的有效时长,默认5m(分钟)

关于证书格式:其实证书格式之间的差异几乎也就编码问题,后缀也并不能完全代表什么,每个软件支持的格式可能不一样,如tomcat和nginx的差异,能用就行,不能就转换格式。