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