之前用 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、生成证书

文档提供了三种方式

翻了一下他的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

Last modification:November 15th, 2018 at 09:36 am
If you think my article is useful to you, please feel free to appreciate