centos7利用acme.sh獲取Let's Encrypt的永久免費ssl證書並配置網站域名https訪問


acme.sh介紹:https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E

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

 1. 安裝 acme.sh

安裝非常簡單,就一個命令,建議使用root賬戶進行安裝,以下演示都是root賬戶。

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

安裝所在的目錄為 ~/.acme.sh/

創建一個別名方便使用

alias acme.sh=~/.acme.sh/acme.sh

安裝時已經為系統創建crontab定時任務,續簽證書的調度任務。可以通過 crontab -l 查看,如下

自動檢測所有的證書, 如果快過期了, 需要更新, 則會自動更新證書。

安裝過程中所有的修改都限制在安裝目錄~/.acme.sh/中,因此不用擔心對已有的系統任何功能和文件污染。

2. 生成SSL證書

2.1

假設為 www.mydomain.com 這個域名配置證書。

在生成之前需要先安裝 socat ,使用如下命令安裝

mkdir ~/src
cd ~/src
wget http://www.dest-unreach.org/socat/download/socat-1.7.3.0.tar.gz
tar -xf socat-1.7.3.0.tar.gz 
cd socat-1.7.3.0
./configure --prefix=$HOME
make
make install

下面開始正式生成ssl證書,生成證書的方式有多種,可以參考:https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert

在此生成證書的方案選擇standalone方式(需要80端口不被占用,acme.sh 自己作為一個web服務臨時監聽80端口完成證書驗證),由於此時服務器(nginx)已經占用80端口

通過咨詢acme.sh作者續簽問題,注:由於使用nginx服務,后面會一直占用80端口,如下:

所以最終我們的生成證書命令為:

acme.sh --issue -d www.mydomain.com --standalone --pre-hook "/nginx/nginx/sbin/nginx -s stop" --post-hook "/nginx/nginx/sbin/nginx"

其中 /nginx/nginx/sbin/nginx 為自己服務器中nginx執行文件

成功之后,生成的證書目錄在:/root/.acme.sh/www.mydomain.com

2.2 續簽相關

2.1中也有提到生成簽名需要80端口不被占用,那么問題來了,后面服務器要啟動nginx,而且需要占用80端口,所以上面的續簽定時是有問題的,所以crontab定時修改如下:

crontab -e

44 3 * * * source ~/.bash_profile && ~/.acme.sh/acme.sh --issue -d www.mydomain.com --standalone --pre-hook "/nginx/nginx/sbin/nginx -s stop" --post-hook "/nginx/nginx/sbin/nginx" > /dev/null

保存即可!注:crontab定時中需要絕對路徑。

3. nginx配置SSL證書

    #ssl
    upstream mydomain7777 {
        server 127.0.0.1:7777  weight=1;
    }
    server {
        listen       443 ssl;
        server_name  www.mydomain.com;

        location / {
            proxy_pass http://mydomain7777;
            proxy_redirect default;
            client_max_body_size 10m; #表示最大上傳10M,需要多大設置多大。
            #設置主機頭和客戶端真實地址,以便服務器獲取客戶端真實IP
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Scheme $scheme;
        }

        ssl_certificate      /root/.acme.sh/www.mydomain.com/fullchain.cer;
        ssl_certificate_key  /root/.acme.sh/www.mydomain.com/www.mydomain.com.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
    }

還可以配置http強制轉https(可選)

    server {
        listen       80;
        server_name  www.mydomain.com;
        rewrite ^(.*) https://$server_name$1 permanent;
    }

 

注:proxy_set_header X-Forwarded-Scheme $scheme; 配置是為了程序中獲取到請求協議(http或者https),以java為例獲取代碼如下:

String scheme = request.getHeader("X-Forwarded-Scheme");
if (scheme == null) {
    scheme = request.getScheme();
}

 

參考博客:

1. https://my.oschina.net/u/3042999/blog/1858891

2. https://community.webfaction.com/questions/21246/trying-to-use-lets-encrypt-using-acmesh-need-socat-tools

 

另外有dns生成ssl證書的方式,請參考 https://www.cnblogs.com/007sx/p/11379966.html

 


免責聲明!

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



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