# 使用acme腳本申請免費ssl證書並自動續簽

By [Stever Dove](https://paragraph.com/@stever-dove) · 2023-06-28

---

隨著支持https的網站越來越多，一些還沒有支持https的網站也加入了擁抱https的步伐。免費的ssl證書的「登場」也加速了普及的進度。 對於公開對外服務的各類網站而言，做到一年、甚至幾個月手動更新一次ssl證書並不是難事，但非正式服務或者僅對內部開放的服務來說，可能相應管理員就不情願做這個了。這時候，就要用到腳本化方式自動更新了。 這介紹的是使用 acme 腳本申請 letsencrypt 證書並自動更新的方法，項目地址在這：[https://github.com/Neilpang/acme.sh](https://github.com/Neilpang/acme.sh)

1.安裝

登錄伺服器，執行一條命令。

    curl  https://get.acme.sh | bash
    

2.申請證書 使用該腳本申請證書的驗證方式有兩種，一種是網站文件驗證，一種是DNS驗證，由於在正式的生產環境中是不可能的隨隨便便就能改動網站內容的，於是選擇DNS驗證。 在執行申請證書命令之前，需要先登錄域名註冊商的管理面板獲取APIKey以後才能繼續，該腳本支持主流的DNS服務商。例如 cloudflare、dnspod、cloudxns、godaddy 等。詳細方法可參閱：[https://github.com/Neilpang/acme.sh/wiki/dnsapi](https://github.com/Neilpang/acme.sh/wiki/dnsapi) 以cloudflare為例，獲取APIKey後，在服務器終端中執行以下命令。

    export CF_Key="獲取的key"
    export CF_Email="登錄面板用的電子郵件地址"
    

然後申請證書（將youdomainname替換為所需域名，可泛匹配）：

    acme.sh --issue --dns dns_cf -d youdomainname -d *.youdomainname.com
    

*   若位於docker容器內，命令行請使用 .acme.sh/acme.sh 替換掉 [acme.sh](http://acme.sh) 申請證書成功後，那麽就需要安裝證書了，已經生成的證書位於當前登錄服務器用戶的home目錄下的 .acme.sh文件夾中，不過這裏的文件並不能直接使用，需要用到專門的命令來安裝。
    

正確的使用方法是使用 –installcert 命令,並指定目標位置, 然後證書文件會被copy到相應的位置。命令中所在的路徑必須為當前登錄用戶可讀寫的，不過秘鑰文件是否已經存在則無要求。

    acme.sh  --installcert  -d  已經申請證書的域名   \
            --key-file   所需要的路徑/server.key \
            --fullchain-file 所需要的路徑/fullchain.cer \
            --reloadcmd  "service nginx force-reload"
    

指定的所有參數都會被自動記錄下來, 並在將來證書自動更新以後, 被再次自動調用。

如果是初次設置網站https，那麽也需要修改web服務器的配置文件。在本文中也貼出一份nginx的配置文件供各位參考。（如需復製使用，請刪除註釋）

    server {
            listen       80 default; #80端口監聽（可單獨設置在一個http選項中）
            listen       443 ssl http2; #443端口ipv4監聽
            listen       [::]:443 ssl http2; #443端口ipv6監聽
            server_name  example.com; #域名1
            server_name  www.example.com; #域名2
            root         /var/www/website1;    #網站根目錄
            index  index.html index.php index.htm;
            client_max_body_size 10240M;
    
            ssl_certificate "/etc/nginx/ssl/server.crt"; #證書位置
            ssl_certificate_key "/etc/nginx/ssl/server.key"; #秘鑰位置
            ssl_session_cache shared:SSL:1m;
            ssl_session_timeout  10m;
            ssl_ciphers HIGH:!aNULL:!MD5;
            ssl_protocols TLSv1.1 TLSv1.2;
            ssl_prefer_server_ciphers on;
    
            include /etc/nginx/default.d/*.conf;
    
            location / {
            try_files $uri $uri/ /index.php$is_args$args;
            }
    
            error_page 404 /404.html;
                location = /40x.html {
            }
    
            error_page 500 502 503 504 /50x.html;
                location = /50x.html {
            }
    
            location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000; #php-fpm-sock鏈接方式
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
            include fastcgi_params;
        }
    
    }
    

3.續簽證書 續簽證書將由腳本使用crontab定時任務自動完成，用戶無須擔心。不過服務器環境是在docker容器內的話，則需要註意是否安裝了crontab服務，以及是否啟動以及支持自動啟動。

    安裝crontab服務：
    
    ubuntu/debian:
    
    apt-get install cron
    
    redhat/centos:
    
    yum install -y cron
    

在確定好crontab有效之後，再打開acme自身的自動更新，一個ssl免維護環境就搞定了。

4.關於https的個人看法

使用https可以有效減少多種 內容從瀏覽器傳輸到服務器過程中的 安全隱患。 使用https以及配合其發展的多種新技術可以讓網站速度更快。例如QUIC HTTP2。 如果這是一個商業網站，當用戶看到瀏覽器中的那把小鎖，帶來的感受遠不僅僅是安全這麽簡單。

---

*Originally published on [Stever Dove](https://paragraph.com/@stever-dove/acme-ssl)*
