折腾网站证书记录一下吧。
先确定一下大纲:
1、本站用的是AMH面板,后台带了模块BBShijieSSL模块,这模块它是为虚拟主机增加SSL功能,开启https访问,支持同一主机多个SSL站点用的。它的设置界面里面就需要2个东东,一个是密钥,一个是证书。
2、证书哪里来? 如何低成本装逼? Letsencrypt提供的免费证书正合适。虽然90天会过期,但我们可以用脚本自动更新
用脚本自动生成密钥及申请证书
wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.conf
wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.sh
chmod +x letsencrypt.sh
然后编辑letsencrypt.sh
修改里面的域名及网站路径
./letsencrypt.sh letsencrypt.conf
则会生成相关的文件。
但是我却没直接有这么好运气。
Parsing account key...
Parsing CSR...
Registering account...
Registered!
Verifying linc.hu...
Traceback (most recent call last):
File "/tmp/acme_tiny.py", line 198, in <module>
main(sys.argv[1:])
File "/tmp/acme_tiny.py", line 194, in main
signed_crt = get_crt(args.account_key, args.csr, args.acme_dir, log=LOGGER, CA=args.ca)
File "/tmp/acme_tiny.py", line 123, in get_crt
wellknown_path, wellknown_url))
ValueError: Wrote file to /home/wwwroot/linc.hu/web/.well-known/acme-challenge/DXhaiwoINGsagLEMP-rK6MjO9RyE28_EI9qRe5HqgxA, but couldn't download https://linc.hu/.well-known/acme-challenge/DXhaiwoINGsagLEMP-rK6MjO9RyE28_EI9qRe5HqgxA
关键是网络搜索还没有找到好的解决方案。报错的信息与实际情况也不符合。文件没生成。目录手工放个文件也能访问。所以网络上有的说是权限问题,显然不是。
既然这.sh脚本又调用了python脚本,于是我觉得更像是python的问题。无意中瞎转悠发现了下面的:
https://my.oschina.net/dlpinghailinfeng/blog/203015
虽然它解决的是python 出现’module’ object has no attribute ‘HTTPSHandler’ 错误 问题。但是我却从中嗅到了我要的信息。也是果断按上面方法试一下:
cd python2.7.7/Modules
vi Setup.dst
找到
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=/usr/local/ssl
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto
将后面这4行前面的#号去掉(取消注释),再重新编译安装Python。
然后再用脚本生成证书密钥等相关文件,终于可以正常生成文件了!
接着就是把key以及生成出来的证书密钥之类的存到AMH面板的BBShijieSSL模块的设置里面。
这里发生了个意外。我自作聪明只复制了—–BEGIN CERTIFICATE—– 以及—–BEGIN CERTIFICATE—– 之间的加密字串内容,反倒没有把—–BEGIN CERTIFICATE—– 以及—–BEGIN CERTIFICATE—– 拷贝进去。结果死活测试不成功HTTPS访问。。闹笑话了。
下面就是解决访问HTTP时自动跳转到HTTPS了。
HTTP自动跳转到HTTPS
nginx配置文件插入的代码为下方#for ssl 与 # end for ssl 之间的代码,如下:
server
{
listen 80;
server_name linc.hu; #server_name end
# for ssl
if ($server_port = 80) {
return 301 https://$server_name$request_uri;
}
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
error_page 497 https://$server_name$request_uri;
# end for ssl
...
...
...
下面就是套路了
自动更新.编辑crontab 表,每个偶月1日重新生成(因为Letsencrypt的证书是90天过期的嘛,每月太浪费。3月怕晚了一小步,所以每2个月--偶月--吧。~)
0 0 */2 * * /bin/sh /usr/local/nginx/conf/ssl/renew_cert.sh
renew_cert.sh 的内容如下:
#!/bin/sh
ssl_path='/usr/local/nginx/conf/ssl'
$ssl_path/letsencrypt.sh $ssl_path/letsencrypt.conf
cp -f $ssl_path/linc.hu.key $ssl_path/linc.hu.pem
mv -f $ssl_path/linc.chained.crt $ssl_path/linc.hu.crt
chown www:www $ssl_path/linc.hu*
amh nginx reload
注意事项:
没事不要反复去生成这个证书。每周证书的颁发的数量是限制的。
[2017.11.03] 更新:改用宝塔面板,后台已经很方便加SSL证书支持。
转载请注明:Linc Hu » 捣腾记录:Let’s HTTPS