這篇是
使用 OpenSSL 製做 Client Certificate 做客戶端 TLS 認證 - 配合 Nginx 和 Java
做示範
這篇文章的 CRL 設定補充。
如果要看 OCSP 的設定可以看我的另一篇文章:
Client Certificate 的 OCSP (Online Certificate Status Protocol) 設定
CRL 的全名是 Certificate Revocation List,
顧名思意是一個憑證撤銷狀態的列表,
有時雖然憑證的日期沒有過期、簽名驗證也都正確,
但是因為一些其他因素,例如 Private Key 被駭客偷走的憑證安全性問題等,
憑證可能會被 CA 認為需要強制撤銷 (Revoke),
這時我們除了認證憑證合法以外,還需要有方法來確認憑證的 Revoke 狀態,
顧名思意是一個憑證撤銷狀態的列表,
有時雖然憑證的日期沒有過期、簽名驗證也都正確,
但是因為一些其他因素,例如 Private Key 被駭客偷走的憑證安全性問題等,
憑證可能會被 CA 認為需要強制撤銷 (Revoke),
這時我們除了認證憑證合法以外,還需要有方法來確認憑證的 Revoke 狀態,
CRL 就是其中一種方法,其他還有像是 OCSP 的方法,會在我的另一篇文XXXXX
中做介紹。
在 CRL 方法中,CA 會定期更新憑證的撤銷列表到一個 CRL 檔案中,通常會以 pem
格式儲存,並且以 CA 來進行簽章 (Sign) 來證明其是由 CA 頒發的。
當我們要確認憑證的撤銷狀態時,通常會在憑證中找到 CRL 檔案的位置
(通常是一個網路 url 的位置),憑證中也有可能沒有寫上 CRL 資訊,這時有可能是
client, server 端已經彼些講好的位置,
拿到 CRL 檔案後,就可以在其中查找要確認的憑證撤銷狀態。
拿到 CRL 檔案後,就可以在其中查找要確認的憑證撤銷狀態。
CRL 檔案或是憑證中可能還會有其他資訊,例如有效期限、下一次 CRL
更新日期等,我們可以在期限到後主動查找新發佈版本的 CRL。
CRL 有一些優點:
- 其中一個優點就是架構簡單、實現方便,CA 只要定時的更新 CRL 即可。
- CRL 檔案容易取得,可能只是一個網路上的檔案,使用 HTTP Request 即可取得,取得後甚至可以把它在本地端,不用每次都去網路上抓取,等下次更新日或 CA 發表重大更新要求時再抓新版的 CRL。
- CA 如果不及時更新 CRL 檔 或是 詢問者不即時取得最新的 CRL 的話,即意味著 CRL 可能不是最新的,如果有憑證有安全問題即時的被 CA 公告需要 Revoke,沒更新 CRL 可能會無法即时知道。
- 另一個缺點是,因為 CRL 可能包含許多其他可能用不到的憑證狀態資訊,如果 CRL 檔很大,網路的傳送成本就會提高,也會讓我們在其中查找要確認的憑證時花較多的時間。
---------------------------------------------------------------------------------------------
現在要來示範要做 Client Certificate 時,產生 CRL 檔案和 Nginx 設定的方式。
Nginx 的設定非常簡單,接續這一篇文章的 Nginx 設定 使用 OpenSSL 製做 Client Certificate 做客戶端 TLS 認證 - 配合 Nginx 和 Java
做示範,只要再加上 ssl_crl
設定即可。
server { ...... ssl_client_certificate "ca.crt"; ssl_verify_client optional; ssl_crl "D:\xxx\xxx\ca.crl"; # CRL 檔案的位置,也可以是網路上的 url ...... }
接下來要來產生 CRL 檔案,
為了之後管理方便,在這裡我先建了幾個資料夾和檔案:
- ./certs:存放憑證的地方。
- ./csr:存放 CSR 的地方。
- ./crlnumber:存放 CRL 檔版本序號的地方。
- ./crl:存放 CRL 檔的地方。
- ./db/index:index 為我手動放置的一個空白檔案,作為一個紀錄憑證狀態的純文字檔,其實 CRL 可以不需要,主要給 OCSP 使用,但 CRL 也可從其中產生出 CRL 檔,也方便之後管理憑證狀態。
- ./keys:存放 Private Key 的地方。
- ./serial/serial:serial 為我手動放置的一個純文字檔案,其內容為一個單純的 serial number 序號,供憑證產生時的累加 Serial Key 使用,serial number 可視為對每一個 client certificate 的辨識唯一序號。
- ca.conf:供 openssl ca 指令用的配置檔,用以簡化指令參數長度及方便管理。
檔案內容例如可用以下指定 (自己用編輯器輸入也可以):
touch ./db/index openssl rand -hex 16 > serial/serial echo 1001 > crlnumber/crlnumber
因為會用到
openssl ca 指令,為了方便我們先來建立一個 config 配置檔供 openssl ca 指令參考,
這樣 openssl ca 指令就可以少打一些參數。
這樣 openssl ca 指令就可以少打一些參數。
ca.conf:
[default] name = root-ca default_ca = ca_config [ca_config] database = db/index serial = serial/serial crlnumber = crlnumber/crlnumber default_crl_days = 1 certificate = certs/ca.crt private_key = keys/ca.key new_certs_dir = certs default_md = sha256 policy = ca_policy unique_subject = no [ca_policy] countryName = match stateOrProvinceName = optional organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional
接著各項指令如下,
#產生 CA private key openssl genrsa -out ./keys/ca.key 4096 #產生 CA CSR openssl req -new -key ./keys/ca.key -out ./csr/ca.csr #產生 CA 憑證 openssl x509 -req -days 365 -in ./csr/ca.csr -signkey ./keys/ca.key -CAcreateserial -out ./certs/ca.crt #產生 CRL openssl ca -gencrl -config ./ca.conf -out ./crl/ca.crl #觀看 CRL 檔中的資訊 openssl crl -in ./crl/ca.crl -text -noout #產生 Client private key openssl genrsa -out ./keys/client.key 4096 #產生 Client CSR openssl req -new -key ./keys/client.key -out ./csr/client.csr #使用 ca.conf 產生 CA 憑證,這時 client 憑證可得到一個可識別的唯一序號, serial 裡的 serial number 也會改變, #此時也會發現 db/index 被加進了一條此 client 憑證的資料,db/index 有變動時可以手動下指令再製作一次新版本的 CRL openssl ca -config ./ca.conf -in ./csr/client.csr -out ./certs/client.crt -days 365 #向 CRL 檢查憑證是否 Valid or Revoke openssl verify -crl_check -CRLfile ./crl/ca.crl -CAfile ./certs/ca.crt ./certs/client.crt #撤銷 (Revoke) Client 憑證 -crl_reason 參數是 Revoke reason #撤銷後 db/index 會更新,憑證資訊欄位的 V (Valid 的意思) 會變成 R (Revoke) 的意思,並且會被標上 Revoke Date 訊息 #記得再下指令產生一下新版本的 CRL openssl ca -config ca.conf -revoke ./certs/client.crt -crl_reason unspecified # Revoke reason 可選列表如下: unspecified keyCompromise CACompromise affiliationChanged superseded cessationOfOperation certificateHold removeFromCRL
參考資料:
沒有留言 :
張貼留言