在使用Apache管理網頁服務時,有時會遇到希望可以設定某些網頁服務是只有經過授權的人才能存取
常見的做法是可以利用Apache跳出提示輸入帳密提示框後,成功登入者才能進行下一步訪問
今天我們要來講講第二種做法:
發憑證給授權的使用者,並且在每次訪客訪問網站時驗證訪客提交的憑證是否為我方發行無變造過的
確認無誤才準放行進行下一步訪問,如果沒有憑證或憑證沒有通過驗證者都一律拒於門外
使用用戶憑證(Client CA)的方式進行訪客驗證就好像使用SSH Key登入SSH的概念,不用再多背一組帳密
而且因為是使用憑證,他的安全性遠高於帳密
想想假設今天一個網站使用帳密進行驗證,積極一點的駭客會使用暴力破解或字典檔想設法去猜中帳密
但如果今天使用憑證進行驗證,是不是就算再積極也無從下手了呢
步驟
要設定Apache以用戶憑證(Client CA)的方式進行訪客驗證有三個步驟要做:
- 產生用戶憑證檔與憑證私鑰
- 轉換成
pfx
格式 - 修改Apache的設定檔強制驗證訪客提供的憑證
以下我就拿自己的phpMyAdmin資料庫後台網頁進行示範,設定只有持有合格的用戶憑證者才能存取
產生用戶憑證檔與憑證私鑰
首先,我們要製作準備發給用戶進行驗證用的憑證
為了方便起見,這邊使用openssl
來自己產自己簽憑證
自己產自己簽的好處是方便快速而且免費,缺點是由於憑證不是經認證的憑證頒發機構簽出來的
當使用者拿到我們發的憑證時系統會有憑證來源警示說該憑證不是經認證的憑證頒發機構簽出來的
不過沒關係反正phpMyAdmin也是給自己用,這個警示也不是那麼重要
openssl req -x509 -nodes -days 99999 -newkey rsa:2048 -keyout phpmyadmin.key -out phpmyadmin.crt
- 參數
-x509
指定了我們的要的憑證格式是目前網頁服務常用的X.509
格式 - 參數
-nodes
表示不要將輸出的憑證私鑰加密 - 參數
-days 99999
這張憑證將在99999天後到期 - 參數
-newkey rsa:2048
指定了我們在產憑證時將使用RSA-2048
演算法產生憑證私鑰 - 參數
-keyout phpmyadmin.key
指定了憑證私鑰的檔名與存放位置 - 參數
-out phpmyadmin.crt
指定了憑證的檔名與存放位置
執行指令時會要求填入一些資料,Common Name的地方一定要填對伺服器的網址
不然瀏覽器會不知道當連至這個網址時需要夾帶該憑證
成功執行完上述指令後,資料夾中會多出一個憑證檔phpmyadmin.crt
與憑證私鑰phpmyadmin.key
轉換成PKCS12格式
有了憑證檔與憑證私鑰,接著我們必需將這兩個檔案合併成一個PKCS12
格式的檔案
PKCS12
這種格式一次包含了上述資訊,方便於發行給使用者們安裝
openssl pkcs12 -export -in phpmyadmin.crt -inkey phpmyadmin.key -out phpmyadmin.pfx
- 參數
-export
表示我們要輸出檔案 - 參數
-in phpmyadmin.crt
為輸入的憑證檔 - 參數
-inkey phpmyadmin.key
為輸入的憑證私鑰 - 參數
-out phpmyadmin.pfx
為輸出的PKCS12
格式的檔案 pfx
是PKCS12
格式的檔案副檔名
修改Apache的設定檔強制驗證訪客提供的憑證
到目前我們共產生了三個檔案:phpmyadmin.crt
、phpmyadmin.key
與phpmyadmin.pfx
現在我們要來設定一下Apache好強制驗證連進來的訪客都必需進行憑證驗證
打開Apache裡phpMyAdmin的虛擬主機設定檔
我的伺服器是用Ubuntu,所以路徑是在/etc/apache2/sites-available/XXXX.conf
在VirtualHost
裡面補上:
SSLVerifyClient require SSLVerifyDepth 10 SSLCACertificateFile /home/user/phpmyadmin.crt
打開強制驗證訪客的功能,並且將SSLCACertificateFile
指到我們剛剛自己產的憑證
整份設定檔應該會長得像這樣
<VirtualHost *:8080> DocumentRoot /usr/share/phpmyadmin/ ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/letsencrypt/live/andywu.tw/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/andywu.tw/privkey.pem SSLVerifyClient require SSLVerifyDepth 10 SSLCACertificateFile /home/user/phpmyadmin.crt </VirtualHost>
儲存並離開,並重啟Apache服務sudo service apache2 restart
連進我的phpMyAdmin頁面後會發現由於電腦尚未安裝phpmyadmin.pfx
,所以訪問被擋下來是正常的
仔細看圖中瀏覽器給的錯誤訊息也正是因為憑證問題所以被拒絕訪問
將剛剛創立的phpmyadmin.pfx
安裝至使用者電腦後重新整理頁面,網頁就正常出現了
登愣~
不需要輸入帳密也可達到驗證訪客的功能,是不是很方便呢:)