2007年5月4日 星期五

[OpenSSL] CA建置(1) - Self-Signed CA

前言

上一篇文章中,簡單介紹了 CA(Certificate Authority),而在實作的部分,是以 OpenSSL 搭配 Perl script(CA.pl) 來進行建置,並分成 Slef-Signed CA 以及 Signed CA 兩個部分來介紹...

其中 Self-Signed CA 是 root CA(Parent CA);另外一個 Signed CA 則是 Child CA。


套件安裝

上面提到要用 OpenSSL 以及 Perl script 來實作 CA,在 Linux 上安裝這些套件是相當容易的,使用以下指令即可安裝完成:
# 安裝 OpenSSL 套件以及設定工具
# 每個 Linux distribution 的套件名稱都有點不太一樣,安裝前必須先注意
# 不過基本上關鍵字就是 openssl 與 perl
shell> apt-get -y install openssl openssl-perl
其中 Perl script 套件安裝後,會有一個主要的設定檔案 CA.pl 會安裝進系統中,管理者必須將找出這個檔案的正確位置以便使用。


建置 Slef-Signed CA

透過 CA.pl 建置 Slef-Signed CA 是相當容易的,而 CA.pl 這支 script 也是以 openssl.cnf 中的設定為依據進行設定,只是省略掉大部分人安裝時會省略的部分,讓安裝 CA 的工作可以更快完成,若要進行更細部的設定,還是必須要熟悉此設定檔才行。

而若要瞭解 openssl.cnf 的詳細設定方式,可以參考此文件


當要進行 CA server 設定前,必須先規劃好相關的憑證檔案要放置於何處,此時可以檢查一下 CA.pl 這支 script,看其進行設定工作時所使用的目錄是以那個檔案中記錄的為依據;基本上,只有以下兩種可能:
  1. openssl.cnf 中,[CA_default] 區段中的 dir 欄位
  2. CA.pl 檔案中已經指定 $CATOP 變數


接著就可以著手進行建置 CA server 的工作了! 首先執行以下指令:
# 建立新的 CA server
shell> /usr/share/ssl/misc/CA.pl -newca
CA certificate filename (or enter to create) # 這裡就按 Enter 跳過直接用設定檔中的內容

Making CA certificate ...
Generating a 1024 bit RSA private key
................................................++++++
........................................................................++++++
writing new private key to '/CA/private/cakey.pem'
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) []:rootCA # CA 主機名稱
Email Address []:godleon@gmail.com # E-Mail Address
透過「newca」參數,可以直接完成下列工作:
  1. 產生 CA 的 private key
  2. 產生 self-signed 的 certificate

接著相關目錄以及檔案都會建立完成,以下介紹這些檔案與目錄的意義:
# 切換到 CA server 相關檔案所在目錄
shell> cd /CA/

# 列出檔案清單
shell> ls -al
total 32
drwxr-xr-x 6 root root 4096 Apr 10 07:57 .
drwxr-xr-x 20 root root 4096 Apr 10 07:54 ..
-rw-r--r-- 1 root root 1220 Apr 10 07:57 cacert.pem # CA 的憑證(certificate),也就是 Public Key
drwxr-xr-x 2 root root 4096 Apr 10 07:54 certs # 此目錄存放 CA 簽署過的憑證
drwxr-xr-x 2 root root 4096 Apr 10 07:54 crl # 此目錄存放 Certificate Revoke List
-rw-r--r-- 1 root root 0 Apr 10 07:54 index.txt # CA log file
drwxr-xr-x 2 root root 4096 Apr 10 07:54 newcerts # 複製 certs 目錄中的內容存放
drwxr-xr-x 2 root root 4096 Apr 10 07:54 private # 此目錄中存放 CA 的 Private Key
-rw-r--r-- 1 root root 3 Apr 10 07:54 serial # 記錄簽發憑證的序號(serial number)
如此一來,Self-Signed CA 即設定完成囉!


簽發憑證

CA server 建置好後,如果沒有繼續建置下一層 child CA 的需求,就可以用此 CA 來簽發憑證了! (其實即使有 child CA 的需求,還是可以用 root CA 簽發憑證)

CA 簽發的憑證有分為兩種,一種是簽發給一般的 client 使用,另外一種則是簽發用來建置 child CA 用,兩種的設定方式是不一樣的,這邊先說明如何簽發給一般 client 用的憑證,而簽發用來建置 child CA 用的憑證則到下一篇再來談!

建立憑證(certificate)的過程,可以參考「產生一張 SSL 電子證書」一文,有很清楚的圖片說明,首先要有一台 CA server 負責簽署 certificate 之用;再來要產生 certificate request(其中會包含 client 用的 private key),連同 CA 的 certificate(CA 的 public key),一起交給 CA 進行簽署,簽署完後則會產生新的 certificate(client 的 public key) 以提供 client 使用。

如此一來, client 就有一組 public key(certificate) 以及 private key(在 certificate request 中,必須另外複製出來),作為資料傳輸加密之用。

而要產生 certificate,必須先要產生 certificate request,實作方式如下:
# 產生憑證要求(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]:PCCU # 組織名稱
Organizational Unit Name (eg, section) []:CIC # 單位名稱
Common Name (eg, your name or your server's hostname) []:vpn_client1 # 主機名稱
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 內容如下:
shell> cat newreq.pem
# private key 要自己保留好啊!
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED # 表示 private key 已經被加密
DEK-Info: DES-EDE3-CBC,12CF88E03148CC47 # 使用「DES-EDE3-CBC」的方式加密

uoZw4VuWz6yyo+C8gTOv0u3BGDtvB8p2bWx8qJ/O7H9UspnWD+/xpxQ2VVdxArgs 8fGxqrOEV11RtXjAGyAKzSj+fO5VYHYjFgVjJsBuKpuWfs3diTiMktFtwpbRhhwV vZwX+5yljHscSXtiuLRMGGxbOqx8Tg81QDo1AxNBgF2wwOV60Seesk4A70pw1iZ5 0CWbb3h/1dqwxIuY6pFNGkyTwiGx0dp5uchaMC99MVFgolGDVJmiYEkiUPtbINBh 33u+sLFbL1iugeh0UaXjz6a027bJmn0gQPpQ4Wtg3Yrp7vc25/+SanDM4pJy17mk lC80vnjs7vgCj1vqpAjKKO6w2h7g8JRNm24hsp13kE3lPnacTtUXS3Y9GoZ0in5K hT9ZO2Gx4dmTm8VHGH6OZ/T/qdiqddF65sskjvd2IEOtTQe0d46EyjvuJmpf7iY9 CydLu8TBxNrHI6WlgrNocL5Gv8MFevl4X7wXJYAK2ndBP2SaGcuVgGFKwAyUeaA6 Wa8iK7MIWs4alPkI9GkoOhPaf88QOsuWq0XzzggLNdKuNzAUDrcQ5KADdIL0byEf PVVJtDJ9lPWYhsOlLwuSRTcJADWFrXir9SoUhwCDXb7AALAsqMyVTh8juHQl9n8B Bzio7uFJ/bpL2ZvsmitWoJ44Bg/8BIsmbLGHsVfumvUoyhq9AW7rsRk9UZSGxt4u XyT84VjI7a+4bbObGEYUPF0kNhZ2fAsob/z0tQ+zyVqY2vzFkEeHE1ELriIJdIdS hAybvNAg+iR2El8VcO8hdAYEDCuTwiJYFbSQSgTmPis= -----END RSA PRIVATE KEY-----
# 此部分必須交給 CA,證明 private key 是屬於本人擁有
-----BEGIN CERTIFICATE REQUEST-----
MIIBtjCCAR8CAQAwdjELMAkGA1UEBhMCVFcxDzANBgNVBAcTBlRhaXBlaTENMAsG
A1UEChMEUENDVTEMMAoGA1UECxMDQ0lDMRcwFQYDVQQDEw5TZWxmLVNpZ25lZCBD
QTEgMB4GCSqGSIb3DQEJARYRZ29kbGVvbkBdbWFpbC5jb20wgZ8wDQYJKoZIhvcN
AQEBBQADgY0AMaGJAoGBAMQvzgz3Rtg/erfUXo6VYZ2aYhBkEFIM7cfWVqJVWDds
DieFJkgqshvE1zsOCTF0xuRwYlHwU5sH6eGw8DyVwR/4YzMR2mHV8IJe9Cx8gJ+j
Nu7MDBlIKCnwgox5oBnOQ3T3pWl2g52rRGsdlxvmy36JxzYDjKX3NUkZFd5+Z2hV
AgMBAAGgADANBgkAhkiG9w0BAQQFAAOBggBlQl0HKZmyp6GOeCUAA4w2FhFshVhk
8KsB0P1A9iVUa23LcbEsYvMJ7E7DsFMgsaoKGIljoTWat+nPd+kCohMUxxZspy3l
vQDIwBjn+mkKdYCSXAtbvZHtjLmRVjCRNtDXVJgeknOQHnK2mD3q1NoE1meKyxgr
tiavyD6VQRttOA== -----END CERTIFICATE REQUEST-----
其中紅色字體的部分,是 client 的 private key,可以將其複製起來後,另外編輯的新文字檔並儲存起來,之後交給 client 使用!

接著要讓 CA 簽署此份 certtificate request:
shell> /usr/share/ssl/misc/CA.pl -sign
Using configuration from /usr/share/ssl/openssl.cnf # 說明使用的是 openssl.cnf 中的設定值
Enter pass phrase for /CA/private/cakey.pem: # 此處輸入 CA 密碼
Check that the request matches the signature
Signature ok
Certificate Details: # 以下是 certificate request 內容,檢查是否正確!
Serial Number: 4 (0x4)
Validity
Not Before: May 4 08:51:31 2007 GMT
Not After : May 3 08:51:31 2008 GMT
Subject:
countryName = TW
localityName = Taipei
organizationName = PCCU
organizationalUnitName = CIC
commonName = vpn_client1
emailAddress = godleon@gmail.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
3C:B4:FB:F4:FD:3A:F6:C0:96:5C:B4:17:49:AD:89:CF:69:C5:87:0A
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

Certificate is to be certified until May 3 08:51:31 2008 GMT (365 days)
Sign the certificate? [y/n]:y # 是否簽署此 certificate


1 out of 1 certificate requests certified, commit? [y/n]y # 確認簽署 certificate
Write out database with 1 new entries
Data Base Updated
Signed certificate is in newcert.pem # 產生的 certificate 名稱為 newcert.pem
如此一來,給 client 用的 certificate 就成功產生了! 加上上一個步驟中,從 certificate request 中複製出來的 client private key,將檔案透過 scp 或其他方式傳給 client 後,就可以讓 client 使用了!


參考資料:
  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)

1 則留言: