nginx配置ssl证书

nginx配置ssl证书

Scroll Down

本博客服务是搭在腾讯云服务器上的,所以从腾讯云这边申请的免费SSL,下面将详细描述配置SSL的过程。

本文将以 www.domain.com 域名为例, 将证书下载下来,放到nginx目录下的conf文件夹,本文将放到conf下的ssl文件夹,详细配置如下:

单域名SSL证书配置


server {
	listen 80;
	#被重写的域名,要保证优先匹配到,如果已经被其他的先匹配到将不会走此逻辑,也就不会被重写到https
	server_name www.domain.com; 
	#把http的域名请求转成https
	rewrite ^(.*)$ https://$host$1 permanent; 
}

upstream blog_server{
	server localhost:8080;
}

server {
     #SSL 访问端口号为 443
     listen 443 ssl; 
     #填写绑定证书的域名
     server_name www.domain.com; 
     #启用 SSL 功能
     ssl on;
     #证书文件名称   填写绝对路径
     ssl_certificate /usr/local/nginx/conf/ssl/1_www.domain.com_bundle.crt; 
     #私钥文件名称   填写绝对路径
     ssl_certificate_key /usr/local/nginx/conf/ssl/2_www.domain.com.key; 
     ssl_session_timeout 5m;
     #请按照以下协议配置
     ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
     #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
     ssl_prefer_server_ciphers on;
     location / {
	 # 具体的服务地址,本文使用upstream
         proxy_pass http://blog_server;
     }
 }

如果有多个域名要配置,请参照下面配置,没有请跳过

多域名SSL证书配置


# 增加blog.domain.com
server {
	listen 80;
	server_name www.domain.com blog.domain.com; 
	rewrite ^(.*)$ https://$host$1 permanent; 
}

upstream blog_server{
	server localhost:8080;
}

server {
     listen 443 ssl; 
     server_name www.domain.com; 
     ssl on;
     #证书文件名称   填写绝对路径
     ssl_certificate /usr/local/nginx/conf/ssl_www/1_www.domain.com_bundle.crt; 
     #私钥文件名称   填写绝对路径
     ssl_certificate_key /usr/local/nginx/conf/ssl_www/2_www.domain.com.key; 
     ssl_session_timeout 5m;
     ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
     ssl_prefer_server_ciphers on;
     location / {
         proxy_pass http://blog_server;
     }
 }
# 增加blog.domain.com域名
server {
     listen 443 ssl; 
     server_name blog.domain.com; 
     ssl on;
     ssl_certificate /usr/local/nginx/conf/ssl_blog/1_blog.domain.com_bundle.crt; 
     ssl_certificate_key /usr/local/nginx/conf/ssl_blog/2_blog.domain.com.key; 
     ssl_session_timeout 5m;
     ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
     ssl_prefer_server_ciphers on;
     location / {
         proxy_pass http://blog_server;
     }
 }

以上我们nginx的配置文件已经配置完成了,我们nginx -t 检查一下配置文件是否正确,果然不会这么顺利,意料之中的报错了

处理报错

[emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:xxx

这个错误是缺少了ssl模块,我们只需要添加上即可,如下操作

1. 安装OpenSSL
yum -y install openssl openssl-devel
2. 在nginx安装目录 下执行
./configure --with-http_ssl_module
3. 运行命令 make    一定不要使用make install这样会覆盖安装
4. 然后备份原有已安装好的nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
5. 将刚刚编译好的nginx覆盖掉原有的nginx
cp ./objs/nginx /usr/local/nginx/sbin/
6. 通过命令查看是否已经加入成功
 /usr/local/nginx/sbin/nginx -V
提示包含 configure arguments: --with-http_ssl_module说明没有问题

接下我们再执行nginx -t 出现如下日志则表示到目前为止我们的操作是正确的:

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

接下来执行nginx -s reload

测试

  1. 访问 https://www.domain.com 成功
  2. 访问 http://www.domain.com 跳转到 https://www.domain.com 成功