SSL 與 CA(憑證授權伺服器)

    版本為 12:21, 30 Nov 2024

    到這個版本。

    返回到 版本存檔.

    查閱目前版本

    說明

    憑證伺服器 - Certificate Authority (CA),這個伺服器可以用來建立SSL加密連線所需的 Server 及 Root 憑證檔。

    對於商用型網站的加密連線,通常會使用 Verisign 或其他第三方認證機構,來簽署需要的憑證檔,但這些需要定期付費,如果不想付費給這些機構做簽署,可以自己架設伺服器來建立及發行所需的憑證檔。

    CA 可以使用 Linux 或 Windows 來架設,此篇將以 Linux 為案例,Windows 用戶可以安裝 Windows 元件:Certificate Service。

    更多文章:

    步驟開始

    主要檔案類型說明:

    檔案用途: 檔案類型:
     私密金鑰(Private Key)  xxx.key
     憑證簽署要求檔(CSR)  xxx.csr
     Server 憑證檔  xxx_SERVER.crt
     Root 憑證檔(或稱 CA 憑證)  xxxCA_ROOT.crt

     

    必要的套件:

    • openssl
    建立所需的目錄
    cd /etc/pki
    mkdir -m 0755 mypbxCA/
    mkdir -m 0755 private/ certs/ newcerts/ crl/ 
    
    • mypbxCA 憑證工作的根目錄
    • private 私密金鑰檔儲存目錄
    • certs 憑證檔儲存目錄
    • newcerts 用來放 PEM 檔
    • crl 用來儲存已停用的憑證列表
    建立 openssl 設定檔
    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(Root) 憑證 及 Private key

    只有要建立憑證簽署單位時,才需要新建 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,請不要輸入要被簽署的網站名稱>

    憑證的期限可設定為五年

    執行完後,會產生兩個檔案

    1. private/my-nameCA_ROOT.key 私密金鑰,需妥善保存且已設有密碼
    2. certs/my-nameCA_ROOT.crt 這是 ROOT 憑證檔,可以公開讓用戶下載
    修改 openssl 設定檔

    修改 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 憑證

    新增 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 []: <這裡不要輸入密碼,否則服務會無法自動重啟>

    執行完後,會產生兩個檔案

    1. private/this-is-my-host_SERVER.key Server 憑證金鑰
    2. this-is-my-host_SERVER.csr Server 憑證簽署要求檔(CSR)
       

    設定權限(這只是為了安全性考量,與簽署無關)

    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 憑證時,必須有以下資訊:

    • 簽署時,會要求輸入 CARoot 的金鑰密碼
    • 建立 CSR 檔時所輸入的基本資訊必須與 CARoot 憑證的基本資訊相同,例如 Country, State, Locality,......,如果有一項不同,會無法簽署。

     

    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

    執行完後,會產生兩個檔案

    1. certs/this-is-my-host_SERVER.crt Server 憑證檔
    2. newcerts/01.pem 這個與 Server 憑證檔完全一樣,不過是用 serial 做檔名,這不會用到
    檢驗完成後的 Server 憑證檔
    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

    建立 PKCS#12 憑證檔(選用)

    如果要設定 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
            ...

    註:

    • C - Country
    • ST - State or Province Name
    • L - Locality Name
    • O - Organization Name
    • CN - Comman Name
       

    建立 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 密碼,這必須記住,稍後用戶端匯入時會用到。

    Powered by MindTouch Core