2007年5月4日 星期五

[OpenSSL] CA建置(2) - Signed CA

產生 CA certificate

上一篇說完建置 Self-Signed CA (亦即 root CA) 後,這裡繼續要以 root CA 為基礎,為其建立一個 Signed CA (亦即 child CA)....

首先要到 root CA server 中,產生給 child CA 的憑證:
# 產生憑證要求(Certificate Request)
shell> /usr/share/ssl/misc/CA.pl -newreq
Generating a 1024 bit RSA private key
.............++++++
......................................................++++++
writing new private key to 'newreq.pem' # 從這裡可以知道 Certificate Request 的檔案名稱為何
Enter PEM pass phrase: # 此處要輸入密碼
Verifying - Enter PEM pass phrase: # 此處要進行密碼確認
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
# 以下會問一下憑證相關資訊,若不知道怎麼回答,就輸入「.」吧! 該欄位會被省略!
Country Name (2 letter code) [GB]:TW # 國家名稱縮寫
State or Province Name (full name) [Berkshire]:. # 縣市名稱
Locality Name (eg, city) [Newbury]:Taipei # 地區名稱
Organization Name (eg, company) [My Company Ltd]:. # 組織名稱
Organizational Unit Name (eg, section) []:. # 單位名稱
Common Name (eg, your name or your server's hostname) []:gLiteCA # 主機名稱
Email Address []:godleon@gmail.com
# E-Mail address

# 額外資訊(可不填)
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Request (and private key) is in newreq.pem
如此一來,certificate request 就產生出來了!


而這裡產生的 certificate request,基本上跟一般 client 用的是相同的,沒有什麼特別,不過若是要給 child CA 用的 certificate,則 CA 在簽署的方式就有差別了,以下是簽署給 child CA 用的 certificate 的實作方式:
shell> /usr/share/ssl/misc/CA.pl -signCA
Using configuration from /usr/share/ssl/openssl.cnf # 仔細看喔! 這邊是使用 openssl.cnf 中的設定!
Enter pass phrase for /CA/private/cakey.pem: # 輸入 CA private key 的密碼
Check that the request matches the signature
Signature ok
Certificate Details: # 以下是此憑證的詳細內容
Serial Number: 3 (0x3)
Validity
Not Before: Apr 16 16:35:44 2007 GMT
Not After : Apr 15 16:35:44 2008 GMT
Subject:
countryName = TW
localityName = Taipei
commonName = gLiteCA
emailAddress = godleon@gmail.com
X509v3 extensions:
X509v3 Subject Key Identifier:
8F:12:C8:AC:59:86:F6:4B:F1:18:FE:28:2C:00:A3:F5:BE:E4:90:D0
X509v3 Authority Key Identifier:
keyid:BC:3C:4F:65:62:82:A6:3E:C5:8F:F7:96:D5:94:D1:00:C8:76:47:FA
DirName:/C=TW/L=Taipei/CN=rootCA/emailAddress=godleon@gmail.com
serial:00

X509v3 Basic Constraints:
CA:TRUE
Certificate is to be certified until Apr 15 16:35:44 2008 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Signed CA certificate is in newcert.pem
看清楚了嗎? 如果要將 certificate request 簽署為給 child CA 用的 certificate,必須使用「signCA」參數。

而且從簽署的內容中也可以看出跟簽署一般 client 的 certificate 不同,可以看到在「X509v3 Basic Constraints」的下一行,有 "CA:TRUE" 的內容出現;以及在最後一行中,有 "Signed CA certificate is ......." 的內容出現,可以看出此 certificate 是給 child CA 用的。


建置 Signed CA

CA certificate 產生後,此即為 child CA 的 public key,而 private key 則必須從原本的 certificate request 取出,假設將其命名為 cakey.pem,接著將 newcert.pem 以及 cakey.pem 透過 scp 或其他方式傳送到 child CA server 上。

child CA server 有了這兩個檔案後,就可以來建置 Signed CA 囉! 首先當然還是要安裝 OpenSSL 相關套件,以後也是以 CA.pl 這支 Perl script 進行設定說明。

在建置 Self-Signed CA 時,可以用 newCA 參數直接建立 CA 相關目錄以及所需要的 certificate 檔案,那在 Signed CA 中呢? 其實很簡單,既然 certificate 檔案已經有了,只要再透過 newCA 參數將相關目錄建立起來,再用 root CA 所給的 certificate 以及 cakey 將 目錄中的檔案覆蓋掉即可!

其中 newcert.pem 可以直接取代,而 cakey.pem 則在目錄 private 中。

如此一來,Signed CA 就建置完成了! 至於使用 Signed CA 產生給一般 client 用的 certificate 的方式,就跟 root CA 一樣,就不再贅述了!


參考資料:
  1. Certificate authority
  2. CA (Certificate Authority) 憑證管理中心
  3. OpenSSL入門
  4. 產生一張 SSL 電子證書
  5. Creating a Certificate Authority
  6. Creating Your Own CA
  7. CA建置工具:Openssl的管理與使用介紹(上)
  8. CA建置工具:Openssl的管理與使用介紹(下)
  9. CA.pl(1)

沒有留言:

張貼留言