Nginx/Apache + acme.sh 實現https訪問

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的網站。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章