https取代http是大势所趋,越来越多的网站都改用https了。从16年起,苹果公司就要求开发者使用https替代http,前期还可以通过调整应用的配置允许http通信,到后来使用https成了强制要求。
对于个人开发者和小公司而言,很多时候不过是在服务器进行一些简单的数据、文件存储,对安全性也没什么要求,似乎没有使用https的迫切需要,然而,如果你要发布iOS应用,就必须支持https,这当然会给开发工作带来一些麻烦。另一方面,以前使用联通网络时,浏览网页偶尔就会莫名其妙地出现联通版iPhone的广告等,如果以后大家都使用https,运营商就不容易乱放广告了,呵呵~
搞https就得申请ssl证书,我们可以自己给自己签发ssl证书,当然,浏览器是不承认的,所以还是得找权威机构。赛门铁克这些公司颁发证书要收保护费,有无免费的呢?现在一些云服务器提供商已经可以提供免费的ssl证书,但是必须使用其提供的云服务,限制比较大,另外发现能够免费提供ssl证书的机构有startssl和Let’ s Encrypt。
我使用了startssl提供的证书服务,但是好景不长,startssl被360偷偷收购了,和沃通一起,没有进行收购信息披露。谷歌、狐狸等要求证书机构在规定日期前更新加密算法,而startssl和沃通不按规矩办事,在截至日期之后继续使用过期的加密算法,并且作弊把证书签发日期改到截至日期之前,欺骗大家感情,这一行为最终暴露了,于是苹果、谷歌、狐狸等移除了startssl和沃通的根证书,相应地,使用他们的证书的网站就不被信任了,至少是一年的时间。
现在只好使用Let’ s Encrypt提供的证书了,Let’ s Encrypt的证书怎么搞到手呢?转载一个比较详细的交错:
https://blog.itnmg.net/letsencrypt-ssl/
原文作者:IT农民工
Let’ s Encrypt是一个免费的 SSL/TLS 证书发行机构,证书有效期为90天,到期前30内可续期,实现永久免费.
本次安装使用的服务器配置:
DigitaIOcean VPS+ CentOS 7 + Nginx 1.9.12
Let’ s Encrypt SSL 证书的的获取并不是像其他网站一样,在页面上填写资申请证书,而是需要在域名所在的服务器上安装一个客户端(python写的)去获取证书和续期.
使用 Certbot 客户端
Certbot客户端是现在官方推荐的客户端
客户端安装
yum install certbot
获取证书
申请过程中要验证绑定的域名是否属于申请人,其原理就是申请人在域名所在的服务器上申请证书,然后 Let’ s Encrypt 会访问绑定的域名与客户端通信成功即可通过.
这 个验证的方法有两种,一种需要停止当前的 web server 服务,让出 80 端口,由客户端内置的 web server 启动与 Let’ s Encrypt 通信. 另一种不需要停止当前 web server,但需要在域名根目录下创建一个临时目录,并要保证外网通过域名可以访问这个目录.
#创建临时目录,可能要修改Nginx rewrite 规则才能从外网访问 mkdir -p /usr/share/Nginx/html/.well-known/acme-challenge #--webroot 参数:指定使用临时目录的方式. -w 参数:指定后面-d 域名所在的根目录,如果一次申请多个域的,可以附加更多 -w...-d... 这段. certbot certonly --webroot --email admin@itnmg.net -w /usr/share/Nginx/html -d blog.itnmg.net -d itnmg.net -d www.itnmg.net
执行此命令后会生成证书,保存在 /etc/letsencrypt/live 中对应的域名目录下面,其实这里面并不是真正的证书文件,而是通过链接的形式链到了 /etc/letsencrypt/archive 中对应的域名目录下.
证书自动续期
renew 参数是官方推荐的续期方式,使用这个参数会遍历 /etc/letsencrypt/live 下所有的证书,如果证书在可续期的时间范围内(过期前30天内),就会申请新的证书并替换原有证书,否则跳过.
#使用 --dry-run 参数测试续期命令,使用这个参数并不会真正续期证书 certbot renew --dry-run #正式续期证书 certbot renew
设置定时自动续期
可以将 certbot renew 命令加入到 cron 中定时执行
#--quiet 参数表示禁止输出除了错误信息以外的任何信息 certbot renew --quiet
加入定时任务中
nano /etc/crontab
@H_301_58@我这里设置为每月28号23点执行此脚本. 更新证书后重启 Nginx.
#分 时 日 月 星期 执行用户 执行命令 0 23 28 * * root certbot renew --quiet && systemctl restart Nginx
#加载定时任务,使之生效 crontab /etc/crontab #查看任务 crontab -l
使用官方客户端
客户端安装
Let’ s Encrypt 的客户端托管在github上,每次运行客户端都会先自动升级,再运行最新的客户端,所以需要安装 git. 因为是 python 写的程序,所以需要安装 python.
yum install git python
@H_301_58@下载客户端,放到某路径下
@H_301_58@
git clone https://github.com/letsencrypt/letsencrypt
@H_301_58@运行一次客户端,自动检查升级,请确保内存足够多,大概要几十兆吧.
@H_301_58@
cd letsencrypt ./letsencrypt-auto --help
如果没什么问题,会显示帮助文档.
通过客户端 web server 获取证书
#停止Nginx systemctl stop Nginx #获取证书,--standalone 参数:使用内置web server. --email 参数:管理员邮箱,证书到期前会发邮件到此邮箱提醒. -d 参数:要绑定的域名,同一域的不同子域都要输入. ./letsencrypt-auto certonly --standalone --email admin@itnmg.net -d blog.itnmg.net -d itnmg.net -d www.itnmg.net #启动Nginx systemctl start Nginx
@H_301_58@
#创建临时目录,可以附加更多 -w...-d... 这段. ./letsencrypt-auto certonly --webroot --email admin@itnmg.net -w /usr/share/Nginx/html -d blog.itnmg.net -d itnmg.net -d www.itnmg.net
@H_301_58@完成上面的操作即可获得 SSL 证书,保存在 “/etc/letsencrypt/live/根域名/” 目录下,会产生 4 个文件,其中3个证书文件,1个私钥文件. 不要移动证书的位置,以免续期时出现错误.
证书续期的命令如下
./letsencrypt-auto renew
@H_301_58@如果要指定更新某个域名的证书,则要使用 certonly 参数,其实和新申请证书时的命令差不多.
./letsencrypt-auto certonly --webroot --renew-by-default --email admin@itnmg.net -w /usr/share/Nginx/html -d blog.itnmg.net -d itnmg.net -d www.itnmg.net
通过 cron 运行脚本的方式可以实现定时续期,官方提供了脚本示例.https://letsencrypt.org/getting-started/最下面
最终脚本如下
#!/bin/sh #停止 Nginx 服务,使用 --standalone 独立服务器验证需要停止当前 web server. systemctl stop Nginx if ! /path/to/letsencrypt-auto renew -nvv --standalone > /var/log/letsencrypt/renew.log 2>&1 ; then echo Automated renewal Failed: cat /var/log/letsencrypt/renew.log exit 1 fi #启动 Nginx systemctl start Nginx
将这段脚本保存为 letsencrypt-renew.sh
添加可执行权限
chmod +x letsencrypt-renew.sh
@H_301_58@编辑 crontab 配置文件或执行 crontab -e 添加 cron 任务
nano /etc/crontab
@H_301_58@我这里设置为每月28号23点执行此脚本.
#分 时 日 月 星期 执行用户 执行命令 0 23 28 * * root /脚本目录/letsencrypt-renew.sh
保存退出即可.
配置 Nginx SSL 证书
nano /etc/Nginx/conf.d/default.conf@H_301_58@找到 SSL 证书对应域名的 Server 段,修改为如下设置(根据自身需求做调整)
#设置非安全连接永久跳转到安全连接 server{ listen 80; server_name blog.itnmg.net *.blog.itnmg.net itnmg.net www.itnmg.net; #告诉浏览器有效期内只准用 https 访问 add_header Strict-Transport-Security max-age=15768000; #永久重定向到 https 站点 return 301 https://$server_name$request_uri; } server { #启用 https,使用 http/2 协议,Nginx 1.9.11 启用 http/2 会有bug,已在 1.9.12 版本中修复. listen 443 ssl http2; server_name blog.itnmg.net *.blog.itnmg.net itnmg.net www.itnmg.net; #告诉浏览器当前页面禁止被frame add_header X-Frame-Options DENY; #告诉浏览器不要猜测mime类型 add_header X-Content-Type-Options nosniff; root /usr/share/Nginx/html/wordpress; #证书路径 ssl_certificate /etc/letsencrypt/live/itnmg.net/fullchain.pem; #私钥路径 ssl_certificate_key /etc/letsencrypt/live/itnmg.net/privkey.pem; #安全链接可选的加密协议 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #可选的加密算法,顺序很重要,越靠前的优先级越高. ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-RC4-SHA:!ECDHE-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:HIGH:!RC4-SHA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!CBC:!EDH:!kEDH:!PSK:!SRP:!kECDH; #在 SSLv3 或 TLSv1 握手过程一般使用客户端的首选算法,如果启用下面的配置,则会使用服务器端的首选算法. ssl_prefer_server_ciphers on; #储存SSL会话的缓存类型和大小 ssl_session_cache shared:SSL:10m; #缓存有效期 ssl_session_timeout 60m; #省略后面与证书无关的设置 }
保存配置,重新加载 Nginx 配置或重启.
#重新加载配置 systemctl reload Nginx #或重启Nginx systemctl restart Nginx
到这步,Nginx 的 SSL 证书就配置完成了,打开浏览器访问网站就会启用 https,看到绿色安全锁的图标.
规范页面中的链接
如果你发现浏览器中的安全锁上带有叹号,说明页面中引用到了非 https 的链接,你可能要花上一点时间来修改这些链接,如果是本站资源,可以使用相对地址,如果是外部资源,要先看外部资源是否支持 https,如果支持改为 https 地址即可,如果不支持则要想办法替换为 https 资源或将资源保存到本地并使用相对地址.