申请SSL证书

在阿里云申请一个免费的SSL证书(证书有效期一年,到期需要重新申请并配置),申请时需要填写要绑定的域名(可绑定一个3级域名,不支持通配符域名);
根据SSL证书服务商的配置提示,在域名服务中配置解析并提审(TXT的记录类型,使用阿里云自己的域名会自动配置),等待证书签发生效;
证书生效后,下载证书文件(选择nginx类型的),共有”xxx.pem”,”xxx.key”两个文件;

nginx配置

在nginx目录下的conf目录下创建cert目录(可自定义目录名,记得配置中也改成一样的目录名),将证书文件复制进去;
由于nginx上已配置好http方式的域名解析(参考链接),只需要新增https配置;
打开nginx目录下的conf目录,nginx.conf文件中http下的配置中增加以下配置(可以参考http方式使用include导入配置文件):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
upstream my-upstream {
server localhost:10001;
}
server {
listen 443;
server_name www.xxx.com; #替换成自己的域名
ssl on; #设置为on启用SSL功能。
ssl_certificate cert/xxx.pem; #替换成自己的SSL证书
ssl_certificate_key cert/xxx.key; #替换成自己的SSL证书密钥
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #使用此加密套件。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #使用该协议进行配置。
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://my-upstream; #替换为自己的upstream配置(反向代理)
proxy_redirect default;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 240;
proxy_send_timeout 240;
proxy_read_timeout 240;
}
}

配置完成后,重启nginx:”nginx -s reload”即可;

遇到的问题

设置SSL后更新nginx配置时提示“nginx:[emerg]unknown directive ssl”

原因:安装的Nginx没有带SSL模块,需要安装带SSL的Nginx程序
解决方法,参考链接

1
2
3
4
5
1.cd到nginx安装文件目录
2.执行命令:"./configure --with-http_ssl_module" (如果服务器未安装OpenSSL则先安装:"yum -y install openssl openssl-devel")
3.执行命令:"make" //记住不要执行"make install"
4.cd到安装目录下的"objs"目录,目录中的"nginx"文件就是增加SSL库编译后的程序文件,替换掉原nginx的程序文件(sbin目录下)即可
5.停止nginx("nginx -s stop"),再重新启动("nginx")

配置正常但无法访问https
1
2
3
4
1.可能是服务器限制了443端口对外访问:到云服务器的控制台,添加安全组规则,增加443端口
2.可能是服务器防火墙限制了443端口,服务器的防火墙开启443端口(未遇到这种情况)
"firewall-cmd --zone=public --add-port=443/tcp --permanent" //增加443端口
"firewall-cmd --reload" //重启防火墙
nginx reload后未占用443端口

原因:重新安装带SSL的nginx程序后,只是reload不会启动SSL服务,需要停止nginx后再重新启动

1
2
1.使用命令:"lsof -i:443",看下nginx是否占用此端口,如被其它应用占用则关掉此应用;
2.停止nginx("nginx -s stop"),再重新启动("nginx");