通配符证书,又叫泛域名证书,一张通配符的证书能够保护一个域名下同级子域名,使他们都变成 https 加密连接,不须要配置一个子域名再申请一个新证书了,并且不限制子域名数量,这也使得随时增长子域名的同时并不须要额外的付费,对于有多个子域名尤为是子域名数量不少的用户,性价比很高,大大的节约了大量的时间和金钱成本。php
部署 HTTPS 网站的时候须要证书,证书由 CA 机构签发,大部分传统 CA 机构签发证书是须要收费的,这不利于推进 HTTPS 协议的使用。css
Let’s Encrypt 也是一个 CA 机构,但这个 CA 机构是免费的!!!也就是说签发证书不须要任何费用。html
Let’s Encrypt 因为是非盈利性的组织,须要控制开支,他们搞了一个很是有创意的事情,设计了一个 ACME 协议,目前该协议的版本是 v1。linux
那为何要建立 ACME 协议呢,传统的 CA 机构是人工受理证书申请、证书更新、证书撤销,彻底是手动处理的。而 ACME 协议规范化了证书申请、更新、撤销等流程,只要一个客户端实现了该协议的功能,经过客户端就能够向 Let’s Encrypt 申请证书,也就是说 Let’s Encrypt CA 彻底是自动化操做的。nginx
任何人均可以基于 ACME 协议实现一个客户端,官方推荐的客户端是 Certbot 。git
官方客户端列表请查看 https://letsencrypt.org/docs/client-options/ 。github
咱们使用的是 aws 的 lightsail 服务建立的系统,系统是 CentOS 7。web
首先给系统添加 epel 源。docker
curl -o /etc/yum.repos.d/epel-7.repo https://mirrors.aliyun.com/repo/epel-7.repo
安装证书申请工具 Certbot。apache
yum install -y certbot
certbot certonly -d *.wzlinux.com --manual \ --preferred-challenges dns \ --server https://acme-v02.api.letsencrypt.org/directory
申请过程以下,为了确保域名是在你的管理权限以内,咱们中间须要作一条 TXT 的 DNS 解析。
Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator manual, Installer None Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): wangzan18@126.com Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server at https://acme-v02.api.letsencrypt.org/directory - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (A)gree/(C)ancel: A - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: N Obtaining a new certificate Performing the following challenges: dns-01 challenge for wzlinux.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NOTE: The IP of this machine will be publicly logged as having requested this certificate. If you're running certbot in manual mode on a machine that is not your server, please ensure you're okay with that. Are you OK with your IP being logged? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: Y - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please deploy a DNS TXT record under the name _acme-challenge.wzlinux.com with the following value: Fd-T8Q_R_9k4UqerXohPkTWu-aZOaU0mxxozERPRU5M Before continuing, verify the record is deployed. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Press Enter to Continue Waiting for verification... Cleaning up challenges Resetting dropped connection: acme-v02.api.letsencrypt.org IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/wzlinux.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/wzlinux.com/privkey.pem Your cert will expire on 2019-09-04. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
咱们看到上面有一条 DNS 解析需求,我这里是在阿里云进行设定的。
解析好以后,咱们在服务器上面验证一下解析记录。
[root@ip-172-26-5-120 ~]# dig -t txt _acme-challenge.wzlinux.com ; <<>> DiG 9.9.4-RedHat-9.9.4-73.el7_6 <<>> -t txt _acme-challenge.wzlinux.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47252 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;_acme-challenge.wzlinux.com.INTXT ;; ANSWER SECTION: _acme-challenge.wzlinux.com. 58INTXT"Fd-T8Q_R_9k4UqerXohPkTWu-aZOaU0mxxozERPRU5M" ;; Query time: 0 msec ;; SERVER: 172.26.0.2#53(172.26.0.2) ;; WHEN: Thu Jun 06 07:04:07 UTC 2019 ;; MSG SIZE rcvd: 112
[root@ip-172-26-5-120 ~]# ll /etc/letsencrypt/live/wzlinux.com/ total 4 lrwxrwxrwx. 1 root root 35 Jun 6 06:53 cert.pem -> ../../archive/wzlinux.com/cert1.pem lrwxrwxrwx. 1 root root 36 Jun 6 06:53 chain.pem -> ../../archive/wzlinux.com/chain1.pem lrwxrwxrwx. 1 root root 40 Jun 6 06:53 fullchain.pem -> ../../archive/wzlinux.com/fullchain1.pem lrwxrwxrwx. 1 root root 38 Jun 6 06:53 privkey.pem -> ../../archive/wzlinux.com/privkey1.pem -rw-r--r--. 1 root root 692 Jun 6 06:53 README
咱们这里以 nginx 服务为例,配置证书,nginx 的配置文件为下:
server { listen 443 ssl http2; #listen [::]:443 ssl http2; server_name bbs.wzlinux.com bbs1.wzlinux.com; index index.html index.htm index.php default.html default.htm default.php; root /usr/share/nginx/html/; ssl on; ssl_certificate /etc/letsencrypt/live/wzlinux.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/wzlinux.com/privkey.pem; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES 256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5"; ssl_session_cache builtin:1000 shared:SSL:10m; # openssl dhparam -out /usr/local/nginx/ssl/dhparam.pem 2048 #ssl_dhparam /usr/local/nginx/ssl/dhparam.pem; #error_page 404 /404.html; # Deny access to PHP files in specific directory #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~ /.well-known { allow all; } location ~ /\. { deny all; } access_log off; } server { listen 80; server_name bbs.wzlinux.com; return 301 https://$server_name$request_uri; }
查看访问结果以下:
可使用指令certbot renew
进行更新,添加一个定时任务。
[root@ip-172-26-5-120 ~]# certbot renew Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/wzlinux.com.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not yet due for renewal - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The following certs are not due for renewal yet: /etc/letsencrypt/live/wzlinux.com/fullchain.pem expires on 2019-09-04 (skipped) No renewals were attempted. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
定时任务。
30 1 10 * * /usr/bin/certbot renew && systemctl reload nginx
若是装有 docker 环境的话,也能够用 docker 镜像来获取证书,只需一行命令便可。
docker run -it --rm --name certbot \ -v "/etc/letsencrypt:/etc/letsencrypt" \ -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \ certbot/certbot certonly --manual -d '*.wzlinux.com'
具体步骤和上面一致。
使用此方法,咱们也能够申请多域名的证书,好比我申请的这个:
certbot certonly -d bbs1.wzlinux.com,bbs2.wzlinux.com,bbs.coffeedst.top \ --manual --preferred-challenges dns \ --server https://acme-v02.api.letsencrypt.org/directory
若是不想作DNS解析,能够去掉选项--preferred-challenges dns
,直接使用 http 认证。
参考地址,也很是简单
https://github.com/Neilpang/acme.sh
curl https://get.acme.sh | sh
申请单域名:
acme.sh --issue -d example.com -w /home/wwwroot/example.com
申请多域名在一个证书:
acme.sh --issue -d example.com -d www.example.com -d cp.example.com -w /home/wwwroot/example.com
Apache example:
acme.sh --install-cert -d example.com \ --cert-file /path/to/certfile/in/apache/cert.pem \ --key-file /path/to/keyfile/in/apache/key.pem \ --fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \ --reloadcmd "service apache2 force-reload"
Nginx example:
acme.sh --install-cert -d example.com \ --key-file /path/to/keyfile/in/nginx/key.pem \ --fullchain-file /path/to/fullchain/nginx/cert.pem \ --reloadcmd "service nginx force-reload"
If your DNS provider supports API access, we can use that API to automatically issue the certs.
You don't have to do anything manually!
https://github.com/Neilpang/acme.sh/wiki/dnsapi