捕風之巢

          統計

          留言簿(3)

          java友情鏈接

          閱讀排行榜

          評論排行榜

          openssl簡介(二十五)--指令x509

          ?

          二十五.???? 指令 x509

          用法:
          ? ?
          ? ? openssl x509 [-inform DER|PEM|NET] [-outform DER|PEM|NET]
          ? ?
          ? ???[-keyform DER|PEM][-CAform DER|PEM] [-CAkeyform DER|PEM]
          ? ?
          ? ???[-in filename][-out filename] [-serial] [-hash] [-subject]
          ? ?
          ? ???[-issuer] [-nameopt option] [-email] [-startdate] [-enddate]
          ? ?
          ? ???[-purpose] [-dates] [-modulus] [-fingerprint] [-alias]
          ? ?
          ? ???[-noout] [-trustout] [-clrtrust] [-clrreject] [-addtrust arg]
          ? ?
          ? ???[-addreject arg] [-setalias arg] [-days arg]
          ? ?
          ? ???[-signkey filename][-x509toreq] [-req] [-CA filename]
          ? ?
          ? ???[-CAkey filename] [-CAcreateserial] [-CAserial filename]
          ? ?
          ? ???[-text] [-C] [-md2|-md5|-sha1|-mdc2] [-clrext]
          ? ?
          ? ???[-extfile filename] [-extensions section]
          ? ?
          ? ?
          ? ?
          說明:
          ? ?
          本指令是一個功能很豐富的證書處理工具??梢杂脕盹@示證書的內容,轉換其格式,給 CSR 簽名等等。由于功能太多,我們按功能分成幾部分來講。

          ? ?
          輸入,輸出等一些一般性的 option
          ? ? -inform DER|PEM|NET
          ? ?
          指定輸入文件的格式。
          ? ? -outform DER|PEM|NET
          ? ?
          指定輸出文件格式
          ? ? -in filename
          ? ?
          指定輸入文件名
          ? ? -out filename
          ? ?
          指定輸出文件名
          ? ? -md2|-md5|-sha1|-mdc2
          ? ?
          指定使用的哈希算法。缺省的是 MD5 于打印有關的 option
          ? ? -text
          ? ?
          用文本方式詳細打印出該證書的所有細節。
          ? ? -noout
          ? ?
          不打印出請求的編碼版本信息。
          ? ? -modulus
          ? ?
          打印出公共密鑰的系數值。沒研究過 RSA 就別用這個了。
          ? ? -serial
          ? ?
          打印出證書的系列號。
          ? ? -hash
          ? ?
          把證書的擁有者名稱的哈希值給打印出來。
          ? ? -subject
          ? ?
          打印出證書擁有者的名字。
          ? ? -issuer
          ? ?
          打印證書頒發者名字。
          ? ? -nameopt option
          ? ?
          指定用什么格式打印上倆個 option 的輸出。
          ? ?
          后面有詳細的介紹。
          ? ? -email
          ? ?
          如果有,打印出證書申請者的 email 地址
          ? ? -startdate
          ? ?
          打印證書的起始有效時間
          ? ? -enddate
          ? ?
          打印證書的到期時間
          ? ? -dates
          ? ?
          把上倆個 option 都給打印出來
          ? ? -fingerprint
          ? ?
          打印 DER 格式的證書的 DER 版本信息。
          ? ? -C
          ? ?
          C 代碼風格打印結果。
          ? ?
          與證書信任有關的 option
          ? ?
          一個可以信任的證書的就是一個普通證書,但有一些附加項指定其可以用于哪些用途和不可以用于哪些用途 , 該證書還應該有一個 " 別名 " 。
          ? ?
          一般來說驗證一個證書的合法性的時候,相關的證書鏈上至少有一個證書必須是一個可以信任的證書。缺省的認為如果該證書鏈上的 Root CA 的證書可以信任,那么整條鏈上其他證書都可以用于任何用途。
          ? ?
          以下的幾個 option 只用來驗證 Root CA 的證書。 CA 在頒發證書的時候可以控制該證書的用途,比如頒發可以用于 SSL client 而不能用于 SSL server 的證書。
          ? ? -trustout
          ? ?
          打印出可以信任的證書。
          ? ? -setalias arg
          ? ?
          設置證書別名。比如你可以把一個證書叫 "fordesign's certificate", 那么以后就可以使用這個別名來引用這個證書。
          ? ? -alias
          ? ?
          打印證書別名。
          ? ?-clrtrust
          ? ?
          清除證書附加項里所有有關用途允許的內容。
          ? ?-clrreject
          ? ?
          清除證書附加項里所有有關用途禁止的內容。
          ? ?-addtrust arg
          ? ?
          添加證書附加項里所有有關用途允許的內容。
          ? ?-addreject arg
          ? ?
          添加證書附加項里所有有關用途禁止的內容。
          ? ?-purpose
          ? ?
          打印出證書附加項里所有有關用途允許和用途禁止的內容。
          ? ?
          與簽名有關的 otpion
          ? ?
          本指令可以用來處理 CSR 和給證書簽名,就象一個 CA
          ? ? -signkey filename
          ? ?
          使用這個 option 同時必須提供私有密鑰文件。這樣把輸入的文件變成字簽名的證書。
          ? ?
          如果輸入的文件是一個證書,那么它的頒發者會被 set 成其擁有者 . 其他相關的項也會被改成符合自簽名特征的證書項。
          ? ?
          如果輸入的文件是 CSR, 那么就生成自簽名文件。
          ? ? -clrext
          ? ?
          把證書的擴展項刪除。
          ? ? -keyform PEM|DER
          ? ?
          指定使用的私有密鑰文件格式。
          ? ? -days arg
          ? ?
          指定證書的有效時間長短。缺省為 30 天。
          ? ? -x509toreq
          ? ?
          把一個證書轉化成 CSR. -signkey 指定私有密鑰文件
          ? ? -req
          ? ?
          缺省的認為輸入文件是證書文件, set 了這個 option 說明輸入文件是 CSR.
          ? ? -CA filename
          ? ?
          指定簽名用的 CA 的證書文件名。
          ? ? -CAkey filename
          ? ?
          指定 CA 私有密鑰文件。如果這個 option 沒有參數輸入,那么缺省認為私有密鑰在 CA 證書文件里有。
          ? ? -CAserial filename
          ? ?
          指定 CA 的證書系列號文件。證書系列號文件在前面介紹過,這里不重復了。
          ? ? -CAcreateserial filename
          ? ?
          如果沒有 CA 系列號文件,那么本 option 將生成一個。
          ? ? -extfile filename
          ? ?
          指定包含證書擴展項的文件名。如果沒有,那么生成的證書將沒有任何擴展項。
          ? ? -extensions section
          ? ?
          指定文件中包含要增加的擴展項的 section
          ? ?
          上面倆個 option 有點難明白是吧?后面有舉例。
          ? ?
          與名字有關的 option. 這些 option 決定證書擁有者 / 頒發者的打印方式。缺省方式是印在一行中。
          ? ?
          這里有必要解釋一下這個證書擁有者 / 頒發者是什么回事。它不是我們常識里的一個名字,而是一個結構,包含很多字段。
          ? ?
          英文分別叫 subject name/issuer name. 下面是一個 subject name 的例子
          ? ? subject=
          ? ? countryName = AU
          ? ? stateOrProvinceName = Some-State
          ? ? localityName = gz
          ? ? organizationName = ai ltd
          ? ? organizationalUnitName = sw
          ? ? commonName = fordesign
          ? ? emailAddress = xxx@xxx.xom


          -nameopt
          ? ?
          這個 option 后面的參數就是決定打印的方式,其參數有以下可選:
          ? ? compat
          ? ?
          使用以前版本的格式,等于沒有設置任何以下 option
          ? ? RFC2253
          ? ?
          使用 RFC2253 規定的格式。
          ? ? oneline
          ? ?
          所有名字打印在一行里面。
          ? ?multiline
          ? ?
          名字里的各個字段用多行打印出來。
          ? ?
          上面那幾個是最常用的了,下面的這些我怎么用怎么不對,也許以后研究 source 在完善這里了。
          ? ? esc_2253 esc_ctrl esc_msb use_quote utf8 no_type show_type dump_der
          ? ? dump_nostr dump_all dump_unknown sep_comma_plus sep_comma_plus_space
          ? ? sep_semi_plus_space sep_multiline dn_rev nofname, sname, lname, oid spc_eq
          ? ?
          舉例時間:
          ? ?
          打印出證書的內容:
          ? ? openssl x509 -in cert.pem -noout -text
          ? ?
          打印出證書的系列號
          ? ? openssl x509 -in cert.pem -noout -serial
          ? ?
          打印出證書的擁有者名字
          ? ? openssl x509 -in cert.pem -noout -subject
          ? ?
          RFC2253 規定的格式打印出證書的擁有者名字
          ? ? openssl x509 -in cert.pem -noout -subject -nameopt RFC2253
          ? ?
          在支持 UTF8 的終端一行過打印出證書的擁有者名字
          ? ? openssl x509 -in cert.pem -noout -subject -nameopt oneline -nameopt -escmsb
          ? ?
          打印出證書的 MD5 特征參數
          ? ? openssl x509 -in cert.pem -noout -fingerprint
          ? ?
          打印出證書的 SHA 特征參數
          ? ? openssl x509 -sha1 -in cert.pem -noout -fingerprint
          ? ?
          PEM 格式的證書轉化成 DER 格式
          ? ? openssl x509 -in cert.pem -inform PEM -out cert.der -outform DER
          ? ?
          把一個證書轉化成 CSR
          ? ? openssl x509 -x509toreq -in cert.pem -out req.pem -signkey key.pem
          ? ?
          給一個 CSR 進行處理,頒發字簽名證書,增加 CA 擴展項
          ? ? openssl x509 -req -in careq.pem -extfile openssl.cnf -extensions v3_ca -signkey key.pem -out cacert.pem
          ? ?
          給一個 CSR 簽名,增加用戶證書擴展項
          ? ? openssl x509 -req -in req.pem -extfile openssl.cnf -extensions v3_usr -CA cacert.pem -CAkey key.pem -CAcreateserial
          ? ?
          把某證書轉化成用于 SSL client 可信任證書 , 增加別名 alias
          ? ? openssl x509 -in cert.pem -addtrust sslclient -alias "Steve's Class 1 CA" -out trust.pem
          ? ?
          上面有很多地方涉及到證書擴展 / 證書用途,這里解釋一下:
          ? ?
          我們知道一個證書是包含很多內容的,除了基本的那幾個之外,還有很多擴展的項。比如證書用途,其實也只是證書擴展項中的一個。
          ? ?
          我們來看看一個 CA 證書的內容:
          ? ? openssl x509 -in ca.crt -noout -text
          ? ? Certificate:
          ? ? Data:
          ? ? Version: 3 (0x2)
          ? ? Serial Number: 0 (0x0)
          ? ? Signature Algorithm: md5WithRSAEncryption
          ? ? Issuer: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd,
          ? ? CN=fordesign/Email=fordeisgn@21cn.com
          ? ? Validity
          ? ? Not Before: Nov 9 04:02:07 2000 GMT
          ? ? Not After : Nov 9 04:02:07 2001 GMT
          ? ? Subject: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd,
          ? ? CN=fordesign/Email=fordeisgn@21cn.com
          ? ? Subject Public Key Info:
          ? ? Public Key Algorithm: rsaEncryption
          ? ? RSA Public Key: (1024 bit)
          ? ? Modulus (1024 bit):
          ? ? 00:e7:62:1b:fb:78:33:d7:fa:c4:83:fb:2c:65:c1:
          ? ? 08:03:1f:3b:79:b9:66:bb:31:aa:77:d4:47:ac:be:
          ? ? e5:20:ce:ed:1f:b2:b5:4c:79:c9:9b:ad:1d:0b:7f:
          ? ? 84:49:03:6b:79:1a:fd:05:ca:36:b3:90:b8:5c:c0:
          ? ? 26:93:c0:02:eb:78:d6:8b:e1:91:df:85:39:33:fc:
          ? ? 3d:59:e9:7f:58:34:bf:be:ef:bd:22:a5:be:26:c0:
          ? ? 16:9b:41:36:45:05:fe:f9:b2:05:42:04:c9:3b:28:
          ? ? c1:0a:48:f4:c7:d6:a8:8c:f9:2c:c1:1e:f5:8b:dc:
          ? ? 19:59:7c:47:f7:91:cc:5d:75
          ? ? Exponent: 65537 (0x10001)
          ? ? X509v3 extensions:
          ? ? X509v3 Subject Key Identifier:
          ? ? 69:41:87:55:BD:52:990:F5:EC:11:7F:0A:01:53:58:4E:0B:7C:F7
          ? ? X509v3 Authority Key Identifier:
          ? ? keyid:69:41:87:55:BD:52:990:F5:EC:11:7F:0A:01:53:58:
          ? ? 4E:0B:7C:F7
          ? ? DirName:/C=AU/ST=Some-State/O=Internet Widgits Pty
          ? ? Ltd/CN=fordesign/Email=fordeisgn@21cn.com
          ? ? serial:00
          ? ? X509v3 Basic Constraints:
          ? ? CA:TRUE
          ? ? Signature Algorithm: md5WithRSAEncryption
          ? ? 79:14:99:4a:8f:64:63:ab:fb:ad:fe:bc:ba:df:53:97:c6:92:
          ? ? 41:4d:de:fc:59:98:39:36:36:8e:c6:05:8d:0a:bc:49:d6:20:
          ? ? 02:9d:a2:5f:0f:03:12:1b:f2:af:23:90:7f:b1:6a:86:e8:3e:
          ? ? 0b:2c:fd:11:89:86:c3:21:3c:25:e2:9c:de:64:7a:14:82:32:
          ? ? 22:e1:35:be:39:90:f5:41:60:1a:77:2e:9f:d9:50:f4:81:a4:
          ? ? 67:b5:3e:12:e5:06:da:1f:d9:e3:93:2d:fe:a1:2f:a9:f3:25:
          ? ? 05:03:00:24:00:f1:5d:1f:d7:77:8b:c8:db:62:82:32:66:fd:
          ? ? 10:fa
          ? ?
          是否看到我們先提到過的 subject name/issuer name. 本證書中這倆個字段是一樣的,明顯是自簽名證書,是一個 Root CA 的證書。從 X509v3 extension 開始就是證書擴展項了。
          ? ?
          這里有個 X509v3 Basic constraints. 里面的 CA 字段決定該證書是否可以做 CA 的證書,這里是 TURE 。如果這個字段沒有,那么會根據其他內容決定該證書是否可以做 CA 證書。
          ? ?
          如果是 X509v1 證書,又沒有這個擴展項,那么只要 subject name issuer name 相同,就認為是 Root CA 證書了。
          ? ?
          本例的證書沒有證書用途擴展項,它是一個叫 keyUseage 的字段。
          ? ?
          舉個例子就可以看出該字段目前可以有以下值
          ? ? openssl x509 -purpose -in server.crt
          ? ? Certificate purposes:
          ? ? SSL client : Yes
          ? ? SSL client CA : No
          ? ? SSL server : Yes
          ? ? SSL server CA : No
          ? ? Netscape SSL server : Yes
          ? ? Netscape SSL server CA : No
          ? ? S/MIME signing : Yes
          ? ???S/MIME signing CA : No
          ? ? S/MIME encryption : Yes
          ? ???S/MIME encryption CA : No
          ? ???CRL signing : Yes
          ? ? CRL signing CA : No
          ? ? Any Purpose : Yes
          ? ? Any Purpose CA : Yes
          ? ? SSL Client
          ? ? SSL Client CA
          ? ?
          ? ?
          每個值的具體意義應該可以看名字就知道了吧?
          ? ? X509
          指令在轉化證書成 CSR 的時候沒有辦法把證書里的擴展項轉化過去給 CSR 簽名做證書的時候,如果使用了多個 option, 應該自己保證這些 option 沒有沖突。

          posted on 2006-10-17 15:51 捕風 閱讀(980) 評論(0)  編輯  收藏 所屬分類: java安全

          主站蜘蛛池模板: 无棣县| 离岛区| 祁门县| 龙泉市| 涟水县| 抚松县| 博罗县| 江孜县| 竹溪县| 庐江县| 托里县| 玛纳斯县| 南投县| 渭源县| 五华县| 克山县| 舟曲县| 玉环县| 东乌| 永春县| 搜索| 乾安县| 惠来县| 甘肃省| 松江区| 波密县| 宜丰县| 自治县| 大名县| 绩溪县| 叙永县| 兴义市| 山阳县| 泽普县| 塘沽区| 沽源县| 乌恰县| 深圳市| 竹溪县| 嘉善县| 曲沃县|