openssl簡介-指令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:99

0:F5:EC:11:7F:0A:01:53:58:4E:0B:7C:F7
X509v3 Authority Key Identifier:
keyid:69:41:87:55:BD:52:99

0: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沒有沖突。