前言
討論 CA 前先來看看什麼是 SSL ,所謂的 SSL 就是伺服器端和使用者端的資料都經過加密的方式來傳送,而這之鑰匙就是 RC4 (對稱式加密),而這隻鑰匙是無法透過網路來傳送.因為當別人擷取這把鑰匙時,他也可以用這把鑰匙對你們的資訊加解密.
所以會使用 RSA (公私鑰,非對稱式加解密)方式來傳送這把鑰匙.
伺服器端會給使用者端 RSA 公鑰(用來加密使用者端的對稱式加密鑰匙),使用者端產生一支對稱式加密的鑰匙,並使用伺服器端的公鑰加密並回傳給伺服器端,伺服器端使用自己的私鑰解開還原使用者端給的對稱式加密鑰匙,等到伺服器端使用者端都有對稱式加密的鑰匙後,就使用這對稱式加密的鑰匙來進行接下來的資料傳送與交易.
看到這你或許會覺得奇怪,為何不用非對稱式的公鑰來做全程的加解密.因為非對稱加密的演算法很消耗 CPU 的資源所以不適合大量的資料的加解密,但是對稱式的鑰匙卻很適合大量的資料的加解密,但是他無法直接使用網路上來傳送,因為有可能被擷取,所以對稱式鑰匙被非對稱式的公鑰包在一起,傳送到伺服器端,只有伺服器有非對稱式的私鑰能解開.所以能很安全的傳給伺服器.之後的 SSL 連線中都會使用這對稱式的鑰匙加解密.
這樣看似安全其實不然,因為使用者無法確定伺服器端的真假 (經過假的 DNS Server 使用者可能被導向假的伺服器端),所以使用 CA (Certification Authority) 來進行伺服器端的身份確認.因此伺服器端不只會單給 Public key 還會加上數位簽名的憑證.
完整的 HTPS (SSL) 的交易方式.
- 伺服器端會給使用者端 公鑰(用來加密使用者端的對稱式加密鑰匙) 與 數位簽名的憑證(身份確認).
- 使用者端接到數位簽名的憑證,會先去 Root CA 詢問資料是否真的由該網站所核發.
- 使用者端產生一支對稱式加密的鑰匙,並使用伺服器端的公鑰加密並回傳給伺服器端,伺服器端使用自己的私鑰解開還原使用者端給的對稱式加密鑰匙.
- 等到伺服器端使用者端都有對稱式加密的鑰匙後,就使用這對稱式加密的鑰匙來進行接下來的資料傳送與交易.
憑證的內容如下.
[root@localhost ~]# openssl x509 -noout -text -in /etc/ssl/certs/apache-selfsigned.crt Certificate: Data: Version: 1 (0x0) Serial Number: 8b:a9:05:f5:e5:ee:9d:77 Signature Algorithm: sha256WithRSAEncryption Issuer: C=TW, ST=TAIWAN, L=TAIPEI, O=Benjr, OU=Benjr, CN=benjr.tw/emailAddress=admin@benjr.tw Validity Not Before: Aug 27 15:17:57 2019 GMT Not After : Aug 26 15:17:57 2020 GMT Subject: C=TW, ST=TAIWAN, L=TAIPEI, O=Benjr, OU=Benjr, CN=benjr.tw/emailAddress=admin@benjr.tw Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:ca:a5:09:02:cc:36:9d:a9:67:3c:f3:4b:38:9b: 略... Exponent: 65537 (0x10001) Signature Algorithm: sha256WithRSAEncryption 9f:b2:e0:b6:1b:f6:ff:0f:3a:b7:1a:62:92:15:9c:e4:d9:2c: 略...
第一部分是憑證的內容包括一些是誰簽發給誰的到期日等資訊.
第二部分是伺服器端的 Public Key
第三部分是上一層 CA 在簽發憑證時,將剛才的內容(第一二部分)經過 on way hash (如:MD5 , SHA1..) 所到的訊息摘要 (Digest Hash).這可確定在傳送過程資料不會遭到修改.
關於 CA
- 什麼是認證中心
憑證的簽發必須透過公正的第三者來簽發,這也就是 CA 主要的工作,CA 必須確定申請書的內容和申請人本身的資料是相符合的. - 什麼是最高層認證中心
SSL 採用的是 X.509,由上至下階層式的評證制度.所以簽章是由你上一層發給你的.作業系統通常會預設好幾個 Root CA 所以當使用者遇到由這些 Root ca 發出來的憑證就可以直接相信.
系統需求
CA 並不是一種伺服器服務,所以他並不需要特別的伺服器程式,他只要 openssl 即可
[root@benjr ~]# rpm -ivh openssl….rpm
建立 Root CA(Certification Authority)
SSL 採用的是 X.509,由上至下階層式的評證制度.因為我們並不與其他的 Root CA 來授與憑證.所以我們也要建立屬於自己的 Root CA.系統預設 SSL 與 CA 路徑為 /usr/share/ssl 以可以將他搬至 /etc/ssl 下來執行
- 製作 Private Key
[root@benjr ~]# openssl genrsa -des3 -out rootca.key 2048 ………………………………………………………………………………………………………………+++…………………………..+++ e is 65537 (0×10001) Enter pass phrase for rootca.key: Verifying – Enter pass phrase for rootca.key:
以上的指令會產生 2048 bits 的 Private Key ,名稱為 rootca.key ,並且用 des3 的方式加密保護.
[root@benjr ~]# chmod og-rwx rootca.key
建立私鑰後最好將權限加以設限,以免被其他使用者取用.你可以用下面的指令來看 RSA 產生的 Private Key 內容
[root@benjr ~]# openssl rsa -noout -text -in rootca.key Enter pass phrase for rootca.key: Private-Key: (2048 bit) modulus: 00:cf:d8:f0:0d:6e:fb:a0:03:30:2c:74:64:42:59: …………………..略………………………… publicExponent: 65537 (0×10001) privateExponent: 00:94:cc:54:1e:e9:e3:4e:4c:ba:02:39:59:45:7e: …………………..略………………………… prime1: 00:e9:26:5d:62:6f:61:1a:f4:15:ca:c4:4d:a8:a8: …………………..略………………………… prime2: 00:e4:37:be:a8:3e:c0:c9:79:b5:8b:28:06:2a:63: …………………..略………………………… exponent1: 16:c0:1a:9e:af:55:9f:66:af:f5:b0:40:0f:b4:17: …………………..略………………………… exponent2: 00:a3:62:81:5d:a4:27:93:56:4e:31:85:02:fc:ff: …………………..略………………………… coefficient: 00:d2:89:bb:b8:93:8c:03:b8:ca:d3:53:37:20:66: …………………..略…………………………
- 填寫憑證申請書
[root@benjr ~]# openssl req -new -key rootca.key -out rootca.csr Enter pass phrase for rootca.key: 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]:Taiwan Locality Name (eg, city) [Newbury]:Taipei Organization Name (eg, company) [My Company Ltd]:benjr Organizational Unit Name (eg, section) []:SIT Common Name (eg, your name or your server’s hostname) []:benjr.tw Email Address []:admin@benjr.tw Please enter the following ‘extra’ attributes to be sent with your certificate request A challenge password []: An optional company name []:
至於申請書的內容要填哪些呢!!
- Country Name (2 letter code) [GB]:國家代碼,台灣是 TW
- State or Province Name (full name) [Berkshire]:省份,你可以直接填台灣 Taiwan
- Locality Name (eg, city) [Newbury]: 城市名,你可以填台北 Taipei
- Organization Name (eg, company) [My Company Ltd]:你的組織名稱,通常是公司,我這裡填的是 benjr
- Organizational Unit Name (eg, section) []:如果你剛填的是公司,那這就是公司部門的名稱
- Common Name (eg, your name or your server’s hostname) []:如果是伺服器憑證那就填上伺服器的全名(benjr.tw) .若是 E-mail 憑證那就填上 E-mail.Root CA 填上組織名稱加上 RSA/2048 以供辨識.
- Email Address []:這裡請填上你的 e-mail 信箱
Please enter the following ‘extra’ attributes to be sent with your certificate request
- A challenge password []:申請書的密碼,也可以不用設
- An optional company name []:代辦憑證的公司名稱,也可以不用設
可用下列指令來看要申請的憑證內容
[root@benjr ~]# openssl req -noout -text -in rootca.csr Certificate Request: Data: Version: 0 (0×0) Subject: C=TW, ST=Taiwan, L=Taipei, O=benjr, OU=SIT, CN=benjr. tw/emailAddress=admin@benjr.tw Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (2048 bit) Modulus (2048 bit): 00:cf:d8:f0:0d:6e:fb:a0:03:30:2c:74:64:42:59: …………………………………略………………………………….. Exponent: 65537 (0×10001) Attributes: a0:00 Signature Algorithm: md5WithRSAEncryption 8e:92:8a:97:b2:da:45:eb:ec:25:be:21:cc:dd:00:28:05:26: …………………………………略…………………………………..
- 簽發憑證
因為要簽發的是 Root CA 已經沒有上一層了,所以只能自己簽給自己.[root@benjr ~]# openssl x509 -req -signkey rootca.key -in rootca.csr -out rootca.crt Signature ok subject=/C=TW/ST=Taiwan/L=Taipei/O=benjr/OU=CEO/CN=benjr.tw/emailAddress=admin@benjr.tw Getting Private key Enter pass phrase for rootca.key:
可用下列指令來看要簽章的憑證內容
[root@benjr ~]# openssl x509 -noout -text -in rootca.crt Certificate: Data: Version: 1 (0×0) Serial Number: 0 (0×0) Signature Algorithm: md5WithRSAEncryption Issuer: C=TW, ST=Taiwan, L=Taipei, O=benjr, OU=CEO,CN=benjr.tw/emailAddress=admin@benjr.tw Validity Not Before: Feb 10 13:31:02 2004 GMT Not After : Mar 11 13:31:02 2004 GMT Subject: C=TW, ST=Taiwan, L=Taipei, O=benjr, OU=CEO,CN=benjr.tw/emailAddress=admin@benjr.tw Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (2048 bit) Modulus (2048 bit): …………………………………略………………………………….. Exponent: 65537 (0×10001) Signature Algorithm: md5WithRSAEncryption 58:b4:18:32:f2:e1:c9:b1:37:fd:04:f9:1d:0f:2a:ad:df:9a: …………………………………略…………………………………..
可以看到的他的內容包括下列的東西
- 第一部分是要申請的憑證內容
- 第二部分是 Public Key
- 第三部分將剛才的內容(第一二部分)經過 on way hash(如:MD5 , SHA1..) 所得到的訊息摘要 (Digest Hash).這可確定在傳送過程資料不會遭到修改.
憑證建立好之後,申請書就用不到了,所以可以刪除了
[root@benjr ~]# rm rootca.csr
Note:
其實系統有提供寫好的 script 在目錄 /usr/share/ssl/misc 下,你可以直接取用這隻 script “CA” 他的預設值將會對應到 /usr/share/ssl/openssl.conf 檔案.使用方法如下[root@benjr ~]# ./CA -newca CA certificate filename (or enter to create) Making CA certificate … Generating a 1024 bit RSA private key ………….++++++ ……..++++++ writing new private key to ‘./demoCA/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]:Taiwan Locality Name (eg, city) [Newbury]:Taipei Organization Name (eg, company) [My Company Ltd]:benjr Organizational Unit Name (eg, section) []:CEO Common Name (eg, your name or your server’s hostname) []:benjr.tw Email Address []:admin@benjr.tw
這樣就會產生一個 demoCA 的目錄
憑證存放在 /usr/share/ssl/demoCA/cacert.pem
私鑰存放在 /usr/share/ssl/misc/demoCA/private/cakey.pem
如果不滿意這些預設值,你可以直接修改 /usr/share/ssl/openssl.conf 檔案.然後再產生一次就可以了.
製作伺服器用的憑證
- 製作 Private Key
[root@benjr ~]# openssl genrsa -out host.key 2048 Generating RSA private key, 2048 bit long modulus ……………………………………………………………………………………………………+++ ……………………….+++ e is 65537 (0×10001)
我們這裡不用密碼來保護,因為系統開機時有用到這 Private Key 的服務時都會問密碼.如果人在遠端時我們就無法順利開機了.
[root@benjr ~]# chmod og-rwx host.key
建立私鑰後最好將權限加以設限,以免被其他使用者取用.
- 填寫憑證申請書
[root@benjr ~]# openssl req -new -key host.key -out host.csr 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]:Taiwan Locality Name (eg, city) [Newbury]:Taipei Organization Name (eg, company) [My Company Ltd]:TDC Organizational Unit Name (eg, section) []:SIT Common Name (eg, your name or your server’s hostname) []:benjr.tw Email Address []:admin@tdc.com Please enter the following ‘extra’ attributes to be sent with your certificate request A challenge password []: An optional company name []:
- 簽發憑證
[root@benjr ~]# openssl x509 -req -CAserial rootca.srl -CAkey rootca.key -in host.csr -out host.crt -CA rootca.crt Signature ok subject=/C=TW/ST=Taiwan/L=Taipei/O=TDC/OU=SIT/CN=benjr.tw/emailAddress=admin@benjr.tw Getting CA Private Key Enter pass phrase for rootca.key:
我們要用上一層的 Root CA 來進行簽章的動作.
而這裡的 rootca.srl 只是簽章時給的序號,內容就是號碼(01),憑證有了就可以開始應用了.
憑證建立好之後,申請書就用不到了,所以可以刪除了[root@benjr ~]# rm host.csr
實際應用請參考 Ubuntu HTTPS (HTTP + SSL + CA) – https://benjr.tw/96655 與 CentOS HTTPS (HTTP + SSL + CA) – https://benjr.tw/101894
2 thoughts on “CA – Certificate Authority”