1 概述
acme.sh實現了acme協議,可以從Let‘s Encrypt生成免費的ssl證書用於實現https,本文介紹了常見的兩種服務器Apache與Nginx上利用acme.sh配置https服務。
約定:
APACHE_INSTALL_DIR --- Apache安裝目錄
NGINX_INSTALL_DIR --- Nginx安裝目錄
www.test.com --- 測試域名,請按需要換成自己的域名
2 准備工作
- 一個域名
- 一台雲服務器
2.1 域名與服務器
域名與服務器直接買就好了,筆者的都是在阿里雲上買的。
2.2 域名解析
需要確保域名可以解析到對應的ip上面,一般的域名購買商會提供解析服務,按圖形界面操作即可,以阿里雲為例,選擇域名進行解析:
主機記錄填www,記錄值填服務器公網ip.
間隔十分鍾左右可以ping一下自己的域名,如果顯示服務器ip則解析成功。
2.2 端口
服務器要開啟80與443端口,80用於HTTP測試,443用於HTTPS訪問。以阿里雲為例:
3 Nginx
Nginx有兩種安裝方式,一種是倉庫形式安裝,另一種是從源碼編譯安裝。
3.1 編譯安裝的Nginx(1.17.9)
3.1.1 安裝Nginx
先去下載源碼,上傳到服務器,解壓:
tar -zxvf nginx-1.17.9.tar.gz
cd nginx-1.17.9
可以先使用
./configure --help
查看選項幫助,這里要注意一下pcre與openssl,是源碼目錄,不是安裝目錄,安裝之后刪了源碼的,重新來這里下載pcre與這里下載openssl,注意一定需要http_ssl_module這個模塊,不要漏了。
./configure --prefix=/xxxxx --with-pcre=/xxxxx --with-openssl=/xxxx --with-http_ssl_module
make
sudo make install
好了之后進入安裝目錄下的sbin,啟動服務。
cd NGINX_INSTALL_DIR/sin
./nginx
然后可以在瀏覽器輸入服務器公網ip測試一下:
3.1.2 證書處理
首先安裝acme.sh
curl https://get.acme.sh | sh
. ~/.bashrc
生成證書
acme.sh --issue -d www.test.com --webroot NGINX_INSTALL_DIR/html
webroot的話就直接使用Nginx的默認文檔根目錄。好了之后會看到這樣的提示:
接着安裝證書:
acme.sh --installcert \
-d www.test.com \
--keypath /xxxx/xxx.key \
--fullchainpath /xxx/xxx.pem
路徑與名字隨便,后綴不能變。
3.1.3 Nginx配置
修改Nginx配置文件:
cd NGINX_INSTALL_DIR/conf
cp nginx.conf nginx.conf.bak
vim nginx.conf
找到HTTPS server這一行,這里是96行,把從server開始到最后一個花括號的代碼全部去掉注釋。
然后修改這三行,server_name填域名,ssl_certificate填剛才的pem文件路徑,ssl_certificate_key填剛才的key文件路徑。路徑建議絕對路徑,可以不加雙引號。
記得記得要加上一行ssl協議:
3.1.4 測試
可以先使用-t測試語法錯誤:
cd NGINX_INSTALL_DIR/sbin
./nginx -t
ok的話,重啟服務並輸入域名測試:
cd NGINX_INSTALL_DIR/sbin
./nginx -s stop
./nginx
成功!
3.2 從倉庫安裝Nginx(1.16.1)
3.2.1 安裝Nginx
從倉庫安裝就簡單多了,一行就可以了,系統Centos,其他自行搜索:
yum install nginx
可以先測試一下,直接用
nginx
開啟服務,然后瀏覽器輸入公網ip:
(筆者有點懷疑是不是裝了個假的Nginx,兩個的主頁居然不一樣。。。。)
3.2.2 證書處理
沒安裝acme.sh的先安裝:
curl https://get.acme.sh | sh
. ~/.bashrc
申請證書:
acme.sh --issue -d www.test.com --webroot /usr/share/nginx/html
安裝證書:
acme.sh --installcert \
-d www.test.com \
--keypath /xxxx/xxx.key \
--fullchainpath /xxx/xxx.pem
3.2.3 Nginx配置
同樣先備份:
cd /etc/nginx
cp nginx.conf nginx.conf.bak
vim nginx.conf
這里的配置比編譯安裝的又多了不少,一樣從server(61行)開始去掉注釋:
然后修改三行:
server_name填域名,ssl_certificate填pem文件,ssl_certificate_key填key文件。
最后增加一行ssl協議:
3.2.4 測試
可以先用-t測試語法錯誤:
nginx -t
ok的話重啟服務:
nginx -s stop
nginx
瀏覽器輸入域名訪問:
4 Apache
Apache也有兩種安裝方式,從源碼編譯安裝與從倉庫安裝。
4.1 編譯安裝的Apache(2.4.41)
4.1.1 安裝Apache
編譯安裝Apache比較麻煩,需要安裝pcre,apr,apr-util,生成Makefile時需要指定以下幾個選項:
--with-apr \
--with-apr-util \
--with-pcre \
--enable-ssl \
--with-ssl
具體可以看這里。
安裝好了之后需要先確定ssl模塊是否存在:
cd APACHE_INSTALL_DIR/modules
ls | grep ssl
如果沒有顯示mod_ssl.so,則需要重新安裝,確定生成Makefile時沒有漏掉
--enable-ssl
與
--with-ssl
如果有ssl模塊,直接修改配置文件測試一下。
cd APACHE_INSTALL_DIR/conf
vim httpd.conf
修改ServerName為
localhost:80
啟動服務輸入localhost測試:
cd APACHE_INSTALL_DIR/bin
./apachectl
頁面只有一行It works!:
(話說這和倉庫安裝的Apache首頁差距這么大。。。)
4.1.2 證書處理
沒安裝acme.sh的先安裝:
curl https://get.acme.sh | sh
. ~/.bashrc
申請證書:
acme.sh --issue -d www.test.com --webroot APACHE_INSTALL_DIR/htdocs
這里webroot為Apache默認的文檔根目錄.
安裝證書:
acme.sh --installcert -d www.test.com \
--key-file /xxxx/xxx.key \
--cert-file /xxxx/xxxx.crt \
--fullchain-file /xxx/xxxfullchain.crt
路徑與名字隨便,后綴名不能變。
4.1.3 Apache配置
首先修改conf/httpd.conf:
cd APACHE_INSTALL_DIR/conf
cp httpd.conf httpd.conf.bak
vim httpd.conf
找到這三行,去掉注釋。
然后修改httpd-ssl.conf:
cd extra
cp http-ssl.conf http-ssl.conf.bak
vim httpd-ssl.conf
DocumentRoot可以默認,ServerName改成
www.test.com:443
然后修改這三行,把證書的文件相應填入。
4.1.4 測試
語法檢查:
cd APACHE_INSTALL_DIR/bin
./apachectl -t
沒有錯誤之后重啟服務:
./apachectl stop
./apachectl
瀏覽器輸入域名訪問:
4.2 從倉庫安裝的Apache(2.4.6)
4.2.1 安裝Apache
yum install httpd
修改配置文件並進行測試:
cd /etc/httpd/conf
cp httpd.conf httpd.conf.bak
vim httpd.conf
找到ServerName改成
localhost:80
開啟服務后輸入localhost:80.
systemctl start httpd
另外要確保ssl模塊存在:
cd /etc/httpd/modules
ls | grep ssl
如果沒有輸出的話,證明沒有ssl模塊,需要安裝:
yum install mod_ssl
再一次grep:
ls | grep ssl
4.2.2 證書處理
沒安裝acme.sh的先安裝:
curl https://get.acme.sh | sh
. ~/.bashrc
申請證書:
acme.sh --issue -d www.test.com --webroot /var/www/html
其中/var/www/html為Apache默認文檔根目錄。
安裝證書:
acme.sh --installcert -d www.test.com \
--key-file /xxxx/xxx.key \
--cert-file /xxxx/xxxx.crt \
--fullchain-file /xxx/xxxfullchain.crt
4.2.3 Apache配置
修改ssl.conf:
cd /etc/httpd/conf.d
cp ssl.conf ssl.conf.bak
vim ssl.conf
修改ServerName與DocumentRoot,ServerName填域名,DocumentRoot直接去掉注釋。接着修改以下三行,根據剛才生成的三個文件對應填入即可。
4.2.4 測試
apachectl -t
沒有語法錯誤就重啟服務:
systemctl stop httpd
systemctl start httpd
瀏覽器輸入訪問:
5 總結
其實這里采用了比較麻煩的方式手動安裝證書,acme.sh其實還有更簡單的不需要webroot的命令:
acme.sh --issue -d www.test.com --apache
acme.sh --issue -d www.test.com --nginx
另外還可以通過手動dns的方式:
acme.sh --issue -d www.test.com --dns dns_xxx
這種方式可以利用域名解析商提供的api自動添加記錄完成認證,可以參考這里。
另外文章沒有說到證書過期更新的問題,可以看官方中文說明,這里。
除此之外還可以利用openssl使安全性的評分更高,測試網站這里,修改配置這里。
還有最后一個,現有雲服務器廠商提供了免費的證書購買,如阿里雲,可以直接購買免費證書然后利用文檔安裝到服務器上。
祝你們早日有一個屬於自己的https的網站。