[黑客人生] 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>

這樣就行了。

jedi.org: