Linux下使用acme.sh 配置https 免費證書


acme.sh

簡單來說acme.sh 實現了 acme 協議, 可以從 let‘s encrypt 生成免費的證書。
acme.sh 有以下特點:
一個純粹用Shell(Unix shell)語言編寫的ACME協議客戶端。
完整的ACME協議實施。 支持ACME v1和ACME v2 支持ACME v2通配符證書
簡單,功能強大且易於使用。你只需要3分鍾就可以學習它。
Let's Encrypt免費證書客戶端最簡單的shell腳本。
純粹用Shell編寫,不依賴於python或官方的Let's Encrypt客戶端。
只需一個腳本即可自動頒發,續訂和安裝證書。 不需要root/sudoer訪問權限。
支持在Docker內使用,支持IPv6

 

github鏈接:https://github.com/Neilpang/acme.sh

 

本文記錄了我在把網站從HTTP升級到 HTTPS ,申請和安裝SSL證書路上踩過的幾個坑。

安裝環境:
操作系統:centos 7 X64
SSL證書來源:Let's Encrypt
安裝用腳本:acme.sh
服務器:nginx
域名:chandao.test.com

1.安裝acme.sh

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

2.安裝后的配置
把 acme.sh 安裝到你的 home 目錄下:~/.acme.sh/並創建 一個 bash 的 alias, 方便你的使用:

alias acme.sh=~/.acme.sh/acme.sh
echo 'alias acme.sh=~/.acme.sh/acme.sh' >>/etc/profile

安裝過程中會自動為你創建 cronjob, 每天 0:00 點自動檢測所有的證書, 如果快過期了, 需要更新, 則會自動更新證書(可執行crontab -l 查看)。

00 00 * * * root /root/.acme.sh/acme.sh --cron --home /root/.acme.sh &>/var/log/acme.sh.logs

3.申請證書
acme.sh 實現了 acme 協議支持的所有驗證協議. 一般有兩種方式驗證: http 和 dns 驗證(本文不提供dns方式申請,dns手動模式,不能自動更新證書。在續訂證書時,您必須手動向域中添加新的txt記錄。)

HTTP 方式方法如下:

acme.sh --issue -d chandao.test.com --webroot /data/wwwroot/chandao

只需要指定域名, 並指定域名所在的網站根目錄【命令中/data/wwwroot/chandao為域名的根目錄路徑】. acme.sh 會全自動的生成驗證文件, 並放到網站的根目錄, 然后自動完成驗證. 最后會聰明的刪除驗證文件. 整個過程沒有任何副作用.

4.證書的安裝
注意, 默認生成的證書都放在安裝目錄下: ~/.acme.sh/, 請不要直接使用此目錄下的文件,
例如: 不要直接讓 nginx/apache 的配置文件使用這下面的文件.
這里面的文件都是內部使用, 而且目錄結構可能會變化.

正確的使用方法是使用 --installcert 命令,並指定目標位置, 然后證書文件會被copy到相應的位置,

默認情況下,證書將每60天更新一次(可配置)。更新證書后,將通過以下命令自動重新加載Apache / Nginx服務:service apache2 force-reloadservice nginx force-reload

請注意:reloadcmd非常重要。證書可以自動續訂,但是,如果沒有正確的“reloadcmd”,證書可能無法刷新到您的服務器(如nginx或apache),那么您的網站將無法在60天內顯示續訂證書。

nginx示例1:

acme.sh --installcert -d chandao.test.com --key-file /usr/local/nginx/ssl_cert/test.com/chandao.test.com.key --fullchain-file /usr/local/nginx/ssl_cert/test.com/chandao.test.com.cer --reloadcmd "service nginx force-reload"

nginx示例2:

acme.sh --install-cert -d chandao.test.com \ --key-file /usr/local/nginx/ssl_cert/test.com/chandao.test.com.key \ --fullchain-file /usr/local/nginx/ssl_cert/test.com/chandao.test.com.cer \ --reloadcmd      "service nginx force-reload"

apache示例:

acme.sh --install-cert -d chandao.test.com \ --cert-file /usr/local/nginx/ssl_cert/test.com/chandao.test.com.key \ --key-file /path/to/keyfile/in/apache/key.pem \ --fullchain-file /usr/local/nginx/ssl_cert/test.com/chandao.test.com.cer \ --reloadcmd      "service apache2 force-reload"

 

附帶完成前面1-4步驟的截圖:

5. Nginx/Tengine服務器安裝SSL證書

Nginx 配置Http和Https共存

 

