《資訊安全》 CA建置工具:Openssl的管理與使用介紹(上) 陸維肇 編按:為建立一套更為安全之資訊使用機制,中心PC Farm小組不 斷整合並利用各種可行之軟體工具,進行相關之研發,以期能提供 同仁更多好用之使用軟體與環境。有關資訊安全之議題在今日資訊 網路發達之情況下,更顯得益形重要,對此,該小組成員近日完成 建置CA之免費軟體openssl相關之研究就與探討,並將成果推廣予同 仁分享。本文首對此一軟體工具與機制作介紹,其後將另有相關說 明內容分享同仁。 前言 openssl為目前廣為在unix/linux平台上做為使用建制CA(Certificate Authority)的免費軟體,它除了提供建制CA的基礎功能以外,使用 者也可以使用openssl來做文件加解密、簽章認證等應用。本文中將 分別從CA Server管理者與一般User兩方面,來介紹如何使用openssl 與相關工具。 在CA server方面,介紹如何建置一個CA Server、如何簽發及報 廢 certificate、以及CA簽證policy的設定;在一般User方面,則 包括private key的製作、申請certificate、驗證certificate的有 效性以及一般性的應用,如文件的加解密、簽章與驗證等。 另外,在建置CA時,亦介紹setupCA這套tools,它係以openssl為 基礎,來幫助管理者更方便地完成CA的建置。 為了讓讀者能很快地瞭解openssl的使用方式,筆者將在本文中的 每個實際範例之解說後,附上操作指令,以幫助讀者能夠順利的完 成整個操作的過程。如果操作指令長度超過一行,則會於行末處加 上一反斜線(“\”),以表示次行仍為指令,每個指令後附上指令 參數的說明。例如: 使用user之private key在文件上簽名: openssl smime -sign -inkey user.key -signer user.pem -in test.txt\-out test.sig -sign:簽章 -inkey:user的private key -signer:user.pem--使用的certificate -in:欲簽署的文件 -out:包含簽章的文件 上面的例子中,第一行「使用user之private key在文件上簽名」 說明了這個指令的功能,接著「openssl smime -sign -inkey user.key -signer user.pem -in test.txt \ -out test.sig」則是完整的指 令行,而在指令行中第一行行末出現的反斜線“\”,其代表次行仍 是該指令的一部分,最後則說明了指令中各option所代表的功能說 明。 另,本文中指令內的option可能需要檔案名稱作為該option之參 數,茲將本文指令中所用之檔名代表含意說明如下: ca-key.pem:CA server的private key; ca-cert.pem:CA server的certificate; ca.config:CA server的設定檔; mykey.pem:使用者之private key; mycsr.pem:使用者所提出的 signing request檔案; mycert.pem:在server端,為使用者產生之certificate檔名、 在user端,為使用者之certificate; test.txt:所要簽章或加密之文件檔; test.sig:簽章後的文件檔; test.msg:加密後之文件檔。 相關資源 本文所使用的軟體包括:openssl-0.9.7-beta2以及setupCA-1.1, 使用者可以在以下網址找到相關資源: openssl: http://www.openssl.org/source/ setupCA: http://beta.wsl.sinica.edu.tw/~wzlu/software/setupCA-1.1.tar.gz 軟體安裝 1. openssl安裝   安裝openssl前,系統必須已安裝Perl 5、以及ANSI C compiler。  請下載openssl-0.9.7-beta2.tar.gz並解開後,開始下列的安裝 步驟: $ ./config $ make $ make install   openssl內定會安裝在/usr/local/ssl,如果欲安裝在其它路徑, 例如 /usr/local,在 config時,可以進行如下設定: $ ./config --prefix=/usr/local --openssldir=/usr/local/openssl 詳細的安裝步驟,請連線至下列網址 http://www.cgicentral.net/400CS/Docs/openssl/INSTALL.openssl.html 逕行參閱。 2. setupCA安裝   請下載setupCA-1.1.tar.gz並解開後,直接執行install.sh進行 安裝,作業方式如下: $ ./install.sh  其預設安裝之路徑在/usr/local/catools之目錄下;相關之tools 則放置在/usr/local/catools/bin目錄下。 建置CA與實際運作 在這個部份當中,筆者將介紹使用者如何建置自己的Ca以及相關 運作,內容包括:建置Certificate Authority(CA)、 設定CA Signing Policy、簽屬certificat、以及報廢certificate。說明 如下: 1.建置Certificate Authority(CA)  首先,在建置CA之前,必須先瞭解所要建置CA的種類。基本上, CA分為Signed CA、以及Self-Signed CA(root CA)兩種。此兩 者主要的差異只在於“CA的certificate被認證的方式”不同而已。  所謂的Singed CA,指的是CA的certificate是被其它CA所認證; 而認證它的CA,我們在這裡稱之為Singed CA的上層CA,或Parent CA,而Singed CA則稱為sub CA或Child CA。通常,Signed CA會 找比較知名或廣受大眾所認可的CA來認證,如Verisign (www.verisign.com)。   另外,所謂的Self-Signed CA,其意即為CA的certificate是由自 己所認證,而非經由其他CA來認證。由於其CA的certificate不是 被其他的CA所認證,它沒有所謂的上層CA。而這種CA通常是CA鏈 當中最頂層的CA,因此,它又稱為root CA。  為便於說明,以下我們將建立一組Self-Signed CA,稱為Central; 一組Signed CA,稱為Sinica,由Central所認證。在建立Self-Signed CA與Signed CA的例子中,使用的是setupCA準備好的tools,這些 tools都是建構在openssl的指令之上,目的在幫助我們快速且方 便地建立自己的CA。 a)建立Self-Signed CA   建立Self-Signed CA之目標,即在於建置一組Self-Signed CA, 名稱為Central。首先,請找到setupCA tools的安裝目錄,然後 使用create_ca來建置一個Self-Signed CA,create_ca放置在bin 目錄底下。以下為create_ca使用說明: Usage: create_ca -d CA_directory -t SELF -d:建置CA所放的目錄; -t:CA Type,SELF表示Self-Signed CA。 $ cd /usr/local/catools $ bin/create_ca -d /tmp/Central -t SELF Using configuration from /tmp/Central/config/ca.conf Generating a 1024 bit RSA private key .....++++++ .++++++ writing new private key to ‘/tmp/Central/ca-key.pem’ Enter PEM pass phrase: Verifying password - 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. ----- Counrty [TW]: Organization [AS]: Name (CA Name) []:Central Create Self Signed CA Success   在上面的例子中,CA放置的目錄為/tmp/Central,CA type為SELF, 表示self-signed CA(請注意:此處SELF全為大寫)。實際的操 作過程如下: .產生CA的private key; .產生self-signed certificate。   首先,程式會要求輸入CA private key的passphrase,然後輸入 CA的information。其中,有關CAinformation的schema定義,是 在/usr/local/catools/conf/ca.conf檔內,目前ca.conf檔只設 定輸入Country Name、Organization、Common Name三項,我們分 別設定為TW、AS Central,使用者可依據自己的需求來修改CA information的schema內容。修改方式請參考Config CA Signing Policy。   我們來檢視一下Central CA目錄下的內容: $ ls /tmp/Central bin ca-cert.pem ca-key.pem config crl index.txt newcerts serial bin目錄下放置CA server常用的tools; ca-cert.pem為CA的certificate; ca-key.pem是CA的private key; config目錄下放置CA server的config file; crl目錄放置certificate revoke list檔; index.txt檔為CA的 log file,用來記錄簽屬certificate 的資料; serial檔記錄簽發的序號,讓CA在每次issue一份certificate時都 會給定一組序號,以16進位數字表示,serial number 起始 值為01。  接著,檢視一下ca-cert.pem檔,可以找到issuer與subject的欄位, 內容都是C=TW、O=AS、CN=Central,表示CA確實是Self-Signed CA。 b)建立Signed CA 建立Signed CA之目標在於建置一組Signed CA,名稱為Sinica. Sinica CA,其是由Central CA所簽署認證的。 建置Singed CA與Self-Signed CA,同樣都是使用create_ca,用法如下: Usage: create_ca -d CA_directory -t SIGNED -p Parent Directory -d:建置CA所放的目錄; -t:CA TYPE, SIGNED表示signed CA。 建立Signed CA與Self-Signed CA稍微不同的是,CA type要改為 SIGNED,另外還要加上它的上層CA的目錄(parent directory), 加入parent directory的前提是,兩組CA都同在一台機器上面。 此時,Sinica CA的parent CA為Central CA;而建置Central CA 時,目錄是放在/tmp/Central下,因此指令的用法如下: $ bin/create_ca -d /tmp/Sinica -t SIGNED -p /tmp/Central Using configuration from /tmp/Sinica/config/ca.conf Generating a 1024 bit RSA private key .++++++ .....................................................++++++ writing new private key to ‘/tmp/Sinica/ca-key.pem’ Enter PEM pass phrase: Verifying password - 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. ----- Counrty [TW]: Organization [AS]: Name (CA Name) []:Sinica Signature ok subject=/C=TW/O=AS/CN=Sinica Getting CA Private Key Enter PEM pass phrase: Create Signed CA Success 以上指令的操作過程如下: .產生Sinica CA的private key; .產生Sinica CA的certificate signing request (csr); c)請Central CA簽署  指令執行完成後,會將Sinica CA建置在/tmp/Sinica目錄下。在 這個例子中要注意的一點是,輸入完Sinica CA的相關資訊後,最 後還會要求輸入的passphrase是Central CA Private Key的passphrase, 以確認Sinica CA的certificate是由Central CA同意簽署,如稍 微檢視Sinica CA的certificate,可以看到issuer為C=TW、O=AS、 CN=Central;subject為C=TW、O=AS、CN=Sinica。  另外,如果parent directory沒有指定的話,那麼,create_ca只 會產生certificate signing request(csr),而不會產生certificate。 舉例如下: $ bin/create_ca -d /tmp/testCA -t SIGNED $ ls /tmp/testCA bin ca-csr.pem ca-key.pem config crl index.txt newcerts serial   ca-csr.pem檔為testCA的certificate signing request,必須自 行拿這個檔案請其他的CA簽署。 2.設定CA簽證Policy(Config CA Signing Policy)  CA在簽發certificate前,會先審核certificate signing request (csr)的內容。其實,每個CA對於certificate的簽發都有不一樣 的規定,我們稱之為CA的Signing Policy。以下我們將檢視Sinica CA的Signing Policy設定: $ cd /tmp/Sinica $ vi config/user.conf policy = policy_match [ policy_match ] countryName = match stateOrProvinceName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional 在上面的設定中,CA會檢查6個項目,包括:countryName、stateOrProvinceName 等。CA對每個項目可以設定三種(match、supplied、optional)不 同的要求標準:match表示user在csr中的schema必須包含此一項目, 而且必須與CA一致。例如,Sinica CA的countryName為TW,則user csr中的countryName也要為TW;supplied表示csr中的schema必須包 含此一項目,但不需與CA一致。例如,user的commonName就不會與CA 相同,但要求一定要有;第三項optional,則表示這個項目可有可無, user沒有提供也沒有太大關係。  使用setupCA安裝好的CA,可以在config目錄下找到如下兩個檔案: ca.conf、user.conf。這兩個檔案分別設定發行CA certificate的 policy與發行user certificate的policy,管理者可以依據實際需求 分別修改自己的Signing Policy: $ ls /tmp/Sinica/config ca.conf user.conf 3.發行Certificate(Issue Certificate) a)發行User的Certificate  發行user的certificate時會有如下兩種情況發生: .由user自行產生private key、以及certificate signing request(csr); .由CA server代為產生private key、及certificate signing request(csr)。   第一種情況,user在產生完csr檔案以後,必須交由CA server簽 署。當CA簽署過後,再將user certificate交給user。這種情況的 優點是:user可以確保private key不被CA server經手;缺點則是 user必須自行設定產生csr時需的user information schema,而且 必須與CA Signing Policy一致,才能通過簽證。   第二種情況則是由CA完全代辦,從private key的產生到certificate 的完成都在CA server端完成。其優點是:User只需依照CA server 的要求填入user information,就能領到CA簽署的certificate以及 user private key;然其缺點則是private key是由CA代為產生,user 必須要完全信任CA server,才能使用此種方式。   上述之第一種情況將會在申請Certificate與應用中談及,以下我 們實際操作第二種情況,也就是製作一張由Sinica CA所issue的 certificate。 產生user certificate的步驟如下: .產生user的private key; .產生user的certificate signing request(csr); .由Sinica CA簽署csr。   安裝完CA後,setupCA已經在CA的bin目錄下準備好常用的tools。 首先,請使用create_user_csr產生user的private key與certificate signing request。 Usage: create_user_csr user_name $ cd /tmp/Sinica $ bin/create_user_csr ccchang   同樣地,程式會要求輸入user private key的passphrase以及 information,完成以後,可以找到user的private key與csr兩個 檔案:ccchang-key.pem ccchang-req.pem。  當產生csr檔後,請使用sign_usr_csr工具簽署。Sinica CA對user 的Signing Policy,則是定義在/tmp/Sinica/config/user.conf目 錄下。 Usage: sing_usr_csr csr_file $ bin/sign_usr_csr ccchang-req.pem   此時,程式會詢問是否確認簽署,當回答“y”後,就能產生user certificate,檔名為cert.pem。請檢視一下index.txt檔,會發現 這個檔案已經加入一筆certificate的資訊,第一個字元“V”表示 此為有效的certificate,第三個欄位01,表示為CA第一份簽出的 certificate。 $ cat index.txt V 030725083328Z 01 unknown /C=TW/O=AS/OU=AS/CN=Chih-Chiang Chang/Email=ccchang@beta.wsl.sinica.edu.tw b)發行CA的Certificate  發行CA的certificate程序與發行User certificate一樣,兩者唯 一的差別主要在於它們所使用的Signing Policy不同。其中,Sinica CA對CA的Signing Policy是定義在/tmp/Sinica/config/ca.conf 之下,我們可以使用bin目錄下的create_ca_csr與sign_ca_csr兩 個工具來簽發CA certificate。 Usage: create_ca_csr CA_name sign_ca_csr csr_file 4.取消Certificate(Revoke Certificate)   當user的certificate使用一段時間後,可能因更換或其他理由而 不再使用時,CA必須對user的 certificate做註消(Revoke)的 動作,意即告訴其他人這個certificate已經不再使用。這次使用 的指令為revoke_cert,將前面所產生的user certificate給revoke 掉。 Usage: revoke_cert cert_file $ bin/revoke_cert cert.pem   此時,如檢視一下index.txt檔的內容,可以發現第一個字變成“R”, 此則表示這個certificate已經被revoke。 $ cat index.txt R 030725070207Z 020725081646Z 01 unknown /C=TW/O=AS/CN=Chih-Chiang Chang/Email=ccchang@beta.wsl.sinica.edu.tw 申請Certificate與應用 前述發行Certificate中,我們談到發行user certificate的兩種 情況,並且實際操作過其中一種,現在,我們要做的另一種情況, 即是由user自行產生private key與certificate signing request。 1.申請Certificate   User申請Certificate的步驟包括:產生private key、產生certificate signing request、申請CA server簽署認證,說明如下: a)產生user的 private key: $ mkdir /tmp/Mycert; cd /tmp/Mycert $ openssl genrsa -des3 -out mykey.pem 1024 $ ls mykey.pem   首先,使用openssl產生一把使用DES3所加密,長度為1024的private key。產生private key時,程式會要求輸入passphrase。Passphrase 是一個保護”安全使用private key”的機制,每次user使用private key時,都會被要求輸入passphrase,以確保private key不會被冒用。 b)產生user的certificate signing request(csr)   User使用private key與個人information產生csr,產生csr時, 會要求輸入passphrase。此外,程式會依據/usr/share/ssl/openssl.cnf 檔的設定,要求輸入user information。請注意,此時的設定必 須與CA server的Signing Policy一致,否則將無法通過認證: $ openssl req -new -key mykey.pem -out mycsr.pem $ ls mycsr.pem mykey.pem c)請CA server簽署認證   完成csr檔的製作後,User可以將此csr檔(mycsr.pem)寄給CA單 位代為簽署,如果通過審核後,將收到屬於自己的certificate。 此外,如果發現passphrase已經不安全或被其他人知道時,亦可 以利用下列指令更換passphrase: $ openssl rsa -in private.pem -des3 -out new_private.pem 2.檢視Certificate內容   當user收到CA寄回的Certificate之後,接著,筆者將介紹如何驗 證所收到Certificate是否有效,以及其中內含哪些訊息。其內容 包括:驗證certificate(Verify Vertificate)、Serial Number、 Issuer、Start Date & Expire Date、Subject、Public Key、MD5 fingerprint、以及SHA1 fingerprint等。分別說明如下: a)驗證Certificate(Verify Certificate)   取得Certificate後,User可以download CA的Certificate,來確 認簽發的來源,以判別這份Certificate是否有效。假設我們已經 由Sinica CA取得certificate,其檔名為mycert.pem,並且download 了Sinica CA的certificate準備驗證,檔名為sinica.pem: $ ls mycert.pem mycsr.pem mykey.pem sinica.pem $ openssl verify -CApath . -CAfile sinica.pem mycert.pem mycert.pem: /C=TW/O=AS/CN=Sinica error 2 at 1 depth lookup:unable to get issuer certificate   結果卻發現錯誤訊息:error 2 at 1 depth lookup:unable to get issuer certificate,這並非certificate不是由Sinica CA 所簽發出來,而是因為certificate在驗證時,如果issuer不是 root CA,則CA file內要包含所issuer上層CA的certificate, 亦即包括root CA。   由於Sinica CA是由Central CA所簽署,而Central CA為Self- Signed CA,也就是root CA,所以,CA file只需再加入Central CA的certificate即可。首先,我們取得Central CA的certificate, 檔名為central.pem: $ ls central.pem mycert.pem mycsr.pem mykey.pem sinica.pem   我們將Sinica CA與Central CA的certificate存在同一個檔,檔 名為ca-list.pem,再驗證一次: $ cat sinica.pem central.pem > ca-list.pem $ openssl verify -CApath . -CAfile ca-list.pem mycert.pem mycert.pem: OK   此時,結果一如我們所預期,certificate驗證過關。(待續)