設定Apache以用戶憑證(Client CA)的方式進行訪客驗證

在使用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格式的檔案
  • pfxPKCS12格式的檔案副檔名

 

修改Apache的設定檔強制驗證訪客提供的憑證

到目前我們共產生了三個檔案:phpmyadmin.crtphpmyadmin.keyphpmyadmin.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安裝至使用者電腦後重新整理頁面,網頁就正常出現了

登愣~

不需要輸入帳密也可達到驗證訪客的功能,是不是很方便呢:)


發佈留言