CA – Certificate Authority

Loading

前言

討論 CA 前先來看看什麼是 SSL ,所謂的 SSL 就是伺服器端和使用者端的資料都經過加密的方式來傳送,而這之鑰匙就是 RC4 (對稱式加密),而這隻鑰匙是無法透過網路來傳送.因為當別人擷取這把鑰匙時,他也可以用這把鑰匙對你們的資訊加解密.

所以會使用 RSA (公私鑰,非對稱式加解密)方式來傳送這把鑰匙.

伺服器端會給使用者端 RSA 公鑰(用來加密使用者端的對稱式加密鑰匙),使用者端產生一支對稱式加密的鑰匙,並使用伺服器端的公鑰加密並回傳給伺服器端,伺服器端使用自己的私鑰解開還原使用者端給的對稱式加密鑰匙,等到伺服器端使用者端都有對稱式加密的鑰匙後,就使用這對稱式加密的鑰匙來進行接下來的資料傳送與交易.

看到這你或許會覺得奇怪,為何不用非對稱式的公鑰來做全程的加解密.因為非對稱加密的演算法很消耗 CPU 的資源所以不適合大量的資料的加解密,但是對稱式的鑰匙卻很適合大量的資料的加解密,但是他無法直接使用網路上來傳送,因為有可能被擷取,所以對稱式鑰匙被非對稱式的公鑰包在一起,傳送到伺服器端,只有伺服器有非對稱式的私鑰能解開.所以能很安全的傳給伺服器.之後的 SSL 連線中都會使用這對稱式的鑰匙加解密.

這樣看似安全其實不然,因為使用者無法確定伺服器端的真假 (經過假的 DNS Server 使用者可能被導向假的伺服器端),所以使用 CA (Certification Authority) 來進行伺服器端的身份確認.因此伺服器端不只會單給 Public key 還會加上數位簽名的憑證.

完整的 HTPS (SSL) 的交易方式.

  1. 伺服器端會給使用者端 公鑰(用來加密使用者端的對稱式加密鑰匙) 與 數位簽名的憑證(身份確認).
  2. 使用者端接到數位簽名的憑證,會先去 Root CA 詢問資料是否真的由該網站所核發.
  3. 使用者端產生一支對稱式加密的鑰匙,並使用伺服器端的公鑰加密並回傳給伺服器端,伺服器端使用自己的私鑰解開還原使用者端給的對稱式加密鑰匙.
  4. 等到伺服器端使用者端都有對稱式加密的鑰匙後,就使用這對稱式加密的鑰匙來進行接下來的資料傳送與交易.

憑證的內容如下.

[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 下來執行

  1. 製作 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:
    …………………..略…………………………
    
  2. 填寫憑證申請書
    [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:
    …………………………………略…………………………………..
    
  3. 簽發憑證
    因為要簽發的是 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 檔案.然後再產生一次就可以了.

製作伺服器用的憑證

  1. 製作 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
    

    建立私鑰後最好將權限加以設限,以免被其他使用者取用.

  2. 填寫憑證申請書
    [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 []:
    
  3. 簽發憑證
    [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

  1. 自動引用通知: 工具程式 | Benjr.tw
  2. 自動引用通知: PKI | Benjr.tw

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料