Apache2获取https证书并定时更新
一、获取Let’s Encrypt证书
准备工作
1.使用ssl连接工具连接服务器(比如Xshell、bitvise等);
2.在网站根目录下创建一个人二级文件夹(需要验证域名是绑定这个服务器):
.well-known/acme-challenge
比如网站根目录是/var/www/html,则需要这样操作:
mkdir -p /var/www/html/.well-known/acme-challenge
3.创建一个保存证书的文件夹并跳转到该文件夹:
mkdir /etc/apache2/cert
cd /etc/apache2/cert
获取证书
1.创建一个 账号:
openssl genrsa 4096 > account.key
2.创建 RSA 私钥:
openssl genrsa 4096 > domain.key
3.生成 CSR 文件
openssl req -new -sha256 -key domain.key -subj “/” -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf “[SAN]\nsubjectAltName=DNS:ownsite.com”)) > domain.csr
标记部分改为你们自己的域名,如有多个域名以逗号分隔(可能有域名个数上限,自行考证):
例(DNS:ownsite.com,DNS:www.ownsite.com,DNS:www.ownsite.vip)
4.下载执行脚本
wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py
5.执行脚本
python3 acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /var/www/html/.well-known/acme-challenge > ./signed.crt
5.下载 Let’s Encrypt 的中间证书
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
6.合成证书
cat signed.crt intermediate.pem > chained.pem
至此https证书下载完毕
二、配置证书
前置条件
1.开启ssl模块,执行:
2enmod ssl 和 a2ensite default-ssl
2.打开/etc/apache2/ports.conf文件,配置端口号为Listen 80 443
(一般已有80端口)
证书路径配置
1.打开 /etc/apache2/sites-available/default-ssl.conf 文件
(一般叫这个名字,在/etc/apache2/sites-available夹下一般只有2个文件,名字带ssl的就是htpps证书配置文件)
2.输入以下内容,存在则修改(文件中#是注释符号)
ServerName www.ownsite.com:443 #域名
ServerAlias ownsite.com #域名
DocumentRoot /var/www/html #网站根目录
SSLEngine on # 开启证书验证
SSLCertificateFile /etc/apache2/cert/chained.pem
SSLCertificateKeyFile /etc/apache2/cert/domain.key
SSLCertificateChainFile /etc/apache2/cert/chained.pem
ServerName和ServerAlias 标黄处写自己的域名,下面3个证书路径也根据你自己保存的路径写
开启重写模块(看个人需要)
1.打开 /etc/apache2/apache.conf 文件
2.任意地方添加一行:
LoadModule rewrite_module modules/mod_rewrite.so
3.把文件中的AllowOverride None改为AllowOverride All
4.打开 /var/ww/html/.htaccess 文件(设置不带www的域名跳转到带www的域名)
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine on
RewriteCond %{HTTP_HOST} ^ownsite.com [NC]
#将www.ownsite.com替换为目标域名
RewriteRule ^(.*)$ https://www.ownsite.com/$1 [L,R=301]
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?s=/$1 [QSA,PT,L]
<IfModule>
黄色部分输入你们自己的域名
配置https强制跳转(看个人需要)
1.打开 /etc/apache2/sites-available/000-default.conf 文件
添加一下内容:
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*) https://%{SERVER_NAME}$1 [L,R]
重启服务器
service apache2 restart
重启完成访问网站查看证书是否已更新
三、配置定时更新证书脚本
1.创建一个脚本文件:
touch /etc/apache2/cert/renew_cert.sh
2.打开改文件,输入内容:
#!/bin/bash
python3 /etc/apache2/cert/acme_tiny.py --account-key /etc/apache2/cert/account.key --csr /etc/apache2/cert/domain.csr --acme-dir /var/www/html/.well-known/acme-challenge/ > /etc/apache2/cert/signed.crt || exit
cd /etc/apache2/cert/ && wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat /etc/apache2/cert/signed.crt intermediate.pem > /etc/apache2/cert/chained.pem
service apache2 reload
3.保存并退出
4.执行一下脚本查看是否正确
5.配置定时更新任务:
(1)输入 crontal -e 进入编辑定时文件页面
(2)输入以下内容:
# 每月1号0点定时更新https证书
0 0 1 * * /etc/apache2/cert/renew_cert.sh >> /var/log/acme_tiny.log
(3)保存退出
四、一些遇到过的问题
没报错,但是网站就是访问不了
1.可能是某个步骤漏了:比如开启ssl模块
2.可能是防火墙没有开启443端口访问权限:
(1)ufw status :查看防火墙状态
(2)ufw allow 443 :开放443端口
3.可能没有重启服务器
4./etc/apache2/ports.conf可能没有加入443端口
5.证书路径没有配置或配置错误(配置错误重启服务器会保存)
定时任务执行报错
1.windows直接传可能会报错
(1)可能没有执行权限
(2)不同系统导致的编码格式问题:执行: sed -i -e ‘s/\r$//’ renew_cert.sh
python执行报错
1.建议用python3执行