Nginx配置https安全站点

Https是以安全为目标的http通道,简单讲是http的安全版。由于https是通过认证用户与服务器,相比http模式,https采用加密方式以防数据中途被盗取,大大降低了第三方窃取信息、篡改冒充身份的风险。

之前https被广泛用于万维网上安全敏感的通讯,例如交易支付方面,而现在越来越多的网站应用也开始加入https大家族中了,有了https,你的站点会被大多数主流浏览器标记为绿色的安全标识。最近又听说谷歌浏览器从今年7月份起将所有的http网站标记为不安全,所以赶快升级你的网站吧。

要在你的网站上启用https,需要从证书颁发机构(CA)获取证书(这种证书是以文件形式存在)。市面上大多的证书颁发机构都是颁发的证书需要收费,而且价格不菲,对个人和小型站点应用来说是一笔不小的开支。今天我给大家介绍几种获取免费CA证书的渠道以及如何在Nginx上配置https。

自签ssl证书实现https连接

自签ssl证书适用于站点没有域名的情况、用作测试,比如我们在公司局域网内架设一个站点应用,直接用ip+端口访问即可。自签证书不好的地方就是不受浏览器信任,在浏览器的地址栏一直会标红,并且初次访问站点时浏览器会发出警告提示,同意后才能正常访问,如下图。

202203131827249415720000

1.使用OpenSSL创建证书

建立服务器私钥(过程需要输入密码,请记住这个密码)生成RSA密钥

openssl genrsa -des3 -out server.key 1024
知识兔

生成一个证书请求

openssl req -new -key server.key -out server.csr
知识兔

需要依次输入国家,地区,组织,email。最重要的是有一个common name,可以写你的名字或者域名。生成的csr文件交给CA签名后形成服务端自己的证书。

#-------------------------------------------------------------------------------------------
Enter pass phrase for server.key:                    #之前输入的密码
Country Name (2 letter code) [XX]:                   #国家
State or Province Name (full name) []:                 #区域或是省份
Locality Name (eg, city) [Default City]:                #地区局部名字
Organization Name (eg, company) [Default Company Ltd]:         #机构名称:填写公司名
Organizational Unit Name (eg, section) []:               #组织单位名称:部门名称
Common Name (eg, your name or your server's hostname) []:     #网站域名
Email Address []:                             #邮箱地址
A challenge password []:                         #输入一个密码,可直接回车
An optional company name []:                   #一个可选的公司名称,可直接回车
#------------------------------------------------------------------------------------------
知识兔

输入完这些内容,就会在当前目录生成server.csr文件:

cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
知识兔

使用上面的密钥和CSR对证书进行签名。

然后用以下命令生成证书:

openssl x509 -req  -days 365 -sha256   -in server.csr -signkey server.key -out server.crt
知识兔

这样,证书生成完毕!然后把当前目录下生成的server.key和server.crt两个文件拷贝到nginx的安装配置目录下:/usr/local/nginx/conf/ssl/,ssl目录自建。

2.Nginx下ssl配置

关于站点配置,不熟悉的同学可以先看下本站文章:《Nginx配置多域名多站点》。

要实现https访问,这样配置:

server {
    listen 443 ssl default_server;
    server_name _;
    index index.html index.htm index.php;
    ssl on;
    ssl_certificate      ssl/server.crt;
    ssl_certificate_key  ssl/server.key;
}
知识兔

保存并重新启动Nginx后,直接再浏览器地址栏输入 https://你的ip/ 访问试下看。

使用Certbot免费https证书

Let’s Encrypt是一个免费的自动的CA认证机构,借助Certbot,可以自动傻瓜式安装和续期。如果你的Nginx是yum安装的,请看这里。如果是源码安装:《CentOS7使用源码编译安装Nginx》,需要做一些修改:

yum -y install yum-utils
yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional

yum install certbot
知识兔

安装好certbot后,执行:

certbot certonly
知识兔

然后配置,/home/www/mysite是站点目录,-d后面跟域名,可以是多个。

certbot certonly --webroot -w /home/www/mysite -d mysite.com -d www.mysite.com
知识兔

生成的证书位置:

ssl_certificate /etc/letsencrypt/live/cdw.me/fullchain.pem; #证书位置

ssl_certificate_key /etc/letsencrypt/live/cdw.me/privkey.pem; #私钥位置

然后修改站点配置文件重启nginx即可。

Let’s Encrypt证书是90天的有效期,到期可以续签,无限次数免费续签证书,可以使用crontab添加定时任务,比如每个月执行一次更新证书任务。

首先写一个脚本renew-cert.sh:

#!/bin/bash

# 停止nginx
/usr/local/nginx/sbin/nginx -s stop

# 续签
# --force-renew 强制更新
/root/certbot-auto renew --force-renew

# 启动nginx
/usr/local/nginx/sbin/nginx
知识兔

给予执行权限:

a+x renew-cert.sh
知识兔

添加到crontab定时任务,每两个月 自动 更新 证书:

* * * */2 * /root/renew-cert.sh >> /root/crontab.log 2>&1
知识兔

使用阿里云和腾讯云免费证书

如果你有阿里云或腾讯云账号,可以登录到控制台,找到ca证书栏目,然后申请一个免费的CA证书。免费证书一般使用期限是一年,一年到期后可以再次申请免费证书。

这些证书都需要验证是否是域名或站点拥有者。

202203131827263359130001

申请腾讯云免费证书

202203131827277628040002

申请阿里云免费证书

免费证书申请成功后,直接下载证书,然后按照官方说明文档配置nginx即可,本文不再详述。

最后补充一点,可以配置http站点301跳转到https站点,如:

server {
    listen 80;
    server_name www.mysite.com;
    return 301 https://www.mysite.com$request_uri;
}
知识兔
计算机