Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7694060
  • 博文数量: 637
  • 博客积分: 10265
  • 博客等级: 上将
  • 技术积分: 6165
  • 用 户 组: 普通用户
  • 注册时间: 2004-12-12 22:00
文章分类

全部博文(637)

文章存档

2011年(1)

2010年(1)

2009年(3)

2008年(12)

2007年(44)

2006年(156)

2005年(419)

2004年(1)

分类: 系统运维

2005-05-23 21:25:17

CA工具

〔資訊安全〕

  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,可以在
      之網
      址找到相關說明。

    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建置、管理與應
    用,將有其一定之發展與重要性。為使得使用者能在眾多使用工具
    中多一些資訊應用安全上的選擇,希望本文將提供使用者另一種應
    用層面上的思考,並減輕一些資訊流通、交換所帶來之疑懼,從而
    建立更為安全之資訊應用機制與環境。(全文完)

阅读(3459) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~