捕風(fēng)之巢

          統(tǒng)計(jì)

          • 隨筆 - 7
          • 文章 - 82
          • 評(píng)論 - 14
          • 引用 - 0

          留言簿(3)

          java友情鏈接

          閱讀排行榜

          評(píng)論排行榜

          openssl簡(jiǎn)介(二十五)--指令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]
          ? ?
          ? ?
          ? ?
          說明:
          ? ?
          本指令是一個(gè)功能很豐富的證書處理工具。可以用來顯示證書的內(nèi)容,轉(zhuǎn)換其格式,給 CSR 簽名等等。由于功能太多,我們按功能分成幾部分來講。

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


          -nameopt
          ? ?
          這個(gè) option 后面的參數(shù)就是決定打印的方式,其參數(shù)有以下可選:
          ? ? compat
          ? ?
          使用以前版本的格式,等于沒有設(shè)置任何以下 option
          ? ? RFC2253
          ? ?
          使用 RFC2253 規(guī)定的格式。
          ? ? oneline
          ? ?
          所有名字打印在一行里面。
          ? ?multiline
          ? ?
          名字里的各個(gè)字段用多行打印出來。
          ? ?
          上面那幾個(gè)是最常用的了,下面的這些我怎么用怎么不對(duì),也許以后研究 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
          ? ?
          舉例時(shí)間:
          ? ?
          打印出證書的內(nèi)容:
          ? ? openssl x509 -in cert.pem -noout -text
          ? ?
          打印出證書的系列號(hào)
          ? ? openssl x509 -in cert.pem -noout -serial
          ? ?
          打印出證書的擁有者名字
          ? ? openssl x509 -in cert.pem -noout -subject
          ? ?
          RFC2253 規(guī)定的格式打印出證書的擁有者名字
          ? ? openssl x509 -in cert.pem -noout -subject -nameopt RFC2253
          ? ?
          在支持 UTF8 的終端一行過打印出證書的擁有者名字
          ? ? openssl x509 -in cert.pem -noout -subject -nameopt oneline -nameopt -escmsb
          ? ?
          打印出證書的 MD5 特征參數(shù)
          ? ? openssl x509 -in cert.pem -noout -fingerprint
          ? ?
          打印出證書的 SHA 特征參數(shù)
          ? ? openssl x509 -sha1 -in cert.pem -noout -fingerprint
          ? ?
          PEM 格式的證書轉(zhuǎn)化成 DER 格式
          ? ? openssl x509 -in cert.pem -inform PEM -out cert.der -outform DER
          ? ?
          把一個(gè)證書轉(zhuǎn)化成 CSR
          ? ? openssl x509 -x509toreq -in cert.pem -out req.pem -signkey key.pem
          ? ?
          給一個(gè) CSR 進(jìn)行處理,頒發(fā)字簽名證書,增加 CA 擴(kuò)展項(xiàng)
          ? ? openssl x509 -req -in careq.pem -extfile openssl.cnf -extensions v3_ca -signkey key.pem -out cacert.pem
          ? ?
          給一個(gè) CSR 簽名,增加用戶證書擴(kuò)展項(xiàng)
          ? ? openssl x509 -req -in req.pem -extfile openssl.cnf -extensions v3_usr -CA cacert.pem -CAkey key.pem -CAcreateserial
          ? ?
          把某證書轉(zhuǎn)化成用于 SSL client 可信任證書 , 增加別名 alias
          ? ? openssl x509 -in cert.pem -addtrust sslclient -alias "Steve's Class 1 CA" -out trust.pem
          ? ?
          上面有很多地方涉及到證書擴(kuò)展 / 證書用途,這里解釋一下:
          ? ?
          我們知道一個(gè)證書是包含很多內(nèi)容的,除了基本的那幾個(gè)之外,還有很多擴(kuò)展的項(xiàng)。比如證書用途,其實(shí)也只是證書擴(kuò)展項(xiàng)中的一個(gè)。
          ? ?
          我們來看看一個(gè) CA 證書的內(nèi)容:
          ? ? 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. 本證書中這倆個(gè)字段是一樣的,明顯是自簽名證書,是一個(gè) Root CA 的證書。從 X509v3 extension 開始就是證書擴(kuò)展項(xiàng)了。
          ? ?
          這里有個(gè) X509v3 Basic constraints. 里面的 CA 字段決定該證書是否可以做 CA 的證書,這里是 TURE 。如果這個(gè)字段沒有,那么會(huì)根據(jù)其他內(nèi)容決定該證書是否可以做 CA 證書。
          ? ?
          如果是 X509v1 證書,又沒有這個(gè)擴(kuò)展項(xiàng),那么只要 subject name issuer name 相同,就認(rèn)為是 Root CA 證書了。
          ? ?
          本例的證書沒有證書用途擴(kuò)展項(xiàng),它是一個(gè)叫 keyUseage 的字段。
          ? ?
          舉個(gè)例子就可以看出該字段目前可以有以下值
          ? ? 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
          ? ?
          ? ?
          每個(gè)值的具體意義應(yīng)該可以看名字就知道了吧?
          ? ? X509
          指令在轉(zhuǎn)化證書成 CSR 的時(shí)候沒有辦法把證書里的擴(kuò)展項(xiàng)轉(zhuǎn)化過去給 CSR 簽名做證書的時(shí)候,如果使用了多個(gè) option, 應(yīng)該自己保證這些 option 沒有沖突。

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

          主站蜘蛛池模板: 确山县| 松溪县| 宁都县| 合江县| 华容县| 石景山区| 聂荣县| 铁岭市| 南开区| 霍林郭勒市| 阳江市| 连平县| 南通市| 巴南区| 广水市| 灵川县| 北安市| 金平| 灵台县| 上栗县| 锡林郭勒盟| 永胜县| 中牟县| 斗六市| 太康县| 天祝| 天长市| 油尖旺区| 开化县| 白水县| 望都县| 漳州市| 屏南县| 云和县| 新民市| 广平县| 永宁县| 华阴市| 株洲市| 宁波市| 二连浩特市|