kooyee ‘s blog

          開源軟件, 眾人努力的結(jié)晶, 全人類的共同財(cái)富
          posts - 103, comments - 55, trackbacks - 0, articles - 66
             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          用OpenSSL做自簽名的證書

          Posted on 2008-05-27 17:11 kooyee 閱讀(845) 評論(0)  編輯  收藏 所屬分類: SSL
          這里抄錄LDAP+OpenSSL集中認(rèn)證配置一文的一部分:
          公私鑰:公鑰可以唯一解密私鑰加密過的數(shù)據(jù),反之亦然。
          SSL過程:需要兩對公私鑰(P1,V1),(P2,V2),假設(shè)通信雙方是A和B,B是服務(wù)器,A要確認(rèn)和它通信的是B:
          A->B: hello
          B->A: 用V2加密過的P1(即用戶證書,A就用P2解密出P1)
          A->B: ok
          B->A: 用V1加密的一段信息
          A->B: 用P1加密一個(gè)自動生成的K(用之前的P1解密成功這段信息則認(rèn)為B是可信的了)
          B->A: 用K加密的數(shù)據(jù)(之后兩對密鑰功能結(jié)束,由K來加解密數(shù)據(jù))
          這里,P2就是第3方的CA證書,由于非對稱加密很慢,所以公私鑰只是用來保證K的傳送安全,之后通信是用K的對稱加密算法來保證。

          這里(P1,V1)就是certificate authority (CA)用來給客戶簽名用的公私鑰。
          (P2,V2)是客戶自己的公私鑰,提交給CA,CA所做的事情就是用(P1,V1)來給客戶的(P2,V2)簽名,簡單吧?

          下面我們OpenSSL來做這一整件事情。

          先生成CA的公私鑰(Root Certificate )
          準(zhǔn)備工作
          mkdir CA 
          cd CA 
          mkdir newcerts private 
          echo '
          01' > serial 
          touch index.txt 

          生成配置文件。由于openssl命令行參數(shù)太多,所以就用文件來組織各種選項(xiàng)。
          其中,req_distinguished_name 節(jié)表示需要提示用戶輸入的信息。
          v3_ca是有關(guān)CA公私鑰生成的,v3_req是有關(guān)用戶證書生成的。
          ca_default是用CA公私鑰簽名的時(shí)候,用戶證書的默認(rèn)信息。

          vi ./openssl.cnf
          dir = .

          [ req ] 
          default_bits 
          = 1024 # Size of keys 
          default_keyfile 
          = key.pem # name of generated keys 
          default_md 
          = md5 # message digest algorithm 
          string_mask 
          = nombstr # permitted characters 
          distinguished_name 
          = req_distinguished_name 
          req_extensions 
          = v3_req 

          [ req_distinguished_name ] 
          # Variable name   Prompt string 
          #----------------------   ---------------------------------- 
          0.organizationName = Organization Name (company) 
          organizationalUnitName 
          = Organizational Unit Name (department, division) 
          emailAddress 
          = Email Address 
          emailAddress_max 
          = 40 
          localityName 
          = Locality Name (city, district) 
          stateOrProvinceName 
          = State or Province Name (full name) 
          countryName 
          = Country Name (2 letter code) 
          countryName_min 
          = 2 
          countryName_max 
          = 2 
          commonName 
          = Common Name (hostname, IP, or your name) 
          commonName_max 
          = 64 

          # Default values for the above
          , for consistency and less typing. 
          # Variable name   Value 
          #------------------------------   ------------------------------ 
          0.organizationName_default = EB Company 
          localityName_default 
          = Shen Zhen 
          stateOrProvinceName_default 
          = Guan Dong
          countryName_default 
          = CN

          [ v3_ca ] 
          basicConstraints 
          = CA:TRUE 
          subjectKeyIdentifier 
          = hash 
          authorityKeyIdentifier 
          = keyid:always,issuer:always 

          [ v3_req ] 
          basicConstraints 
          = CA:FALSE 
          subjectKeyIdentifier 
          = hash 


          [ ca ] 
          default_ca 
          = CA_default 

          [ CA_default ] 
          serial 
          = $dir/serial 
          database 
          = $dir/index.txt 
          new_certs_dir 
          = $dir/newcerts 
          certificate 
          = $dir/cacert.pem 
          private_key 
          = $dir/private/cakey.pem 
          default_days 
          = 365 
          default_md 
          = md5 
          preserve 
          = no 
          email_in_dn 
          = no 
          nameopt 
          = default_ca 
          certopt 
          = default_ca 
          policy 
          = policy_match 

          [ policy_match ] 
          countryName 
          = match 
          stateOrProvinceName 
          = match 
          organizationName 
          = match 
          organizationalUnitName 
          = optional 
          commonName 
          = supplied 
          emailAddress 
          = optional 


          生成CA公私鑰:
          openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.cnf 

          會提示輸入密碼,當(dāng)用它給用戶證書簽名時(shí)需要輸入,以避免其它人用它隨意產(chǎn)生用戶證書。
          -days表示有效期,因?yàn)樗歉C書,所以時(shí)間一定要很長,否則由它生成的用戶證書容易過期。

          這時(shí)就生成了:
          P1
          cacert.pem
          V1
          private/cakey.pem

          查看信息用:
          openssl x509 -in cacert.pem -noout -text


          生成P2,V2,即Certificate Signing Request (CSR)
          執(zhí)行:
          openssl req -new -nodes -out req.pem -config ./openssl.cnf
          這樣就生成了:
          P2
          req.pem
          V2
          key.pem

          用此命令查看:
          openssl req -in req.pem -text -verify -noout


          用CA的私鑰V1為P2簽名,即生成用戶證書
          執(zhí)行:
          openssl ca -out cert.pem -config ./openssl.cnf -infiles req.pem
          生成用戶證書:
          cert.pem
          此時(shí),會拷貝一份到newcerts目錄下。并會更新數(shù)據(jù)庫文件:index.txt以及serail文件
          用命令查看:
          openssl x509 -in cert.pem -noout -text -purpose | more

          如果要去除可讀信息部分,執(zhí)行:
          mv cert.pem tmp.pem
          openssl x509 -in tmp.pem -out cert.pem


          安裝證書
          key.pem(V2)和cert.pem(用V1加密過的P2)安裝到服務(wù)端
          有的服務(wù)器需要把這兩個(gè)文件連為一個(gè),可以執(zhí)行:
          cat key.pem cert.pem >key-cert.pem

          cacert.pem安裝到客戶端

          Apache的配置:
          File          Comment
          /home/httpd/html Apache DocumentRoot
          /home/httpd/ssl      SSL-related files
          /home/httpd/ssl/cert.pem Site certificate
          /home/httpd/ssl/key.pem Site private key

          Stunnel的配置
          stunnel -p /etc/ssl/certs/key-cert.pem 


          編輯于08.4.26,另有兩個(gè)例子:
          用OpenSSL與JAVA(JSSE)通信
          Perl與Java的SSL通信示例

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 延津县| 上栗县| 山丹县| 长顺县| 临夏市| 崇明县| 奉节县| 合作市| 万年县| 平远县| 德庆县| 水富县| 买车| 双辽市| 金寨县| 北辰区| 永昌县| 壤塘县| 蒙阴县| 郑州市| 乌拉特中旗| 姚安县| 武冈市| 乌审旗| 琼中| 武夷山市| 石城县| 吴旗县| 缙云县| 屏山县| 原平市| 偃师市| 合川市| 东乡| 土默特右旗| 商城县| 马龙县| 琼中| 大兴区| 阳原县| 观塘区|