需要给网站弄上SSL证书了,之前用的是acme_tiny这个小程序,后面看到网上有更好的程序,用法简单,更方便,叫做acme.sh,于是就开始用这个东西折腾了。
获取程序
curl https://get.acme.sh | sh
执行完后会讲程序安装到~/.acme.sh/
目录下并且给你自动添加一个定时任务,每天0点自动检查证书,如果快过期了就自动更新证书,我们直接参照官方的使用说明做。
alias acme.sh=~/.acme.sh/acme.sh
生成证书
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
当然你可以使用--appache或者--nginx参数让其自动识别网站根目录而无需指定--webroot参数
acme.sh --issue -d mydomain.com --apache
acme.sh --issue -d mydomain.com --nginx
你以为这就很NB了?更牛逼的是,引用官方的话:
注意, 无论是 apache 还是 nginx 模式, acme.sh在完成验证之后, 会恢复到之前的状态, 都不会私自更改你本身的配置. 好处是你不用担心配置被搞坏, 也有一个缺点, 你需要自己配置 ssl 的配置, 否则只能成功生成证书, 你的网站还是无法访问https. 但是为了安全, 你还是自己手动改配置吧
如果你还没有运行任何 web 服务, 80 端口是空闲的, 那么 acme.sh 还能假装自己是一个webserver, 临时听在80 端口, 完成验证:
acme.sh --issue -d mydomain.com --standalon
域名所有权验证
在生成证书的过程中需要验证域名的所有权,有两个方式
- http方式,会在网站根目录下放置一个文件
- dns方式,需要同时配置Automatic DNS API(不配置则无法自动更新证书)和添加txt域名解析记录,优点是没有服务器没公网IP都可以申请,我用的就是这个方法,因为我用第一个方法失败了
DNS API详情去官网看,有很多的API,我用的是阿里云,API里面也有阿里云的API,所以直接用官方的API。
export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
这个Ali_Key和Ali-Secret是需要去阿里云上面去生成的。导入相关信息后,直接运行命令生成证书即可。
acme.sh --issue --dns dns_ali -d mydomain.com -d *.mydomain.com
运行命令后,如果不报错,会自动添加一个txt解析记录,并让你等待120S生效,然后验证,成功后即可生成证书到~/.acme.sh/domain
目录下。
下一次更新证书就用以下命令
acme.sh --renew -d mydomain.com --dns *.mydomain.com
手动DNS验证方式
如果没有运行任何网站,也不想使用standalone等模式,可以使用--dns参数,首先执行下面命令
acme.sh --issue --dns -d mydomain.com -d *.mydomain.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
当提示添加TXT解析后,到dns解析面板按提示内容添加TXT解析内容,然后再次执行如下命令即可生成证书
acme.sh --renew --dns -d mydomain.com -d *.mydomain.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
安装证书
证书生成后,需要将证书正确安装(copy)到指定目标位置,不要使用默认证书的保存位置。
acme.sh --install-cert -d mydomain.com \
--cert-file /etc/pki/tls/mydomain.com.cer \
--key-file /etc/pki/tls/mydomain.com.key \
--fullchain-file /etc/pki/tls/fullchain.cer \
--reloadcmd "systemctl reload nginx"
官方用法:
acme.sh --install-cert -d <domain>.com \
--key-file /etc/nginx/ssl/<domain>.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "service nginx force-reload"
更新acme.sh
acme.sh --upgrade # 手动更新
acme.sh --upgrade --auto-upgrade # 自动升级
acme.sh --upgrade --auto-upgrade 0 # 关闭自动升级
排错
如果在使用过程中出现错误,使用debug参数排查
acme.sh --issue ..... --debug
或者
acme.sh --issue ..... --debug 2
Nginx配置:
修改这两个证书位置即可
ssl_certificate "/etc/pki/tls/fullchain.cer";
ssl_certificate_key "/etc/pki/tls/mydomain.com.key";
是时候备份一下Nginx配置文件了
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name mydomain.com;
root /var/www/html;
index index.php index.html;
return 301 https://$server_name$request_uri;
include /etc/nginx/default.d/*.conf;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php$1 last;
}
location ~ .*\.php(\/.*)*$ {
include fastcgi.conf;
fastcgi_pass 127.0.0.1:9000;
}
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name mydomain.com;
root /var/www/html;
index index.php index.html;
ssl_certificate "/xxx/fullchain.cer";
ssl_certificate_key "/xxx/mydomain.com.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types image/svg+xml text/plain text/html text/xml text/css text/javascript application/xml application/xhtml+xml application/rss+xml application/javascript application/x-javascript application/x-font-ttf application/vnd.ms-fontobject font/opentype font/ttf font/eot font/otf;
include /etc/nginx/default.d/*.conf;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php$1 last;
}
location ~ .*\.php(\/.*)*$ {
include fastcgi.conf;
fastcgi_pass 127.0.0.1:9000;
}
fastcgi_intercept_errors on;
error_page 404 500 502 503 504 = https://mydomain.com;
}
}
本文由 Ethan 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。