之前用 HTML5 Geolocation API 写定位的时候发现,Apple似乎开始强推SSL了,Ios10上的safari通过http访问是无法获取定位的。
去查了下资料,发现是iOS9中开始新增App Transport Security(简称ATS)特性, 主要使到原来请求的时候用到的HTTP,都转向TLS1.2协议进行传输。在 iOS 9 和 OS X 10.11 中,默认情况下非 HTTPS 的网络访问是被禁止的。甚至非 SSL 的网络请求无法通过APP审核。
Let's Encrypt提供免费的SSL证书申请,他的官方文档上推荐使用 Certbot ACME客户端来进行证书的申请,但是我这次介绍 acme.sh 这个用Shell编写的脚本来申请Let's Encrypt的证书。当然操作更加容易。
1、安装acme.sh
安装:
curl https://get.acme.sh | sh
当你看到 Install success! 第一步就代表完成了!
键入以下命令让acme.sh生效:
source ~/.bashrc
这一步其实是做了3个操作:
- 把 acme.sh 安装到 home 目录下:
~/.acme.sh/
- 创建 一个 bash 的 alias, 方便使用:
acme.sh=~/.acme.sh/acme.sh
- 创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书.
2、生成证书
文档提供了三种方式
- 在你域名的HTTP域名网站相应目录下放置一个文件,然后经过这个文件进行认证
- 在相应的域名上增加一个TXT解析.
- 使用相应的域名解析商(DNS服务商)的API使用相应的域名解析商(DNS服务商)的API的API")
翻了一下他的api文档,发现阿里云解析支持第三种方案
创建 Access Key
访问 https://ak-console.aliyun.com 选择创建 Access Key
申请单域名证书:
export Ali_Key="Access Key ID"
export Ali_Secret="Access Key Secret"
acme.sh --issue --dns dns_ali -d 域名.com -d www.域名.com
申请通配符
acme.sh --issue -d i79.me -d '*.i79.me' --dns dns_ali
OK 而且,刚刚添加的aliyun的 api 也已经保存到了 ~/.asme.sh/account.conf
,下一次不需要再输入
3、安装证书
注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.
在nginx目录下新建一个ssl目录
cd /etc/nginx
sudo mkdir ssl
暂时先给ssl目录777权限
sudo chmod 777 ssl -R
使用 --installcert 命令复制证书到ssl目录并且安装证书
acme.sh --installcert -d 域名.com --key-file /etc/nginx/ssl/域名.key --fullchain-file /etc/nginx/ssl/域名.cer --reloadcmd "sudo service nginx force-reload"
(一个小提醒, 这里用的是 service nginx force-reload, 不是 service nginx reload, 据测试, reload 并不会重新加载证书, 所以用的 force-reload)
搞定 ! 现在去修改nginx的配置文件
检查Nginx配置是否正确后重启nginx
sudo service nginx configtest
sudo service nginx force-reload
完成了
4、后续
关于一些问题这边简单的说一下
- 目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心.
目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步.
- 升级 acme.sh 到最新版 :
acme.sh --upgrade
- 如果你不想手动升级, 可以开启自动升级:
acme.sh --upgrade --auto-upgrade
- 之后, acme.sh 就会自动保持更新了,你也可以随时关闭自动更新:
acme.sh --upgrade --auto-upgrade 0
5、维护
访问 ssllabs.com 输入你的域名(或者访问myssl),检查 SSL 的配置是否都正常。确保验证结果有 A 以上,否则根据提示调整问题
这是因为 ssl_dhparam 没有配置的原因.
使用dhparam
输入以下命令生成 dhparam :
openssl dhparam -out dhparam.pem 2048
把 dhparam.pem 移动到nginx的ssl目录下:
sudo cp dhparam.pem /etc/nginx/ssl/
修改nginx配置文件以启用 dhparam :
检查Nginx配置是否正确后重启nginx
sudo service nginx configtest
sudo service nginx force-reload
这次测试出来达到了A