Https是以安全为目标的http通道,简单讲是http的安全版。由于https是通过认证用户与服务器,相比http模式,https采用加密方式以防数据中途被盗取,大大降低了第三方窃取信息、篡改冒充身份的风险。
之前https被广泛用于万维网上安全敏感的通讯,例如交易支付方面,而现在越来越多的网站应用也开始加入https大家族中了,有了https,你的站点会被大多数主流浏览器标记为绿色的安全标识。最近又听说谷歌浏览器从今年7月份起将所有的http网站标记为不安全,所以赶快升级你的网站吧。
要在你的网站上启用https,需要从证书颁发机构(CA)获取证书(这种证书是以文件形式存在)。市面上大多的证书颁发机构都是颁发的证书需要收费,而且价格不菲,对个人和小型站点应用来说是一笔不小的开支。今天我给大家介绍几种获取免费CA证书的渠道以及如何在Nginx上配置https。
自签ssl证书实现https连接
自签ssl证书适用于站点没有域名的情况、用作测试,比如我们在公司局域网内架设一个站点应用,直接用ip+端口访问即可。自签证书不好的地方就是不受浏览器信任,在浏览器的地址栏一直会标红,并且初次访问站点时浏览器会发出警告提示,同意后才能正常访问,如下图。
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证书。免费证书一般使用期限是一年,一年到期后可以再次申请免费证书。
这些证书都需要验证是否是域名或站点拥有者。
申请腾讯云免费证书
申请阿里云免费证书
免费证书申请成功后,直接下载证书,然后按照官方说明文档配置nginx即可,本文不再详述。
最后补充一点,可以配置http站点301跳转到https站点,如:
server {
listen 80;
server_name www.mysite.com;
return 301 https://www.mysite.com$request_uri;
}
知识兔