acme.sh介紹:https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8Ehtml
github:https://github.com/Neilpang/acme.shjava
安裝很是簡單,就一個命令,建議使用root帳戶進行安裝,如下演示都是root帳戶。nginx
curl https://get.acme.sh | sh
安裝所在的目錄爲 ~/.acme.sh/git
建立一個別名方便使用github
alias acme.sh=~/.acme.sh/acme.sh
安裝時已經爲系統建立crontab定時任務,續簽證書的調度任務。能夠經過 crontab -l 查看,以下web
自動檢測全部的證書, 若是快過時了, 須要更新, 則會自動更新證書。bash
安裝過程當中全部的修改都限制在安裝目錄~/.acme.sh/中,所以不用擔憂對已有的系統任何功能和文件污染。
服務器
假設爲 www.mydomain.com 這個域名配置證書。session
在生成以前須要先安裝 socat ,使用以下命令安裝dom
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.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定時中須要絕對路徑。
#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. http://www.javashuo.com/article/p-udlfwlst-ep.html
另外有dns生成ssl證書的方式,請參考 http://www.javashuo.com/article/p-gbowfucd-dr.html