acme.sh免费申请、部署Let's Encrypt泛域名SS

2020-03-08  本文已影响0人  fatcatcoder
为什么要申请、部署免费的泛域名SSL证书?
本文以阿里云的域名解析和云服务器为例讲解如何操作实现,linux系统为centos7,web服务采用apache。

一、准备工作

(一)获取AccessKey和AccessSecret

登录阿里云的RAM访问控制后台,根据阿里云的安全建议,在没有普通访问控制用户的情况下,新建一名用户,给其分配“管理云解析(DNS)”的权限,获取其AccessKey和AccessSecret并记录下来,而不是继续使用“超级管理员”的AccessKey和AccessSecret。

image.png
(二)apache的mod_ssl模块(已经安装好mod_ssl的可以略过这一步)

确保apache的mod_ssl模块功能正常。如果没有安装mod_ssl模块,安装:

yum -y install mod_ssl

实在不放心就再确认一下有没有相关路径:

rpm -ql mod_ssl

对比一下输出是否是以下这些:
/etc/httpd/conf.d/ssl.conf //配置文件,需要指明我们的证书所在位置,下面要用到
/etc/httpd/conf.modules.d/00-ssl.conf
/usr/lib64/httpd/modules/mod_ssl.so
/usr/libexec/httpd-ssl-pass-dialog
/var/cache/httpd/ssl

二、acme.sh

acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书。主要步骤:安装 acme.sh、生成证书 、copy 证书到 nginx/apache 或者其他服务 、更新证书 、更新 acme.sh。Let’s Encrypt Wildcard 免费泛域名SSL证书有效期依然为三个月,acme.sh会自动续期。

(一)安装acme.sh
curl  https://get.acme.sh | sh

或者

wget -O- https://get.acme.sh | sh

提醒一下,网络有时会抽风,导致安装失败,提示:

hubusercontent.com:443; Connection refused

不用担心,多试几次就好了。
安装成功后,acme.sh自动创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。

(二)生成证书

依次执行以下命令

# 替换成从阿里云后台获取的密钥
export Ali_Key="刚才记录的AccessKey"
export Ali_Secret="刚才记录的AccessSecret"
# 把test.com换成自己的域名
~/.acme.sh/acme.sh --issue --dns dns_ali -d test.com -d *.test.com

其他的DNS解析API的用法请参考https://github.com/acmesh-official/acme.sh/wiki/dnsapi
以上命令执行后脚本会自动去验证域名,而你只需静静等待即可。这里执行过程中如果报错,确认一下是否在阿里云的RAM访问控制后台分配了“管理云解析(DNS)”的权限。

证书申请成功
证书保存路径
(三)安装证书

这里的“安装”,可以理解为将上一步生成的证书从原来的路径复制到指定的路径下,并在复制后自动重新启动apache。至于为什么要这么做,后面再说。

vim /etc/httpd/conf.d/ssl.conf
<VirtualHost *:443>

DocumentRoot "/var/www/html"
ServerName test.com:443

ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn

SSLEngine on

SSLProtocol all -SSLv2 -SSLv3

SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM

SSLHonorCipherOrder on

SSLCertificateFile /etc/letsencrypt/test.com/cert.pem

SSLCertificateKeyFile /etc/letsencrypt/test.com/key.pem

SSLCertificateChainFile /etc/letsencrypt/test.com/fullchain.pem

<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

BrowserMatch "MSIE [2-5]" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

</VirtualHost>
~/.acme.sh/acme.sh --install-cert -d test.com --cert-file /etc/letsencrypt/test.com/cert.pem --key-file /etc/letsencrypt/test.com/key.pem --fullchain-file /etc/letsencrypt/test.com/fullchain.pem --reloadcmd "service httpd force-reload"

为什么要把生成的证书移动到另一个路径下?因为原来的路径的目录结构可能会发生改变,所以在ssl.conf文件中将证书的路径指向一个固定路径,而acme.sh的--install-cert方法完成证书复制的同时也重新启动了httpd服务使得新的SSL证书在web服务中生效。
好了,至此我们已经成功完成了Let's Encrypt免费泛域名SSL证书的申请和部署。

三、参考资料

  1. Github/acmesh-official/acme.sh
  2. Let’s Encrypt Wildcard 免费泛域名SSL证书一键申请与SSL使用教程
  3. 使用 acme.sh 申请 Let's Encrypt 泛域名SSL证书详细教程
  4. How to install ACME.SH certificates after they are generated?
上一篇下一篇

猜你喜欢

热点阅读