Tatooine 的用戶端憑證驗證
這兩天覺得就算有 SSL 連線,搭配單純的 htpasswd 密碼保護還是不夠安全,所以決定在 Tatooine 上面實做 SSL 用戶端憑證驗證。在 rafan 的協助下,除了參考【SSL X.509 憑證教學】一文外,還參考了【mod_SSL: HowTo - Selective Certificate-based Client Authentication】、【OpenSSL PKCS#12 FAQ v1.83】、【OpenSSL PKCS#12 Program Usage.】,另外過程中遭遇的錯誤代碼則是查詢【NSS and SSL Error Codes】的表格,最後終於試出來了!
以下是這次變更的摘要記錄:
簡單來說,做這件事會需要生出 PKCS#12 格式的憑證+私鑰檔給用戶端,整件事都可以用 OpenSSL 來完成。首先我們先製作用戶 rafan 的私鑰:
openssl genrsa -out /etc/ssl/private/rafan.key.pem
2048
然後用這把私鑰來填寫憑證申請書:
openssl req -new -key /etc/ssl/private/rafan.key.pem
-out /tmp/rafan.req.pem
再來用我們的 Root CA 來簽署給用戶 rafan 的憑證,有效期限 180 天:
openssl x509 -req -days 180 -sha1 -extfile /etc/ssl/openssl.cnf -extensions v3_req -CA /etc/ssl/certs/roo-ca.crt.pem
-CAkey /etc/ssl/private/root-ca.key.pem
-CAserial /etc/ssl/root-ca.srl
-CAcreateserial -in /tmp/rafan.req.pem
-out /etc/ssl/certs/rafan.crt.pem
最後一步就是把要交給 rafan 的私鑰和憑證匯出成 PKCS#12 格式:
openssl pkcs12 -export -in /etc/ssl/certs/rafan.crt.pem
-inkey /etc/ssl/private/rafan.key.pem
-out /tmp/rafan.p12
-name "rafan
"
在最後一步中,還會被詢問「匯出密碼 (Export Password) 」,這個密碼妳可以隨意決定,當用戶要匯入檔案時就會被問到。最後祇消把這個密碼跟這個被製作出來的 PKCS#12 格式的檔案,一併交給用戶 rafan ,讓她匯入到瀏覽器的個人憑證區即可。
喔,對了,然後我們還得修改一下 Apache 的 httpd.conf ,加上這些東西:
SSLVerifyClient none
<Location /Memeber-Only>
SSLVerifyClient require
SSLVerifyDepth 1
</Location>
這樣就行了。