本文只是记录下自已在给网站域名加上HTTPS的过程,不涉及到HTTS的具体原理,如要了解,请自行搜索相关信息。
我们知道,如果要给网站域名加上HTTPS,一般是通过购买证书或去找一些免费的证书来,花钱的这里就不说了,无非是购买证书后,配置就行了。这里说的是免费的,它就是 Let‘s Encrypt
,其实很久之前就听过这个东西,只是一直没有去弄过,这次刚好需要就去看了下,没有想像中的那么麻烦,配合第三方的脚本,签个证书如果顺利的话,简单是分分钟的事。
其实,刚开始我是打算用其它第三方的平台的,比如freessl
这种,后面发现真搞起来,这个也麻烦,又要注册,也要验证域名文件或DNS解析,最主要的是还不能自动更新证书,到期后还得重新弄,于是放弃。
所以,这里还是说下用Let‘s Encrypt
来签发证书和部署环境
安装ACME
安装之前,了解一个叫ACME(自动化证书管理环境)的东西,通过它就可以很方便的来颁发证书、验证域名和管理证书的一些操作了,就是傻瓜化了。
有基于它实现的很多客户端,比如
certbot
但是我在大概看了下后,觉得不是很简单呀,于是在 Let‘s Encrypt找到了acme.sh
, 这个用起来更简单,一个命令行的工具。
进入你的系统命令行,输入下面的命令
curl https://get.acme.sh | sh
上面的操作主要干了这么几件事:
- 把acme.sh安装到了你的用户主目录 $HOME下的.acme.sh文件夹下,后面你对证书的操作都在这个目录下面,它不会去破坏你系统的其它目录的。
- 创建了一个别名
alias acme.sh=~/.acme.sh/acme.sh
, 后面就可以用acme.sh
来使用这个脚本了,注意如果你输入acme.sh
找不到,那么重新刷下你的用户环境source ~/.bash_profile
或开一个新的终端. - 它创建了一个每天检测证书过期的Crontab, 因为证书的时效是60天,过期了就自动更新证书。这一切都是脚本在处理,我们不需要去处理这些。
安装完成后,输入acme.sh --version
来看下安装好了没,如果找不到命令,还是一样刷一下环境变量配置文件
生成证书
这里就通过上面安装的acme.sh
来操作了,如果要了解更多,可以去它的官网 acme.sh了解,其实,正常来说,这一步安装的过程很简单的,但是因为我当时赶时间要,在网上看了几篇环境后我就操作,结果有几个关键的步骤他们并没有写出来,导致我一直在试,一直安装不成功,最后还触发了Let‘s Encrypt
的Rate Limit限制,被锁了好久。
我有一个主域名,两个二级域名,一开始我的命令是类似下面这样的,
acme.sh --issue -d ezone.com -d mc.ezone.com -d ag.ezone.com -w /home/wwwroot/ezone.com
上面这个命令的意思是说,我要给三个域名弄一个证书,他们的证书文件都是一样的。网站主目录都是一样,在 /home/wwwroot/ezone.com
下面,一开始我没有理解到,以为只要配置任何一个域名的主目录就行了。因为我的这三个域名文件都是在一台机器上面的,所以它们的主目录肯定不可能是一样的.
所以第一个坑就是目录这里我没有做对。
第二个坑就是,因为上面的那种方式是通过http的方式来验证的,也就是说脚本它会在你的网站目录生成类似.well-known/acme-challenge/qsNtqqNOqcAIczvulbYtcd78jdd0GGYR6wZgCW6M-ao
这种的。这种是需要在你的Nginx中配置的。我一开始也没有配置,导致一直不成功。于是在各个网站的Nginx配置中加上配置
location ~ /\.well-known/acme-challenge/ {
allow all;
root /home/www/web_data/ezone.com;
try_files $uri =404;
break;
}
第三个坑就是,开始没有注意到,应该用他们的测试环境来做,虽然也有Rate Limit限制,但是宽松很多。用测试环境,就用 acme.sh --test --issue
这种方式来弄。
所以总结一下,就是如果要生成证书,那么首先你要配置你的Nginx目录,然后如果是多域名,要注意你的网站主目录,另外尽量用测试环境,等没问题了,再用正式的来重新生成就行了。
不过,后面我找到一种更简单的,它有种模式叫 Nginx mode
和Apache mode
这种,这种验证不需要在你的网站上面写入任何文件来验证, 就是加了一个 --nginx
这种。
acme.sh --issue --nginx -d ezone.com -d mc.ezone.com -d agt.ezone.com
好了,如果没什么问题,成功后证书就生成在你的用户目录~/.acme.sh/ezone.com下面了,但是这个目录是acme.sh
脚本内部去控制的,也不知道那天会变,而且我们的Nginx也是读不到这个目录的。那么就只能将这些文件拷到Nginx能读取的地方了。
安装证书
将上面生成的文件,安装拷贝到Nginx的某个目录,比如 /etc/nginx/ssl
没有这个就建一个,然后执行下面的语句,将文件拷过去,并加载Nginx
acme.sh --install-cert -d ezone.com --key-file /etc/nginx/ssl/ezone.com.key --fullchain-file /etc/nginx/ssl/ezon.com.cer --reloadcmd "systemctl reload nginx"
在/etc/nginx/ssl
下面就有上面的两个文件了,然后我们再配置Nginx
server {
listen 443 ssl http2 default_server;
server_name ezone.com
root /home/web_data/ezonepay.com
index index.php index.html index.htm;
ssl_certificate /etc/nginx/ssl/ezone.com.cer;
ssl_certificate_key /etc/nginx/ssl/ezone.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
}
好了,经过上面的步骤,HTTPS证书就弄完了,可以用 https:// 来访问你的网站了,通过acme.sh
这个还是挺方便的。而且,后续的更新也不要自已去维护。