listen 80; #如果硬性要求全部走https協議,這一行去除 listen 443 ssl http2; #如果硬性要求全部走https協議,這里去除ssl server_name chandao.test.com; #ssl on; #如果硬性要求全部走https協議,這里開啟ssl on ssl_certificate /usr/local/nginx/ssl_cert/test.com/chandao.test.com.cer; ssl_certificate_key /usr/local/nginx/ssl_cert/test.com/chandao.test.com.key; #ssl性能調優 #nginx 1.13.0支持了TLSv1.3,TLSv1.3相比之前的TLSv1.2、TLSv1.1等性能大幅提升 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_timeout 10m; #使用ssl_session_cache優化https下Nginx的性能 ssl_session_cache builtin:1000 shared:SSL:10m; #OCSP Stapling 開啟。OCSP是用於在線查詢證書吊銷情況的服務,使用OCSP Stapling能將證書有效狀態的信息緩存到服務器,提高 TLS 握手速度 ssl_stapling on; #OCSP Stapling 驗證開啟 ssl_stapling_verify on; 

 

完整例子:

 

server { listen 80; #如果硬性要求全部走https協議,這一行去除 listen 443 ssl http2; #如果硬性要求全部走https協議,這里去除ssl server_name chandao.test.com; access_log off; index index.html index.htm index.php; root /data/wwwroot/chandao; #ssl on; #如果硬性要求全部走https協議,這里開啟ssl on ssl_certificate /usr/local/nginx/ssl_cert/test.com/chandao.test.com.cer; ssl_certificate_key /usr/local/nginx/ssl_cert/test.com/chandao.test.com.key; #ssl性能調優 #nginx 1.13.0支持了TLSv1.3,TLSv1.3相比之前的TLSv1.2、TLSv1.1等性能大幅提升 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_timeout 10m; #使用ssl_session_cache優化https下Nginx的性能 ssl_session_cache builtin:1000 shared:SSL:10m; #OCSP Stapling 開啟。OCSP是用於在線查詢證書吊銷情況的服務,使用OCSP Stapling能將證書有效狀態的信息緩存到服務器,提高 TLS 握手速度 ssl_stapling on; #OCSP Stapling 驗證開啟 ssl_stapling_verify on; #error_page 404 /404.html; #error_page 502 /502.html; location ~ [^/]\.php(/|$) { #fastcgi_pass remote_php_ip:9000; fastcgi_pass unix:/dev/shm/php-cgi.sock; fastcgi_index index.php; include fastcgi.conf; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ { expires 30d; access_log off; } location ~ .*\.(js|css)?$ { expires 7d; access_log off; } location ~ /\.ht { deny all; } }

 

 

 

6.重啟nginx
保存退出后,通過nginx -t來檢查配置文件是否正確,有錯誤的話改之即可。配置文件檢測正確之后,通過service nginx force-reload來重載配置文件。

nginx -t service nginx force-reload

7. 更新 acme.sh
目前由於 acme 協議和 letsencrypt CA 都在頻繁的更新, 因此 acme.sh 也經常更新以保持同步.

升級 acme.sh 到最新版 :

acme.sh --upgrade

如果你不想手動升級, 可以開啟自動升級:

acme.sh --upgrade --auto-upgrade

之后, acme.sh 就會自動保持更新了.

你也可以隨時關閉自動更新:

acme.sh --upgrade --auto-upgrade 0

6. 出錯怎么辦:
如果出錯, 請添加 debug log:

acme.sh --issue ..... --debug 

或者:

acme.sh --issue ..... --debug 2

 

查看證書列表

 

acme.sh --list
刪除證書

 

acme.sh remove Main_Domain(證書的主域名,上述證書列表中可看見)

 

8.注意事項:
1、開啟后請把所有網站的鏈接替換為https,尤其是圖片鏈接等。推薦寫鏈接時用//www.test.com而不是https://www.test.com,這種寫法會優先使用HTTPS而且不會禁止HTTP。
2、記得打開443端口。
3、如果過了一段時間出現了類似NET :: ERR_CERT_AUTHORITY_INVALID的錯誤,請檢查是不是設置了證書鏈SSLCertificateChainFile。
4、安裝證書時,--key-file和--fullchain-file的參數是你想要把證書安裝在的位置,而不是之前申請到的證書的位置。這個位置會在配置nginx時使用到。
5、如果配置參數出錯,最好只安裝不要再申請。因為申請次數有限制。同一域名,每周最多申請10個證書,每周刷新。
6、域名要寫常用的。如果要使用https://www.test.com訪問網頁,域名選項-d 的參數一定要寫www.test.com,如果申請證書和訪問的域名不完全一致,訪問時會提示不安全“訪問的網站使用的安全證書域名錯誤”。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM