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ì)的介紹。
? ? 如果有,打印出證書申請(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:
? ? 08:03:
? ? e5:20:ce:ed:
? ? 84:49:03:6b:79:
? ? 26:93:c0:02:eb:78:d6:8b:e1:91:df:85:39:33:fc:
? ? 3d:59:e9:
? ? 16:9b:41:36:45:05:fe:f9:b2:05:42:04:c9:3b:28:
? ? c1:
? ? 19:59:
? ? Exponent: 65537 (0x10001)
? ? X509v3 extensions:
? ? X509v3 Subject Key Identifier:
? ? 69:41:87:55:BD:52:99
? ? X509v3 Authority Key Identifier:
? ? keyid:69:41:87:55:BD:52:99
? ? 4E:0B:
? ? 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:
? ? 41:4d:de:fc:59:98:39:36:36:8e:c6:05:8d:
? ? 02:9d:a2:
? ? 0b:
? ? 22:e1:35:be:39:90:f5:41:60:
? ? 67:b5:3e:12:e5:06:da:
? ? 05:03:00:24:00:f1:5d:
? ? 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安全