标题为什么是英文 因为用中文写太长了而且还拗口, 干脆用英文写...
现在证书申请越来越普及,逐渐从收费向免费过渡,所以从申请证书来讲现在是比较容易的,出名的也很多比如赛门铁克,GeoTrust等等,我这篇写的是最近比较火的LET'S ENCRYPT,同样是免费CA证书,支持自动续签,申请证书非常方便
申请证书的方式有2种,一种是certbot,之前申请单个站点的证书的时候用过,然后也只能申请单个站点,所以就放弃了。第二种是acme也就是接下来要讲的
首先感谢开源插件acme.sh:https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E
及https://blog.853lab.com/2018/09/post_1965.html#comment-864
目录
1、安装cygwin
2、申请证书
3、修改apache配置
4、设置apache重定向
下载cygwin安装包运行,一直下一步到选择镜像,可以用163的镜像也可以随便选一个。据说163下东西稍微快一点
http://mirrors.163.com/cygwin/
安装需要的包:curl、cron、bzip2、wget、gcc-core、gcc-g++、make、openssh、lynx、cygrunsrv
配置环境变量
然后可以看到在安装目录下有cygwin.bat 这就是终端
申请证书有HTTP验证和DNS验证2种方式。在前文提到的插件中都有说明,这里就不细说了,我选择的是DNS方式验证。这种方式好处在于可以根据阿里云的key和secret自动进行DNS验证不用手动添加TXT
#设置阿里云accesskey和secret
export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
#通过阿里云DNS申请证书
acme.sh --issue --dns dns_ali -d example.com -d *.example.com
#把生成的证书copy到自建目录
acme.sh --install-cert -d example.com -d *.example.com \
--cert-file /targetpath/example.com.cert.pem \
--key-file /targetpath/example.com.key.pem \
--fullchain-file /targetpath/example.com.fullchain.pem
在申请证书的时候可以把泛域名*.example.com放在前面这样证书生成出来在网站上看到的授权域名就是*.example.com,据说这样看起来比较吊 :)
重要:在API文档里install命令其实还有个参数--reloadcmd,文档解释说这个参数非常重要,但是我在cygwin中第一次使用的时候报错了。后来在文档里找到说在windows上使用cygwin生成证书时reloadcmd确实不能用,如果要进行证书监控达到自动续签的目的就需要自己写crontab了
安装cygwin的时候有写一个包名字叫cygrunsrv这个包,只有装了这个包才能在cygwin中执行crontab。现在先让我们写一个脚本执行issue和copy的命令
#!/usr/bin/bash
echo "starting issue cert"
/home/Administrator/.acme.sh/acme.sh --issue --dns dns_ali -d example.com -d *.example.com
echo "cert issue complete"
sleep 3
echo "moving cert"
/home/Administrator/.acme.sh/acme.sh --install-cert -d example.com -d *.example.
com \
--cert-file E:\\targetpath\\51towin.com.cert.pem \
--key-file E:\\targetpath\\51towin.com.key.pem \
--fullchain-file E:\\targetpath\\51towin.com.fullchain.pem
echo "move cert complete"
然后配置cygrunsrv来执行crontab,这句话的意思是把crond设置为系统任务并开机启动并且可以让多用户访问。可以把as yourself设置为yes提高安全性
$ cron-config
Do you want to remove or reinstall it (yes/no) yes
Do you want to install the cron daemon as a service? (yes/no) yes
Enter the value of CYGWIN for the daemon: [ ] ntsec
Do you want the cron daemon to run as yourself? (yes/no) no
Do you want to start the cron daemon as a service now? (yes/no) yes
然后就可以设置crontab来配置你自己的定时器了
#以编辑器形式编辑定时器
crontab -e
#设置一个定时器 每10天的凌晨12点启动 运行之前写的脚本
0 0 */10 * * /home/Administrator/.acmecron
apache添加HTTPS配置我就不细说了。在配置完成后,在httpd-ssl.conf配置文件中添加或修改以下配置:
SSLCertificateFile "E:/targetpath/example.com.cert.pem"
SSLCertificateKeyFile "E:/targetpath/example.com.key.pem"
SSLCertificateChainFile "E:/targetpath/example.com.fullchain.pem"
然后在httpd-vhosts.conf配置文件中添加443端口配置
ServerName example.com
SSLEngine on
SSLProxyEngine on
SSLCertificateFile "E:/targetpath/example.com.cert.pem"
SSLCertificateKeyFile "E:/targetpath/example.com.key.pem"
ProxyRequests Off
Require all granted
ProxyPass / http://127.0.0.1:8083/ smax=5 max=20 ttl=120 retry=300
ProxyPassReverse / http://127.0.0.1:8083/
配置就完成了。但是因为之前在httpd.conf配置文件中配置了80端口的HTTP转发,如果用户访问的还是HTTP域名是不会转发到HTTPS域名的。所以需要在apache中配置转发
修改httpd.conf配置文件
#放开重定向模块
LoadModule rewrite_module modules/mod_rewrite.so
#设置HTTP转发到HTTPS
ServerName example.com
#ProxyPass / http://127.0.0.1:8083/ smax=5 max=20 ttl=120 retry=300
#ProxyPassReverse / http://127.0.0.1:8083/
Redirect / https://example.com/
这就实现了强制转向到HTTPS域名的配置