〔資訊安全〕 CA建置工具Openssl的管理與使用介紹(下) 陸維肇 b)Serial Number   CA簽發certificate時,會以serial number紀錄每份certificate 所發行的序號,它以16進位方式來表示。我們可以用下面的指令 來檢查certificate的serial number: $ openssl x509 -noout -serial -in mycert.pem serial=01   在此例中,serial=01代表這份certificate是CA第一份所簽發出來。 c)Issuer   Issuer就是發行certificate的CA,當我拿到一份別人的certificate 時,可以從issuer知道是由哪一個CA發行的,然後再取得CA的 certificate對其做驗證: $ openssl x509 -noout -issuer -in mycert.pem issuer= /C=TW/O=AS/CN=Sinica   由上例所看到certificate的issuer為Sinica。 d)Start Date & Expire Date   每份certificate都有啟始時間(start date)與終止時間(expire date), 在這段時間之內是certificate的有效日期,如果過期的話,就要 重新申請,要求CA重新簽發: $ openssl x509 -noout -in mycert.pem -dates notBefore=Jul 25 09:39:40 2002 GMT notAfter=Jul 25 09:39:40 2003 GMT   noBefore紀錄的為啟始時間;notAfter紀錄的為終止時間。 e)Subject   Subject即user在產生certificate signing request時所填的資 料,代表個人的身份資料: $ openssl x509 -in mycert.pem -noout -subject subject= /C=TW/O=AS/OU=AS/CN=Chih-ChiangChang/Email=ccchang@beta.wsl.sinica.edu.tw f)Public Key   顯示內含在certificate內的public key: $ openssl x509 -in mycert.pem -noout -modulus   Modulus=CFDE135C3DE935FAEC7E7149439C901DF7AE3704440D8CB7 8B17A5DB1046DFA284CA6026534A8751C185562EE49207C744DB00D9 26BCF95C48A6530ED41315CD7E208D1746D9B67553FF094161183017 41ED9015B558D02EDAD5A1620A980E91D89D02AABC75287C5043D965 D2BC46C0BB2807A7D3AA047A6D3960738A563977 g)MD5 Fingerprint   MD5 fingerprint是由全部的certificate內容經由MD5 hash algorithm 編碼後所產生固定長度的輸出。編碼結果會因為certificate內容 的些微差異而不同,因此,MD5 fingerprint可以用來檢查certificate 是否有被更動過,或兩份certificate內容是否一致: $ openssl x509 -in mycert.pem -noout -fingerprint  MD5 Fingerprint=88:65:5A:9C:58:4B:15:5C:  88:C5:D7:54:36:30:85:FB h)SHA1 Fingerprint   SHA1 fingerpint用意與MD5 fingerprint相同,只是改為SHA1 hash algorithm。在Netscape當中,使用的是MD5演算法;而在MSIE當 中所使用的則是SHA1演算法。 $ openssl x509 -sha1 -in user.pem -noout -fingerprint   SHA1 Fingerprint=BA:C2:06:16:58:CA:AA:  64:99:86:AD:E0:D8:A8:C0:38:BE:1F:20:A4 3.轉換檔案格式(PEM/PKCS#12)   在Netscape與MSIE當中所支援的certificate格式是PKCS#12 format, 而不是PEM format,其內容是一堆無法閱讀的binary格式。Import certificate到Netscape或MSIE,必須先轉成PKCS#12的檔案格式。 有關PKCS#12的FAQ,可以在 http://www.drh-consultancy.demon.co.uk/pkcs12faq.html之網 址找到相關說明。 a)由PEM轉成PKCS#12:   轉成PKCS#12檔案格式除了要certificate外,還要user的private key,並會要求輸入private key的passphrass。此外,程式還會 額外要求加上一個Export Password,且在往後要import這個PKCS#12 格式的certificate到browser時,會要求輸入這組export password, 此乃因為PKCS#12檔內含user的private key,而export password 可以防止其他人隨意使用: $ openssl pkcs12 -export -in mycert.pem -out mycert.p12 -name “My Certificate” -inkey \ mykey.pem -export:產生一個PKCS#12檔 -in:使用者的certificate -out:輸出檔名 -name:取一個friendly的名稱,當被browser import使用時,會以 此名稱顯示。 -inkey:使用者的private key b)由PKCS#12轉成PEM: $ openssl pkcs12 -in mycert.p12 -out cert_key.pem   由PKCS#12格示轉回的內容包括user的certificate與private key。 我們可利用如下指令將certificate extract出來,可以得到與原 來的mycert.pem檔完全相同的內容: $ openssl x509 -in cert_key.pem -text -out mycert2.pem $ diff mycert.pem mycert2.pem 相關應用 經過前暑之各步驟執行之後,至此,我們可謂已經擁有了自己一 把private key(mykey.pem)以及一份由Sinica CA所簽發出來的 certificate(mycert.pem)。以下接著將介紹使用private key與 certificate的基本應用,包括:文件加密(Encrypt)與解密 (Decrypt)、文件簽章(Sign Signature)與驗證簽章(Verify Signature)等應用。 1.文件加密(Encrypt)解密(Decrypt)   由於certificate是對外公開的,因此,假設我的朋友要送一份文 件給我,他可以使用我的certificate來對文件加密,而這份文件 只有用我的private key才能解開。以下範例將示範對文件如何加 密,並檢視內容的差異: 明文文件(plain text):test.txt 密文文件(cipher text):test.msg $ cat test.txt this is a test file $ openssl smime -encrypt -in test.txt -out test.msg mycert.pem $ cat test.msg MIME-Version: 1.0 Content-Disposition: attachment; filename=“smime.p7m” Content-Type: application/x-pkcs7-mime; name=“smime.p7m” Content-Transfer-Encoding: base64   MIIBJgYJKoZIhvcNAQcDoIIBFzCCARMCAQAxgcowgccCAQAwMDArMQsw CQYDVQQGEwJUVzELMAkGA1UEChMCQVMxDzANBgNVBAMTBlNpbmljYQIB ATANBgkqhkiG9w0BAQEFAASBgKUPraw5n7SFYxePNAacBQjsKxbSzToq hi4eb8+PnDU27COVfNrs5sH7YhaNfv5DA6m0mRL+72tZYaNLWFabZQt1 6+j2+BNFLq2Q+tpWkgEOkQl5C5y4jPSTGn196McHRvAM0F9xTzcXnpU0 5EkvgXOMuwnk2Q5yO+hOio2j6ZpVMEEGCSqGSIb3DQEHATAaBggqhkiG 9w0DAjAOAgIAoAQIfaLelEC1pdiAGDWM4QdUhbKoRSnolqgfMe8FFZUb lNEeIA==   加密過的文件test.msg只能使用我的private key解開。我們以下列 之指令為上述密文解密: $ openssl smime -decrypt -in test.msg -recip mycert.pem -inkey mykey.pem Enter PEM pass phrase: this is a test file   在輸入private key的passphrase後,果然得到相同的內容。 2.文件簽章(Sign Signature)& 驗證簽章(Verify Signature)   文件簽章的用意在於確認發件者(sender)的身份以及文章的完 整性(integrity),而不在資料的保密。簽章者使用private key對文件簽章將文件送出後,收件者可以使用簽章者的certificate 來驗證這份文件的來源,以及確認該文件是否被更動過。下例子 中將使用我的private key對文件進行簽章: $ openssl smime -sign -inkey mykey.pem -signer mycert.pem -in test.txt -out test.sig $ cat test.sig MIME-Version: 1.0 Content-Type: multipart/signed; protocol=“application/x-pkcs7-signature”; micalg=sha1; boundary=“----2DCFB33BAC7791CDAD3CFC6C779187E2” This is an S/MIME signed message ------2DCFB33BAC7791CDAD3CFC6C779187E2 this is a test file ------2DCFB33BAC7791CDAD3CFC6C779187E2 Content-Type: application/x-pkcs7-signature; name=“smime.p7s” Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=“smime.p7s” MIID0gYJKoZIhvcNAQcCoIIDwzCCA78CAQExCzAJBgUrDgMCGgUAMAsGCS qGSIb3DQEHAaCCAhAwggIMMIIBdQIBATANBgkqhkiG9w0BAQQFADArMQsw CQYDVQQGEwJ5NDBaFw0wMzA3MjUwOTM5NDBaMHIxCzAJBgNVBAYTAlRXMQ swCQYDVQQKEwJBUzELMAkGA1UECxMCQVMxGjAYBgNVBAMTEUNoaWgtQ2hp YW5nIENoYW5nMS0------2DCFB33BAC7791CDAD3CFC6C779187E2--   test.sig文件中最後附上的是使用者的signature。當收件者收到 這封文件時,他可以使用我的certificate來驗證這份文件的來源: $ openssl smime -verify -in test.sig -signer mycert.pem -out test.txt Verification Failure 27686:error:21075075:PKCS7 routines:PKCS7_verify:certificate verify error:pk7_smime.c:213:Verify error:unable to get local issuer certificate   此例中出現驗證錯誤訊息,此可由error message看出它找不到 issuer的certificate,因此,必不能直接拿certificate就可以驗 證簽章。實際上驗證的步驟如下: a)驗證certificate是否有效; b)如果有效,才能拿certificate驗證簽章。   因此,上述的指令必須稍微修正,在指令最後再加上-CAfile,指 定CA的certificate,CAfile內包含Central CA與Sinica CA的certificate, 用法與前面驗證Certificate所介紹的相同: $ openssl smime -verify -in test.sig -signer mycert.pem -out test.txt -CAfile ca-list.pem Verification Successful   利用pipe組合上述之指令,能夠使傳送文件達到同時確認發信來 源,又能確保資料安全的目的: a)發信人對文件簽章再用收信人之certificate對訊息加密: openssl smime -sign -in test.txt -signer sender.pem -inkey sender.key | \ openssl smime -encrypt -out mail.msg receiver.pem b)收信人用private key對文件解密,再以送件者的certificate來驗證簽章: openssl smime -decrypt -in mail.msg -recip receiver.pem -inkey receiver.key| \ openssl smime -verify -signer sender.pem -CAfile ca-list.pem 結語 網路的發達使得資訊的使用日益便捷而快速,然而卻也相對引發 諸如資訊內容安全性的考量與疑慮。對此,有關CA建置、管理與應 用,將有其一定之發展與重要性。為使得使用者能在眾多使用工具 中多一些資訊應用安全上的選擇,希望本文將提供使用者另一種應 用層面上的思考,並減輕一些資訊流通、交換所帶來之疑懼,從而 建立更為安全之資訊應用機制與環境。(全文完)