1.安装acme.sh
https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E
curl https://get.acme.sh | sh
在该脚本的安装过程不会污染已有的系统任何功能和文件, 所有的修改都限制在安装目录中: ~/.acme.sh/
安装完后执行acme.sh,如果提示命令没找到,执行下列命令
source ~/.bashrc
运行后会创建一条 alias和定时任务 ,如果不放心,可以手动再添加一次。
alias acme.sh=~/.acme.sh/acme.sh
用crontab -l可以看到自动创建的定时任务
2.配置acme
这里以cloudflare为例
设置变量值,把刚才的key和你Cloudflare邮箱填上去。
export CF_Key="key"
export CF_Email="你的邮箱"
如果是阿里云的话建议用子账号,添加成功后需要给子账号能解析域名的权限
通过查看用户权限很能看到当前用户的权限
3.生成证书
domain.com换成你的域名
acme.sh --issue --dns dns_cf -d domain.com -d *.domain.com
如果出现下面错误可以将~/.acme.sh文件夹删除后重新安装即可
生成后,证书会放在 ~/.acme.sh/ 目录里,但是由于过期什么的证书会变化,所以不要直接使用。而是使用acme.sh –install-cert命令复制到指定目录,目录位置和名字由你设置,–reloadcmd可以设置你操作后执行的命令,由于我移动到/usr/local/nginx/conf/ssl目录下,需要提前创建目录。
mkdir -p /usr/local/nginx/ssl
acme.sh --install-cert -d domain.com \
--cert-file /usr/local/nginx/conf/ssl/cert.pem \
--key-file /usr/local/nginx/conf/ssl/key.pem \
--fullchain-file /usr/local/nginx/conf/ssl/fullchain.pem \
--reloadcmd "service nginx restart"
- 值得注意的是, 这里指定的所有参数都会被自动记录下来, 并在将来证书自动更新以后, 被再次自动调用.
3.nginx配置证书
user nginx nginx;
worker_processes auto;
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 10240;
multi_accept on;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
client_max_body_size 16M;
server_names_hash_bucket_size 512;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server_tokens off;
access_log off;
server {
listen 443;
server_name domain.com www.domain.com;
index index.html index.htm index.php;
root html/blog;
ssl on;
ssl_certificate /usr/local/nginx/ssl/cert.pem;
ssl_certificate_key /usr/local/nginx/ssl/key.pem;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /\.ht {
deny all;
}
}
server {
listen 80;
server_name domain.com www.domain.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
#拒绝IP直接访问
server {
listen 80 default;
server_name _;
return 403;
}
}
以上是api自动dns方式,手动dns方式和HTTP 方式,dns方式的好处是, 你不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证。
HTTP 方式
http 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了.
acme.sh --issue -d clsn.io -d *.clsn.io --webroot /www/wwwroot/clsn.io/
只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用.
如果你用的 apache服务器, acme.sh 还可以智能的从 apache的配置中自动完成验证, 你不需要指定网站根目录:
acme.sh --issue -d clsn.io --clsn.io
如果你用的 nginx服务器, 或者反代, acme.sh 还可以智能的从 nginx的配置中自动完成验证, 你不需要指定网站根目录:
acme.sh --issue -d clsn.io --nginx
注意, 无论是 apache 还是 nginx 模式, acme.sh在完成验证之后, 会恢复到之前的状态, 都不会私自更改你本身的配置. 好处是你不用担心配置被搞坏。
该类型的配置有一个缺点, 你需要自己配置 ssl 的配置, 否则只能成功生成证书, 你的网站还是无法访问https. 但是为了安全, 你还是自己手动改配置吧.
如果你还没有运行任何 web 服务, 80 端口是空闲的, 那么 acme.sh 还能假装自己是一个webserver, 临时听在80 端口, 完成验证:
acme.sh --issue -d clsn.io --standalone
更高级的用法请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert