憑證伺服器 - Certificate Authority (CA),這個伺服器可以用來建立SSL加密連線所需的 Server 及 Root 憑證檔。
對於商用型網站的加密連線,通常會使用 Verisign 或其他第三方認證機構,來簽署需要的憑證檔,但這些需要定期付費,如果不想付費給這些機構做簽署,可以自己架設伺服器來建立及發行所需的憑證檔。
CA 可以使用 Linux 或 Windows 來架設,此篇將以 Linux 為案例,Windows 用戶可以安裝 Windows 元件:Certificate Service。
更多文章:
Test SSL - 這工具可以檢測 SSL 網站的所有資訊
Monitoring SSL
主要檔案類型說明:
檔案用途: | 檔案類型: |
私密金鑰(Private Key) | xxx.key |
憑證簽署要求檔(CSR) | xxx.csr |
Server 憑證檔 | xxx_SERVER.crt |
Root 憑證檔(或稱 CA 憑證) | xxxCA_ROOT.crt |
必要的套件:
cd /etc/pki mkdir -m 0755 mypbxCA/ mkdir -m 0755 private/ certs/ newcerts/ crl/
cp /etc/pki/tls/openssl.cnf /etc/pki/mypbxCA/openssl.my.cnf chmod 0600 /etc/pki/mypbxCA/openssl.my.cnf touch /etc/pki/mypbxCA/index.txt echo '01' > /etc/pki/mypbxCA/serial
只有要建立憑證簽署單位時,才需要新建 CA 憑證,請先設定一個憑證簽署(發行)單位的名稱,例如 OSSLAB CA, Alang CA,通常為 your-name CA
cd /etc/pki/mypbxCA openssl req -config openssl.my.cnf -new -x509 -extensions v3_ca -keyout private/my-nameCA_ROOT.key -out certs/my-nameCA_ROOT.crt -days 1825
Enter PEM pass phrase: <輸入一組密碼>
...
... <隨便輸入>Common Name (eg, your name or your server's hostname) []: <這裡輸入 your-name CA,請不要輸入要被簽署的網站名稱>
憑證的期限可設定為五年
執行完後,會產生兩個檔案
修改 CARoot 金鑰檔及憑證檔的路徑
編輯 /etc/pki/mypbxCA/openssl.my.cnf:
[ CA_default ] dir = . # 改這行 <== certs = $dir/certs # Where the issued certs are kept crl_dir = $dir/crl # Where the issued crl are kept database = $dir/index.txt # database index file. #unique_subject = no # Set to 'no' to allow creation of # several ctificates with same subject. new_certs_dir = $dir/newcerts # default place for new certs. certificate = $dir/certs/my-nameCA_ROOT.crt # 改這行 <== serial = $dir/serial # The current serial number crlnumber = $dir/crlnumber # the current crl number # must be commented out to leave a V1 CRL crl = $dir/crl.pem # The current CRL private_key = $dir/private/my-nameCA_ROOT.key # 改這行 <== RANDFILE = $dir/private/.rand # private random number file
新增 Server 憑證的金鑰(Private key)及簽署要求檔(CSR)
cd /etc/pki/mypbxCA openssl req -config openssl.my.cnf -new -nodes -keyout private/this-is-my-host_SERVER.key -out this-is-my-host_SERVER.csr
Country, State, Locality, Organization <這些基本資訊必須與 CARoot 憑證檔相同>,如果忘記,可以使用以下指令查詢 *.crt 憑證檔資訊
# openssl x509 -in certs/alangCA_ROOT.crt -noout -text其餘項目可用點符號跳過
Common Name:<輸入要簽發的網站名稱,必須是正確的 FQDN>
A challenge password []: <這裡不要輸入密碼,否則服務會無法自動重啟>
執行完後,會產生兩個檔案
設定權限(這只是為了安全性考量,與簽署無關)
chown root:asterisk /etc/pki/mypbxCA/private/this-is-my-host_SERVER.key chmod 0440 /etc/pki/mypbxCA/private/this-is-my-host_SERVER.key
簽署(發行)剛剛建立的 CSR 檔
當要以 CARoot 憑證來簽署另一個 Server 憑證時,必須有以下資訊:
cd /etc/pki/mypbxCA openssl ca -config openssl.my.cnf -in this-is-my-host_SERVER.csr -out certs/this-is-my-host_SERVER.crt
Using configuration from openssl.my.cnf
Enter pass phrase for ./private/this-is-my-host_ROOT.key: <這裡要輸入 Root 金鑰的密碼,如果密碼不正確將無法完成簽署>Certificate is to be certified until Jul 29 03:40:03 2013 GMT (365 days)
Sign the certificate? [y/n]: <輸入y,如果沒看此項,表示簽署不成功>1 out of 1 certificate requests certified, commit? [y/n] <輸入 y>
簽署時,憑證檔期限預設是 365 天,若要調整可加上 -days 3650
執行完後,會產生兩個檔案
cd /etc/pki/mypbxCA openssl x509 -in certs/this-is-my-host_SERVER.crt -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=TW, ST=MyPBX, L=TC, O=Home, CN=this.is.my.host
Validity
Not Before: Jul 28 04:19:52 2012 GMT
Not After : Jul 28 04:19:52 2013 GMT
Subject: C=TW, ST=myPBX, L=Taichung, O=Home, OU=Net, CN=this.is.my.host
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:bc:8c:81:3e:b3:5b:30:f9:52:43:86:48:b8:18:
92:10:4f:63:c8:57:52:41:9b:40:b6:09:db:a4:82:
6c:79:56:c4:4e:a6:e6:48:69:9a:9e:6f:e7:6e:13:
32:9e:d3:cc:95:ea:56:5c:17:84:76:56:aa:3a:92:
45:41:32:0a:af:b2:ea:ae:c0:7a:8b:5d:af:ad:8e:
07:5f:c9:36:2e:47:c9:fe:1b:4d:a4:fa:00:b0:34:
46:f1:b4:00:51:dd:1f:69:18:94:79:c9:4b:22:c4:
6a:d3:49:5d:2e:14:92:4a:46:79:95:0a:1a:05:00:
77:ce:1a:30:9e:2d:c8:39:93
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
5C:FF:F7:F0:69:80:E0:2F:16:39:98:7E:18:6E:83:12:14:46:69:53
X509v3 Authority Key Identifier:
keyid:37:E7:1F:96:48:52:C7:D2:E9:32:31:F8:42:00:04:C3:89:D1:A0:FE
Signature Algorithm: sha1WithRSAEncryption
b3:3d:4b:22:f3:89:c1:84:08:a0:5d:a6:3a:d0:ca:57:3c:02:
1b:d4:f4:3c:5d:f3:f8:dd:8d:b6:19:8d:e9:1d:7c:3e:ba:28:
8d:df:7d:a2:3f:90:9e:34:47:37:a7:17:28:4c:3b:a8:c2:da:
81:ae:00:13:9a:fa:dd:c5:ba:56:06:06:9a:e7:e2:47:c1:9b:
eb:56:58:f9:4d:00:53:42:80:cc:e8:17:80:46:e4:d0:65:2c:
c3:f0:5a:d5:2c:3d:a3:1e:89:4d:19:57:03:d7:a0:93:c4:77:
87:03:8b:7c:17:9d:ee:92:08:b4:2e:a2:aa:a3:99:18:5b:f8:
a9:f8
如果要設定 Apache 做 SSL 的用戶端認證時(SSLVerifyClient require),需要產生這個檔案,並傳給用戶端的電腦做匯入。
偷懶方法)
直接對 Root 憑證檔做轉換
openssl pkcs12 -export -clcerts -in certs/my-nameCA_ROOT.crt -inkey private/my-nameCA_ROOT.key -out my-nameCA_ROOT.p12
輸出檔:my-nameCA_ROOT.p12 (副檔名為 .p12)
NOTE:
會要求輸入 CARoot 金鑰的密碼
需設定一組 Export 密碼,這必須記住,稍後用戶端匯入時會用到。
正規方法)
建立一個 Cient 憑證檔,然後以 CARoot 來簽署,在轉換成 PKCS#12
先檢查 CARoot 憑證的以下內容 (建立 CSR 時,輸入的資訊必須與 CARoot 憑證的內容相同):
openssl x509 -in certs/my-nameCA_ROOT.crt -noout -text
Certificate:
....
Issuer: C=TW, ST=MyPBX, L=TC, O=Home, CN=this.is.my.host
...
Subject: C=TW, ST=MyPBX, L=TC, O=Home, CN=this.is.my.host
...
註:
建立 Client 憑證金鑰及 CSR
openssl req -config openssl.my.cnf -new -nodes -keyout private/this-is-my-host_CLIENT.key -out this-is-my-host_CLIENT.csr
Enter PEM pass phrase: <設定 CLIENT金鑰的密碼>
其他資訊必須與 CARoot 憑證相同,否則稍後會無法簽署
A challenge password [] <不用設定密碼>
簽署 Client CSR
openssl ca -config openssl.my.cnf -in this-is-my-host_CLIENT.csr -out certs/this-is-my-host_CLIENT.crt
Enter pass phrase for... <輸入 CARoot 金鑰密碼>
...
Certificate is to be certified until Jul 29 03:40:03 2013 GMT (365 days)
Sign the certificate? [y/n]: <輸入y,如果沒看此項,表示簽署不成功>1 out of 1 certificate requests certified, commit? [y/n] <輸入 y>
簽署時,若要延長憑證期限可以加上 -days 3650
轉換憑證為 PKCS12
openssl pkcs12 -export -clcerts -in certs/this-is-my-host_CLIENT.crt -inkey private/this-is-my-host_CLIENT.key -out this-is-my-host_CLIENT.p12
NOTE:
簽署時,如果要設定憑證的期限,可以加上 -days 3650
建立 *.csr 時,所填入的資訊,必須與 CARoot 相同,否則稍後在做簽署時會出現問題。
簽署時會要求輸入 CARoot 金鑰的密碼
建立 pkcs12 時,需設定一組 Export 密碼,這必須記住,稍後用戶端匯入時會用到。
註:如果不需要特定的 CA 主機簽署新的憑證,可以使用以下指令,從 Key、CSR、到 CRT 一次完成。
以 Nginx 設定為例:
mkdir /etc/nginx/ssl openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/nginx/ssl/raida13-cloudcoin-global.key \ -out /etc/nginx/ssl/raida13-cloudcoin-global.crt
for Apache:
openssl genrsa -out my-test-web.key 2048 openssl req -new -key my-test-web.key -out my-test-web.csr openssl x509 -req -days 3650 -in my-test-web.csr -signkey my-test-web.key -out my-test-web.crt