本文给大家带来一篇实用的免费申请域名证书的方法,操作也比较简单。对于想要搭建https网站的个人或企业来说,非常实用。
当然,首先是得拥有一个域名。如何申请和解析域名可以参考各大云商服务,不在此赘述了。
本文假定读者已经购买了域名,也已配置好域名解析。
申请证书非常容易,按照码哥给的如下步骤照做即可:
建立必要目录
首先在/var/www/
目录下建立challenges
目录。
当然,需要注意nginx的执行用户有访问该目录的权限。
修改nginx配置
随后,我们要暂时修改一下nginx的配置,增加一个server配置,如下:
server {
listen 80;
server_name *.abc.com;
location /.well-known/acme-challenge/ alias /var/www/challenges/;
try_files $uri =404;
}
location / {
return 307 https://$host$request_uri;
}
}
如果你原本有个80的server配置,也可以只把location的部分加入到你的server配置上。
将你的域名部分配置好,reload新配置即可。
修改申请脚本
这里,码哥给出一个python3的脚本,用来向Lets申请证书,证书有效期1个月,所以脚本可以设置为crontab,按月调度。每个月最多可以执行25次(没记错的话)。脚本如下:
# -*- coding: utf-8 -*-
import subprocess
def letsencrypt(domain):
account_key = '/etc/nginx/certs/www/'+domain + '.akey'
domain_key = '/etc/nginx/certs/www/'+domain + '.key'
domain_csr = '/etc/nginx/certs/www/'+domain + '.csr'
signed_crt = '/etc/nginx/certs/www/signed.crt'
final_crt = '/etc/nginx/certs/www/'+domain + '.crt'
subprocess.getstatusoutput(
'openssl genrsa 4096 > {} && openssl genrsa 4096 > {}'.format(
account_key, domain_key
)
)
subprocess.getstatusoutput(
'openssl req -new -sha256 -key {} -subj \'/CN={}\' > {}'.format(
domain_key, domain, domain_csr
)
)
_, output = subprocess.getstatusoutput(
'/usr/bin/python3 -m acme_tiny '
'--account-key {} --csr {} '
'--acme-dir "/var/www/challenges/" > {}'.format(
account_key, domain_csr, signed_crt
)
)
print(output)
subprocess.getstatusoutput(
'wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > /etc/nginx/certs/www/intermediate.pem'
)
subprocess.getstatusoutput('cat {} intermediate.pem > {}'.format(signed_crt, final_crt))
def run_job(domain):
letsencrypt(domain)
if __name__ == '__main__':
run_job('你的域名')
这里需要说明一下,域名证书存放的位置,笔者是存放在/etc/nginx/
下自建的certs
目录里,由于网站分前后台,所以前台的会再建个子目录叫www
,所以就有了/etc/nginx/certs/www/
这样的东东。所以这个路径大家可以因人而异自行修改。
将你的域名
部分配置好(例如,www.abc.com
)即可,不可以使用范域名,例如*.abc.com
。
申请证书
执行上面的脚本:
$ sudo python3 let.py
如果有缺少模块提示,则自行百度pip3
安装即可,很容易解决。
如果再遇到报错,请仔细阅读报错信息,一般会遇到的问题是:
- 忘记将域名解析到当前服务器
- nginx配置忘记修改或者修改后未激活新配置
- challenges目录忘记建立或者权限有问题
- 证书申请过多,超过当月最大上限次数
排除这几方面,基本就会看到successfully的字样表示成功了。
修改nginx配置
最后就是启用证书了,修改nginx配置,在需要使用证书的server配置下增加如下内容:
#当然不要忘记listen 443;
ssl on;
ssl_certificate /etc/nginx/certs/www/你的域名.crt;
ssl_certificate_key /etc/nginx/certs/www/你的域名.key;
你的域名
与脚本中给出的域名保持一致。
reload或restart Nginx来使配置生效即可。