[轉載]OpenSSL中文手冊之命令行詳解(未完待續)

 聲明:OpenSSL之命令行詳解是根據盧隊長髮布在https://blog.csdn.net/as3luyuan123/article/details/16105475的系列文章整理修改而成,我本身所作的工做主要是針對新的1.0.2版本進行驗證,修改錯別字,和錯誤,從新排版,以及整理分類,配圖。 未經做者容許,嚴禁用於商業出版,不然追究法律責任。網絡轉載請註明出處,這是對原創者的起碼的尊重!!!node

1 標準命令
  查看幫助的辦法:openssl 命令 -h。git

命令 功能 備註
證書類 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX =====
req PKCS10 X.509證書籤名請求(CSR)管理。 申請證書
x509 X.509證書管理。顯示證書信息、轉換證書格式、簽名證書請求及改變證書信任設置 證書工具
verify X.509證書驗證。 證書驗證
ca 證書頒發機構(CA)管理。簽發證書請求和生成CRL,維護一個已簽發證書狀態的文本數據庫。 證書中心
crl 證書撤銷清單(CRL)管理。工具,用於處理PEM或DER格式的CRL文件 證書吊銷
crl2pkcs7 CRL到PKCS#7轉換。根據CRL或者證書生成pkcs7消息; 證書吊銷
對稱加密 *XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX* =====
enc 加密和解密 對稱加解密
摘要 *XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX* ====
dgst 消息摘要計算。 摘要集合
非對稱 XXXXXXXXX全部的非對稱均可以使用pkey系列來操做,鼓勵使用pkey系列XXXXXXX ======
pkey 公鑰和私鑰管理。 非對稱加密
pkeyparam 公鑰算法參數管理。 非對稱加密
pkeyutl 公鑰算法加密操做實用程序。 非對稱加密
genpkey 生成私鑰或參數。 非對稱加密
PKI XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
pkcs7 PKCS7加密消息語法,各類消息存放的格式標準;用於處理DER或者PEM格式的pkcs7文件 消息格式
pkcs8 私鑰轉換工具,pkcs8格式 轉換證書
pkcs12 PKCS12數據管理。工具,用於生成和分析pkcs12文件 我的證書
工具 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX =======
asn1parse 解析ASN.1序列。用於診斷ASN.1結構的工具,也可從ASN.1數據中提取數據; 診斷工具
ciphers 密碼套件描述,顯示支持的加密套件
cms CMS(加密消息語法)實用程序
engine 引擎(loadble模塊)信息和操縱。
errstr 錯誤字符串轉換的錯誤號。
nseq 建立或檢查netscape證書序列,多證書與netscape證書序列間相互轉化 序列轉換
ocsp 在線證書狀態協議實用程序。 在線證書狀態
passwd 生成散列密碼。生成各類口令密文
prime 檢查一個數是不是素數
rand 生成僞隨機字節。
smime S / MIME郵件處理。處理S/MIME郵件,加密、解密、簽名和驗證 郵件驗證工具
speed 算法速度測量。,調整測試庫的性能 性能工具
s_time SSL鏈接定時器。提供的SSL/TLS性能測試工具,測試服務 性能工具
spkac SPKAC打印和生成實用程序
ts 時間戳機構工具(客戶端/服務器)
sess_id SSL會話數據管理。SSL/TLS協議的session處理工具 協議會話工具
s_client 這將實現一個通用SSL / TLS客戶端,能夠創建與遠程服務器的SSL / TLS透明鏈接。 協議會話工具
s_server 這實現了一個通用SSL / TLS服務器,它接受來自遠程客戶端的SSL / TLS鏈接。 協議會話工具
version OpenSSL版本信息。
===========所有已經時的禁止再使用,主要爲了兼容===================
ec EC(橢圓曲線)密鑰處理,用於數字簽名和加密 ecc算法
ecparam EC參數的操做和生成,產生ECC密鑰對。用於數字簽名和加密 ecc算法
dh Diffie-Hellman參數管理。被dhparam淘汰了 dh算法
gendh 生成Diffie-Hellman參數。被dhparam淘汰了 dh算法
dhparam 生成和管理Diffie-Hellman參數。被genpkey和pkeyparam取代 dh算法
genrsa 生成RSA私鑰。由genpkey取代 rsa算法
rsa RSA密鑰管理。處理RSA密鑰、格式轉換和打印信息 rsa算法
rsautl RSA實用程序用於簽名,驗證,加密和解密。取而代之的是pkeyutl rsa算法
dsa DSA數據管理。處理DSA密鑰、格式轉換和打印信息,用於數字簽名 dsa算法
dsaparam DSA參數生成與管理。用於生成和操做dsa證書參數,用於數字簽名,被genpkey和pkeyparam取代 dsa算法
gendsa 從參數生成DSA私鑰。生成DSA密鑰,密鑰參數用dsaparam生成,用於數字簽名,由genpkey和pkey取代 dsa算法
2 命令詳解
2.1 enc
  對稱加密算法工具。它可以運用塊或者流算法對數據加/解密。還可以把加密/接密,還能夠把結果進行base64編碼。web

openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A]
[-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p]
[-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]
1
2
3
-in filename —— 輸入文件
-out filename ——輸出文件,省略則爲標準輸出
-pass arg —— 口令設置,用於沒有提供密鑰時,採用摘要算法從口令中生成一個密鑰,若是加密時使用了口令,則解密也要使用口令,arg以下所示:
-pass pass:"123" #密碼是123
-pass pass:123 #密碼是123
-pass evn:VAR #密碼從環境變量VAR中去
-pass file:p.txt #密碼從文件p.txt第一行取,不包括換行符,注意DOS格式的^M及回車符。
-pass fd:3 #密碼從文件描述符3中讀
-pass stdin #標準輸入
1
2
3
4
5
6
-e —— 加密,二選一
-d —— 解密,二選一
-a/-base64 —— 加密時設置結果以base64編碼,,解密時設置輸入爲base64
-A ——加密時設置結果以base64編碼成一行,解密時設置輸入爲一行base64
-k password—— 口令,已經被-pass代替,二選一
-kfile filename] —— 口令文件 已經被-pass代替,二選一
-K key —— 加密祕鑰,16進制
-iv IV ——初始向量,16進制
-S salt ——指定16進製鹽值
-salt ——帶有隨機鹽值 二選一
-nosalt ——不帶鹽值,已經關閉此選項,二選一
-z ——是否壓縮,須要編譯時選擇了zlib庫
-md digstname —— 摘要算法,當沒有提供密鑰時候,用於從口令中生成一個密鑰,默認md5
-p ——打印出使用的salt、口令以及初始化向量IV。二選一
-P ——打印出使用的salt、口令以及初始化向量IV。不作加解密,二選一
-bufsize number ——緩衝區大小
-nopad ——無填充
-debug ——打印調試信息
-none ——不執行加 解密
-engine id ——引擎
-cihername ——要使用的加密算法,支持的加密算法以下算法

-aes-128-cbc -aes-128-cbc-hmac-sha1 -aes-128-cbc-hmac-sha256
-aes-128-ccm -aes-128-cfb -aes-128-cfb1
-aes-128-cfb8 -aes-128-ctr -aes-128-ecb
-aes-128-gcm -aes-128-ofb -aes-128-xts
-aes-192-cbc -aes-192-ccm -aes-192-cfb
-aes-192-cfb1 -aes-192-cfb8 -aes-192-ctr
-aes-192-ecb -aes-192-gcm -aes-192-ofb
-aes-256-cbc -aes-256-cbc-hmac-sha1 -aes-256-cbc-hmac-sha256
-aes-256-ccm -aes-256-cfb -aes-256-cfb1
-aes-256-cfb8 -aes-256-ctr -aes-256-ecb
-aes-256-gcm -aes-256-ofb -aes-256-xts
-aes128 -aes192 -aes256
-bf -bf-cbc -bf-cfb
-bf-ecb -bf-ofb -blowfish
-camellia-128-cbc -camellia-128-cfb -camellia-128-cfb1
-camellia-128-cfb8 -camellia-128-ecb -camellia-128-ofb
-camellia-192-cbc -camellia-192-cfb -camellia-192-cfb1
-camellia-192-cfb8 -camellia-192-ecb -camellia-192-ofb
-camellia-256-cbc -camellia-256-cfb -camellia-256-cfb1
-camellia-256-cfb8 -camellia-256-ecb -camellia-256-ofb
-camellia128 -camellia192 -camellia256
-cast -cast-cbc -cast5-cbc
-cast5-cfb -cast5-ecb -cast5-ofb
-des -des-cbc -des-cfb
-des-cfb1 -des-cfb8 -des-ecb
-des-ede -des-ede-cbc -des-ede-cfb
-des-ede-ofb -des-ede3 -des-ede3-cbc
-des-ede3-cfb -des-ede3-cfb1 -des-ede3-cfb8
-des-ede3-ofb -des-ofb -des3
-desx -desx-cbc -id-aes128-CCM
-id-aes128-GCM -id-aes128-wrap -id-aes192-CCM
-id-aes192-GCM -id-aes192-wrap -id-aes256-CCM
-id-aes256-GCM -id-aes256-wrap -id-smime-alg-CMS3DESwrap
-rc2 -rc2-40-cbc -rc2-64-cbc
-rc2-cbc -rc2-cfb -rc2-ecb
-rc2-ofb -rc4 -rc4-40
-rc4-hmac-md5 -seed -seed-cbc
-seed-cfb -seed-ecb -seed-ofb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
注意:
該程序能夠經過openssl ciphername或者openssl enc -ciphername 兩種方式調用,可是前一種不支持引擎加密.
應在配置文件中配置提供全新加密算法的引擎(如提供gost89算法的ccgost引擎)。在命令行中使用-engine選項指定的引擎只能用於由配置文件中指定的OpenSSL內核或其餘引擎支持的密碼的硬件輔助實現。
當enc命令列出支持的加密算法時,也列出了配置文件中指定的引擎提供的算法。
若是須要,將提示輸入密鑰以得到密鑰。
若是從密碼派生密鑰,則應使用-salt選項,除非您但願與之前版本的OpenSSL和SSLeay兼容。沒有-salt選項,能夠對密碼執行有效的字典攻擊,並攻擊流密碼加密數據。緣由是沒有slat,相同的密碼老是生成相同的加密密鑰。當slat被使用時,加密數據的前八個字節被保留給鹽:它在加密文件時被隨機生成,而且在被解密時從加密文件讀取。
一些密碼沒有大的密鑰,若是不正確使用,會帶來安全隱患。建議初學者在CBC模式下使用強分組密碼,如bf或des3。
全部塊密碼一般使用PKCS#5填充也稱爲標準塊填充:這容許執行基本的完整性或密碼檢查。然而,因爲隨機數據經過測試的機會優於256中的1,這不是一個很是好的測試。
若是禁止填充,則輸入數據必須是密碼塊長度的倍數。
全部RC2密碼具備相同的密鑰和有效的密鑰長度。
Blowfish和RC5算法使用128位密鑰。
//加密(提供密鑰)
$openssl enc -aes-128-cbc -e -K 000 -iv 000 -in test.txt -out test.cipher -a -A -p
//解密
$openssl enc -aes-128-cbc -d -K 000 -iv 000 -in test.ciphet -a -A -out test.plain -p
//加密(提供口令)
$openssl enc -aes-128-cbc -e -pass pass:123456 -S a1bec3d4e5f6 -salt -md sha1 -iv 000 in test.txt -out test.cipher -a -A -p
//解密
$openssl enc -aes-128-cbc -d -pass pass:123456 -S a1bec3d4e5f6 -salt -md sha1 -iv 000 in test.cipher -out test.plain -a -A -p
1
2
3
4
5
6
7
8
9
2.2 dgst
  主要用於數據摘要。它也能夠用於數據簽名以及驗證簽名數據庫

openssl dgst [-sha|-sha1|-mdc2|-ripemd160|-sha224|-sha256|-sha384|-sha512|-md2|-md4|-md5|-dss1] [-c] [-d] [-hex] [-binary]
[-r][-non-fips-allow] [-out filename] [-sign filename] [-keyform arg] [-passin arg] [-verify filename] [-prverify filename]
[-signature filename] [-hmac key] [-non-fips-allow] [-fips-fingerprint] [file...]
1
2
3
-sha|-sha1|-mdc2|-ripemd160|-sha224|-sha256|-sha384|-sha512|-md2|-md4|-md5|-dss1 摘要算法,多選一
-c ——當設置了-hex,輸出結果每兩個字符中加一個冒號
-d ——打印出BIO調試信息值。
-hex ——以十六進輸出結果,二選一
-binary ——以二進制輸出結果,二選一
-r —— 以sha1sum的「coreutils」格式輸出摘要
-non-fips-allow —— 容許在FIPS模式使用非FIPS算法
-out filename—— 輸出文件,默認標準輸出
-sign filename—— 使用文件中的私鑰簽名
-keyform arg —— 私鑰格式,PEM | DER
-passin arg—— 私鑰密碼
-verify filename ——公鑰驗籤
-prverify filename ——私鑰驗籤
-signature filename ——簽名文件
-hmac key ——hmac 祕鑰
-non-fips-allow ——容許在FIPS模式使用非FIPS算法
-fips-fingerprint ——在某些openssl——FIPS中使用特殊密鑰計算HMAC
file ——輸入文件
注意windows

全部新應用程序的選擇的摘要算法是SHA1。 然而其餘摘要算法仍然被普遍使用。
在簽名時,dgst將根據私鑰的ASN.1信息自動肯定用於簽名的算法(RSA,ECC等)。
當驗證簽名時,它只處理RSA,DSA或ECDSA簽名自己,而不是分析相關數據來識別簽名者和相關算法,如x.509,CMS和S / MIME的簽名者和算法。
某些簽名算法,特別是ECDSA和DSA須要一個隨機數源。
僅當單個文件要簽名或驗證時,才能使用簽名和驗證選項。
十六進制簽名沒法使用openssl進行驗證。使用「xxd -r」或相似程序在驗證以前將十六進制簽名轉換爲二進制簽名。
例子安全

//計算摘要
$openssl dgst -sh1 -c -hex -out md.sha1 test.txt
//私鑰簽名
$ openssl dgst -sign rsa_pri.key -keyform PEM -passin pass:123456 -out rsa_sign.sig test.txt
//私鑰驗籤
$openssl dgst -prverify rsa_pri.key -keyform PEM -passin pass:123456 -signature rsa_sign.sig test.txt
//公鑰驗籤
$openssl dgst -verify rsa_pub.key -keyform PEM -signature rsa_sign.sig test.txt
//hmac
$openssl dgst -hmac rsa_pri.key -keyform PEM -passin pass:123456 -sha1 -out rsa.hmac test.txt
1
2
3
4
5
6
7
8
9
10
2.3 非對稱
2.3.1 pkeyparam
  公共密鑰算法的參數處理工具。它可以處理公鑰或私鑰文件。它可以轉換組件信息並將它們打印出來。服務器

openssl pkeyparam [-in filename] [-out filename] [-text] [-noout] [-engine id]
1
-in filename——輸入文件, 若是未指定此選項,則從標準輸入讀取。
-out filename——輸出文件,若是未指定此選項,則輸出參數到標準輸出
-text——除了編碼版本信息本外,以明文打印出參數
-noout——不打印參數編碼的版本信息。
engine id——引擎
注意
該命令沒有-inform或-outform選項,由於僅支持PEM格式,由於密鑰類型由PEM頭決定。
例子
$ openssl pkeyparam -in param.pem -text
1
2.3.2 genpkey
  生成一個私鑰。網絡

openssl genpkey [-out filename] [-outform PEM|DER] [-pass arg] [-cipher] [-engine id]
[-paramfile file] [-algorithm alg] [-pkeyopt opt:value][-genparam] [-text]
1
2
3
-out filename——輸出文件名。若是未指定此參數,則使用標準輸出。
-outform PEM|DER——輸出格式
-pass arg—— 私鑰訪問密碼
-cipher——私鑰的對稱加密方式
-engine id——引擎,如要使用應該放在第一個位置
-paramfile file—— 一些公鑰算法基於一組參數生成私鑰。可使用此選項提供參數。若是使用此選項,則使用的公鑰算法由參數決定。若是使用此選項則必須在-pkeyopt選項以前。選項-paramfile和 -algorithm是互斥的。
-algorithm alg—— 使用公鑰算法如RSA,DSA或DH。若是使用此選項,則必須位於任何-pkeyopt選項以前。 -paramfile和-algorithm選項是互斥的。
-pkeyopt opt:value——設置公鑰算法選項選擇值。支持的精確選項取決於所使用的公鑰算法及其實現。有關更多詳細信息,請參見下面的密鑰生成選項。
-genparam——生成一組參數,而不是私鑰。若是使用此選項必須在-paramfile 和 -algorithm, -pkeyopt 選項以前。
-text——打印私鑰和公鑰和參數(PEM或DER結構)的(未加密)文本。
密鑰生成選項——每一個算法支持的選項以及算法的每一個實現均可以有所不一樣。 OpenSSL實現的選項以下。session

RSA關鍵生成選項
rsa_keygen_bits:NUMBITS——生成的密鑰中的比特數。若是未指定1024。
rsa_keygen_pubexp:value——RSA公衆指數值。若是前面加上0x,這能夠是一個大的十進制或十六進制值。默認值爲65537。
DSA參數生成選項
dsa_paramgen_bits:NUMBITS——生成參數中的位數。若是未指定1024。
DH參數生成選項
dh_paramgen_prime_len:NUMBITS——素數參數p的位數。
dh_paramgen_generator:value——生成g所用的的值。
dh_rfc5114:NUM—— 若是設置了此選項,則使用相應的RFC5114參數,而不是生成新參數。值num能夠採用與RFC5114 DH參數相對應的值1,2或3,該參數包括1024位組與160位子組,2048位組與224位子組和2048位組與256位子組,如RFC5114第2.1,2.2節中所述和2.3
EC參數生成選項
ec_paramgen_curve:_curve——要使用的ECC曲線
GOST2001密鑰生成和參數選項

Gost 2001支持默認狀況下不啓用。要啓用此算法,應在OpenSSL配置文件中加載ccgost引擎。有關詳細信息,請參閱源分發引擎/ ccgost directiry中的README.gost文件。 使用GOST R 34.10算法的參數文件是可選的。參數能夠在密鑰生成期間直接指定,也能夠在生成參數文件期間指定。

paramset:name——根據RFC 4357指定GOST R 34.10-2001參數集。參數集可使用縮寫名稱,對象短名稱或數字OID進行指定。支持如下參數集:

paramset OID Usage
A 1.2.643.2.2.35.1 Signature
B 1.2.643.2.2.35.2 Signature
C 1.2.643.2.2.35.3 Signature
XA 1.2.643.2.2.36.0 Key exchange
XB 1.2.643.2.2.36.1 Key exchange
test 1.2.643.2.2.35.0 Test purposes
1
2
3
4
5
6
7
注意
鼓勵使用genpkey,由於可使用額外的算法選項和ENGINE提供的算法。
例子
//生成RSA私鑰
$openssl genpkey -out rsa_pri.key -outform PEM -pass pass:123456 -aes-128-cbc \
-algorithm RSA -pkeyopt rsa_keygen_bits:1024 -text
//這種方式生成的RSA私鑰 不只代用 私鑰和大數,還代用公鑰,以及其它信息,以用於快速計算。
1
2
3
4
2.3.3 pkey
   pkey命令處理公鑰或私鑰。它們能夠在各類形式之間進行轉換,並將其結構打印出來。

openssl pkey [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename]
[-passout arg] [-cipher] [-text] [-text_pub] [-noout] [-pubin] [-pubout] [-engine id]
1
2
3
-inform PEM|DER—— 輸入格式
-outform PEM|DER—— 輸出格式
-in filename——輸入密鑰文件,若是未指定此選項,則從標準輸入讀取。若是密鑰加密,將提示輸入密碼。
-passin arg—— 輸入密鑰的密碼
-out filename——輸出文件, 若是未指定此選項,則輸出到標準輸出。若是設置了任何加密選項,則會提示輸入密碼。輸出文件名不能與輸入文件名相同
-passout arg 輸出密鑰的加密口令
-cipher—— 輸出密鑰的加密方式
-text—— 除了編碼版本以外,以明文形式打印各類公共或私人密鑰。
-text_pub——只打印公鑰,當一個私鑰在處理時
-noout—— 不輸出密鑰的編碼版本
-pubin——默認是讀入私鑰,該選項指定讀入公鑰
-pubout—— 默認狀況下會輸出私鑰:使用此選項將會輸出公鑰。 若是輸入是公鑰,則會自動設置此選項。用於從私鑰生成公鑰。
-engine id——引擎id
舉例
//由私鑰生成公鑰
$openssl pkey -in rsa_pri.key -inform PEM -passin pass:123456 -out rsa_pub.key -outform PEM -pubout -text
//私鑰改密碼
$openssl pkey -in rsa_pri.key -inform PEM -passin pass:123456 -out rsa_change.key -outform PEM -passout pass:456789 -des-cbc -text
//改變公鑰格式
$openssl pkey -in rsa_pub.key -inform PEM -out rsa_pub_der.key -outform DER -pubin -pubout -text
1
2
3
4
5
6
2.3.4 pkeyutl
&emsp pkeyutl命令可用於執行支持的公鑰操做.

openssl pkeyutl [-in file] [-out file] [-sigfile file] [-inkey file]
[-keyform PEM|DER] [-passin arg] [-peerkey file] [-peerform PEM|DER] [-pubin]
[-certin] [-rev] [-sign] [-verify] [-verifyrecover] [-encrypt][-decrypt]
[-derive] [-pkeyopt opt:value] [-hexdump] [-asn1parse] [-engine id]

1
2
3
4
5
6
-in file——輸入文件,若是不指定,則從標準輸入讀取
-out file——輸出文件,若是不指定,則輸出到標準輸出
-sigfile file——簽名文件,默認爲標準輸入
-inkey file——輸入密鑰文件,默認狀況下應該是一個私鑰
-keyform PEM|DER——密鑰格式爲PEM,DER或ENGINE
-passin arg——輸入密鑰的口令
-peerkey file——對等密鑰文件,由密鑰導出(協議)操做使用
-peerform PEM|DER—— 指定對等密鑰格式爲PEM,DER或ENGINE
-pubin—— 輸入密鑰是一個公鑰,默認爲私鑰
-certin——輸入的是包含公鑰的證書。
-rev——反轉輸入緩衝器的順序。這對於以小端序格式表示緩衝區的一些庫(如CryptoAPI)頗有用。
-sign——給輸入文件簽名,須要私鑰
-verify——根據簽名文件驗證輸入數據,並指示驗證是成功仍是失敗
-verifyrecover——驗證輸入數據並輸出轉換後的數據
-encrypt——使用公鑰加密輸入數據
-decrypt——使用私鑰解密輸入數據
-derive—— 使用對等密鑰導出共享密鑰
-pkeyopt opt:value——公鑰參數選項
-hexdump——hex轉儲輸出數據。
-asn1parse—— 對輸出的數據進行ASN1分析。當對ASN1結構簽名與-verifyrecover選項聯合使用很是有用
-engine id——引擎
注意:支持的操做和選項根據密鑰算法及其實現而有所不一樣。 OpenSSL操做和選項以下所示。

除非另有說明,不然全部算法都支持digest:alg選項,指定摘要算法進行簽名,驗籤和verifyrecover操做。值alg應該是EVP_get_digestbyname()函數中使用的摘要名稱,例如sha1。該值僅用於對傳入pkeyutl的數據的長度進行健全檢查,並用於建立構成簽名的結構(例如RSASSA PKCS#1 v1.5簽名中的DigestInfo)。在RSA,ECDSA和DSA簽名的狀況下,該實用程序不會對輸入數據執行散列,而是直接使用數據做爲簽名算法的輸入。(所以要注意的輸入的數據長度)
根據密鑰類型,簽名類型和填充模式,輸入數據的最大可接受長度不一樣。通常來講,使用RSA,簽名數據不能長於密鑰模數,在ECDSA和DSA的狀況下,數據不該該長於字段大小,不然將被默認地截斷爲字段大小。換句話說,若是digest的值爲sha1,則輸入應爲SHA-1函數輸出的20字節長的二進制編碼。
RSA算法,RSA算法一般支持encrypt,decrypt,sign,verify和verifyrecover操做。一些填充模式只支持其中一些操做
rsa_padding_mode:mode
RSA中的參數rsa_padding_mode:mode設置RSA的填充模式,支持的填充模式有:用PKCS#1來設置PKCS#1填充模式,用sslv23來設置SSLv23填充模式,用none來設置no填充模式,用oaep來設置OAEP填充模式,用x931來設置X9.31填充模式以及用pss來設置PSS。
在PKCS#1填充中,若是摘要算法未設置,則提供的數據將被直接簽名或驗證,而不是使用DigestInfo結構。若是設置摘要,則使用DigestInfo結構,其長度必須對應於摘要類型。
對於oeap模式,僅支持加密和解密。
對X9.31填充模式來講,若是設置了摘要算法,並將它用於格式塊數據,不然第一個字節必需要用X9.31摘要ID。它支持簽名、驗證簽名以及驗證恢復操做。
對於pss模式,僅支持簽名和驗證,而且必須指定摘要算法
rsa_pss_saltlen:LEN
對於pss模式,只有此選項指定填充長度。它支持兩個值:
-1設置填充長度爲摘要長度。
-2表示當簽名的時候,設置填充字節爲最大的可容許的字節數。當驗證的時候,表示填充字節由塊結構體來決定。
DSA算法——DSA算法僅支持sign和verify操做。 目前除了digest以外沒有其餘選項。 默認狀況下,只能使用SHA1摘要,並默認此摘要算法。
DH算法—— DH算法只支持derived操做,沒有附加選項。
EC算法——EC算法支持sign,verify和derived操做。 sign和verify操做使用ECDSA,derived使用ECDH。 目前除了digest以外沒有其餘選項。 只支持SHA1摘要,默認摘此要算法 。

舉列

//簽名
$openssl pkeyutl -sign -inkey rsa_pri.key -keyform PEM -passin pass:123456 -in md.sha1 -out md.sig
//驗籤
$openssl pkeyutl -verify -inkey rsa_pub.key -keyform PEM -pubin -in md.sha1 -sigfile md.sig
//加密
$openssl pkeyutl -encrypt -inkey rsa_pub.key -keyform PEM -pubin -in md.sha1 -out md.cipher
//解密
$openssl pkeyutl -decrypt -inkey rsa_pri.key -keyform PEM -passin pass:123456 -in md.cipher -out md.plain
//建立一個共享密鑰
$openssl pkeyutl -derive -inkey rsa_pri.pem -passin pass:123456 -peerkey pubkey.pem -out secret
1
2
3
4
5
6
7
8
9
10
2.3 證書類
2.3.1 req
  req命令主要建立證書請求(能夠新生成私鑰),查看證書請求。它能夠建立自簽名證書,以做爲root CA使用。但不能讀取證書。

openssl req [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg]
[-out filename] [-passout arg] [-text] [-pubkey] [-noout] [-verify][-modulus]
[-new] [-rand file(s)] [-newkey arg] [-nodes] [-key filename] [-keyform PEM|DER]
[-keyout filename][-keygen_engine id] [-[digest]] [-config filename] [-multivalue-rdn]
[-x509] [-days n] [-set_serial n] [-asn1-kludge] [-no-asn1-kludge] [-newhdr]
[-extensions section] [-reqexts section] [-utf8] [-nameopt] [-reqopt]
[-subject] [-subj arg] [-batch] [-verbose] [-engine id]
1
2
3
4
5
6
7
輸入輸出項,通用選項
-inform PEM|DER——輸入的證書請求的格式。 DER選項使用與PKCS#10兼容的ASN1 DER編碼格式。 PEM格式是默認格式:它由DER格式base64編碼,帶有附加的頭部和尾部。
-outform PEM|DER——輸出的證書或證書請求的格式,默認PEM
-in filename——輸入的證書請求文件名,若是未指定此選項,則從標準輸入。只有未指定選項-new和-newkey)時,纔會讀取證書請求
-out filename——輸出證書或證書請求文件名,不指定則默認標準輸出
-[digest]——指定消息摘要算法(如-md5,-sha1)來對證書請求籤名。這將覆蓋配置文件中指定的摘要算法。 * 一些公鑰算法能夠忽略這個選項*。例如,DSA簽名始終使用SHA1,GOST R 34.10簽名始終使用GOST R 34.11-94(-md_gost94)。
-config filename——使用的config文件的名稱。本選項若是沒有設置,將使用缺省的config文件
私鑰選項
-key filename—— 指定從中讀取私鑰的文件。它也讀取PEM格式的PKCS#8私鑰
-keyform PEM|DER——在-key參數中指定的讀入的私鑰文件的格式。默認 PEM
-passin arg——私鑰的口令
-keyout filename—— 指定新建立的私鑰的輸出文件名字。若是未指定此選項,則使用配置文件中的文件名。只能以PEM格式輸出
-passout arg——新建的私鑰口令
-rand file(s)——指定隨機數種子文件,或者EGD套接字的隨機數據的文件,多個文件間用分隔符分開,windows用「;」,OpenVMS用「,「,其餘系統用「:」
-nodes——若是指定了此選項,建立私鑰時則不會對其進行加密
-keygen_engine id——生成私鑰的引擎
-pkeyopt opt:value 設置公鑰算法選項選擇值。genpkey手冊頁中的密鑰生成選項。
-newkey arg——用於生成新的私鑰以及證書請求。arg 能夠是下列:
rsa:nbits——其中nbits是比特數,指明生成一個RSA密鑰的長度。若是省略nbits,如:-newkey rsa,則使用配置文件中指定的默認密鑰長度。
alg:file——全部其餘算法都支持-newkey alg:filename,其中文件多是由genpkey -genparam命令建立的算法參數文件或於具備適用於alg算法的密鑰的X.509證書。
param:file —— 用參數文件或證書文件生成一個密鑰,算法由參數決定,
algname:file—— 使用algname指定的算法和flle指定的參數生成密鑰, 算法與參數必須匹配,algname指定表明所使用的算法,file能夠省略,但必須用 -pkeyopt parameter指定參數。
dsa:filename——使用文件filename中的參數生成DSA密鑰。
ec:filename——生成EC密鑰(可用於ECDSA或ECDH算法),
gost2001:filename——生成GOST R 34.10-2001密鑰(須要在配置文件中配置ccgost引擎)。若是隻指定gost2001,則應經過-pkeyopt paramset:X指定參數集
證書請求選項
-verify—— 驗證證書請求上的簽名。
-new——本選項產生一個新的證書請求,它會要用戶輸入建立證書請求的一些必須的信息。至於須要哪些信息,是在config文件裏面定義好了的。若是-key沒有被設置,,那麼就將根據config文件裏的信息先產生一對新的RSA密鑰值。
-multivalue-rdn——當採用-subj arg選項時,容許多個值的rdn,好比arg參數寫做:/CN=china/OU=test/O=abc/UID=123456+CN=forxy。若是不使用此選項,則UID值爲123456+CN=forxy
-asn1-kludge——缺省的req指令輸出不帶屬性的徹底符合PKCS10格式的證書請求,但有的CA僅僅接受一種非正常格式的證書請求,這個選項的設置就能夠輸出那種格式的證書請求。PKCS#10證書請求中的屬性被定義爲SET OF屬性。 它們不是可選的,所以若是沒有屬性存在,那麼它們應該被編碼爲空的SET OF。 而非正常格式的證書請求中不包括空的SET OF。 應該注意的是,不多的CA仍然須要使用這個選項。
-no-asn1-kludge——不輸出特定格式的證書請求。
-newhdr——在CSR問的第一行和最後一行中加一個單詞」NEW」,有的軟件(netscape certificate server)和有的CA就有這樣子的怪癖嗜好。若是那些必需要的選項的參數沒有在命令行給出,那麼就會到config文件裏去查看是否有缺省值
-extensions section -reqexts section——這倆個選項指定config文件裏面的與證書擴展和證書請求擴展有關的倆個section的名字(若是-x509這個選項被設置)。這樣你能夠在config文件里弄幾個不一樣的與證書擴展有關的section,而後爲了避免同的目的給證書請求籤名的時候指明不一樣的section來控制簽名的行爲。。
-utf8—— 此選項將字段值解釋爲UTF8字符串,默認狀況下將其解釋爲ASCII。這意味着字段值(不管是從終端提示仍是從配置文件獲取)必須是有效的UTF8字符串。
-subj arg——用於指定生成的證書請求的用戶信息,或者處理證書請求時用指定參數替換。生成證書請求時,若是不指定此選項,程序會提示用戶來輸入各個用戶信息,包括國名、組織等信息,若是採用此選擇,則不須要用戶輸入了。好比:-subj /CN=china/OU=test/O=abc/CN=forxy,注意這裏等屬性必須大寫。
-batch——不詢問用戶任何信息(私鑰口令除外),採用此選項生成證書請求時,不詢問證書請求當各類信息
-verbose—— 打印關於執行操做的額外的詳細信息
-engine id——引擎
證書籤名

-x509—— 此選項輸出自簽名證書。這一般用於生成測試證書或自簽名根證書。添加到證書的擴展項(若是有)在配置文件中指定。除非使用set_serial選項,不然將使用較大的隨機數做爲序列號。
-days n—— 當使用-x509選項時,指定證書的有效期。默認爲30天。
-set_serial n—— 輸出自簽名證書時使用的序列號。若是前綴爲0x,則能夠將其指定爲十進制值或十六進制值。可使用負序列號,但不建議這樣作。
顯示選項

-text—— 以文本形式打印證書請求
-pubkey—— 輸出公鑰。
-noout——選項可防止輸出證書請求的編碼版本
-modulus—— 該選項打印證書請求中公鑰的模數值
-subject—— 打印證書請求的subject
-nameopt——用於肯定主題或發行者名稱的顯示方式。選項參數能夠是單個選項或多個選項,以逗號分隔。-nameopt開關能夠被屢次使用以設置多個選項。參見X509。
-reqopt—— 定製與-text一塊兒使用時的輸出格式。選項參數能夠是單個選項或多個選項,以逗號分隔。 請參閱x509命令中-certopt參數的說明。
配置文件格式

配置選項在配置文件的req部分中指定。與全部配置文件同樣,若是在特定部分(即req)中未指定任何值,則使用默認值。
input_password output_password ——輸入私鑰文件(若是存在)和輸出私鑰文件(若是將被建立)的口令。命令行選項passin和passout覆蓋此值。
default_bits—— 指定默認密鑰大小(以位爲單位)。 此選項與-new選項結合使用以生成新密鑰。能夠經過在-newkey選項中指定密鑰大小來覆蓋它。最小的接受密鑰大小是512位。若是沒有指定密鑰大小,則使用2048位。
default_keyfile—— 這是將私鑰輸出時的默認文件名。若是未指定,則將該鍵寫入標準輸出。這能夠被-keyout選項覆蓋。
oid_file——指定一個包含其餘對象標識符的文件。文件的每一行都應包含對象標識符的數字形式,後跟空格,而後是短名稱,後跟空格,最後是長名稱。。
oid_section——指定配置文件中包含額外對象標識符的部分。每一行都應包含對象標識符的短名稱,後面跟着=和數字形式。當使用此選項時,短名稱和長名稱相同。
RANDFILE—— 這指定了放置和讀取隨機數種子信息或EGD套接字的文件名(請參閱RAND_egd)。它用於私鑰生成。
encrypt_key——若是這被設置爲否,則若是生成私鑰,則不加密。這至關於-nodes命令行選項。爲了兼容性,encrypt_rsa_key是一個等效的選項。
default_md——此選項指定要使用的摘要算法。可能的值包括md5 sha1 mdc2。若是不存在,則使用MD5。該選項能夠在命令行中被覆蓋。
string_mask—— 此選項會遮蔽某些字段中某些字符串類型的使用。大多數用戶不須要更改此選項。它能夠設置默認值,默認選項使用PrintableStrings,T61Strings和BMPStrings,若是設置爲pkix,則只能使用PrintableStrings和BMPStrings。這符合RFC2459中的PKIX建議。若是設置utf8only,則僅使用UTF8Strings:這是2003年以後的RFC2459中的PKIX建議。最後,設置爲nombstr僅使用PrintableStrings和T61Strings:某些軟件在BMPStrings和UTF8Strings中有問題:特別是Netscape。
req_extensions——它指定了配置文件中字節包含了一系列的額外信息,這些額外信息將會被添加到證書請求信息中。它能夠被-reqexts命令覆蓋。有關詳細信息,請參閱x509v3_config(5)。
x509_extensions 它指定了配置文件中字節包含了一系列的擴展信息,當-x509選項使用時,這些額外信息將會被添加到證書中。它能夠被- extensions命令行所覆蓋。
prompt——若是設置爲值no,則禁用提示字段,並直接從配置文件獲取值。它還會更改distinguished_name和attributes部分的預期格式。
utf8—— 若是設置爲yes,則域的值將轉換爲utf8格式。默認的是ASCII格式。這就意味着這些域值不能從終端獲取值,只能從配置文件中獲取,還必須是可利用的UTF8字符串。
attributes——這個指定了包含不少請求屬性的字節:格式和distinguished_name同樣。具備表明性的是包含challengePassword 或 unstructuredName 類型。目前來講,他們是被OpenSSL的請求籤名實體所忽略了的,可是一些CA有可能須要他們。
distinguished_name——這個指定了包含distinguished_name域,當產生一個證書或證書請求時,有提示。
注意:PEM格式的頁眉和頁腳線一般爲:
    —–BEGIN CERTIFICATE REQUEST—–
    —–END CERTIFICATE REQUEST—–
  某些軟件(某些版本的Netscape證書服務器)須要:
—–BEGIN NEW CERTIFICATE REQUEST—–
—–END NEW CERTIFICATE REQUEST—–
  它使用-newhdr選項生成,但以其餘方式兼容。 任何形式的輸入都被透明地接受。
  Xenroll與MSIE生成的證書請求已添加擴展名。 它包括keyUsage擴展,它決定了密鑰的類型(僅限簽名或通用目的)以及腳本在extendedKeyUsage擴展中輸入的任何其餘OID。
distinguished_name和 attributes格式  
有兩種單獨的格式。若是 prompt選項設置爲否,則這些部分僅由字段名稱和值組成, 這容許外部程序(例如基於GUI)生成具備全部字段名稱和值的模板文件,並將其傳遞給req:例如,
CN=My Name
OU=My Organization
emailAddress=someone@somewhere.org
或者,若是提示選項不存在或未設置爲否,則該文件包含字段提示信息。它由如下形式組成:
   fieldName=」prompt」
   fieldName_default=」default field value」
   fieldName_min= 2
   fieldName_max= 4
」fieldName」是正在使用的字段名稱,例如commonName(或CN)。 「提示」字符串用於要求用戶輸入相關詳細信息。若是用戶沒有輸入任何內容,那麼若是沒有默認值,則使用默認值,r若是沒有默認值則省略該字段。若是用戶剛剛輸入’.’,即便存在默認值,仍然能夠省略一個字段。
輸入的字符數必須在fieldName_min和fieldName_max限制之間:根據正在使用的字段可能會有其餘限制(例如,countryName只能長兩個字符,而且必須適合PrintableString)。
某些字段(如organizationName)能夠在DN中屢次使用。 這是一個問題,由於配置文件將不會識別出現兩次相同的名稱。 爲了不這個問題,若是fieldName包含一些字符後跟一個完整的中止將被忽略。 因此第二個organizationName能夠經過調用「1.organizationName」來輸入。
實際上所許可的域名字是一些對象標識符的短或長名字。它們在OpenSSL中編譯和包含經常使用的值例如as commonName、countryName、localityName、 organizationName、organizationUnitName、stateOrProvinceName。此外emailAddress也包含name、 surname、givenName initials 和 dnQualifier。
可使用配置文件中的oid_file或oid_section選項來定義附加對象標識符。 任何其餘字段將被視爲一個DirectoryString。
診斷

常常詢問如下消息:
Using configuration from /some/path/openssl.cnf
Unable to load config info
 在一段時間後跟…
unable to find ‘distinguished_name’ in config
problems making Certificate Request
  第一個錯誤信息是線索:找不到配置文件!某些操做(如檢查證書請求)不須要配置文件,所以不會強制使用它。然而生成證書或請求確實須要一個配置文件。這能夠被認爲是一個bug。
   另外一個使人困惑的消息是:
Attributes:
a0:00
  當沒有屬性存在而且該請求包括正確的空的SET OF結構(其DER編碼爲0xa0×0x00)時顯示。若是你只是看到: Attributes:
  那麼SET OF丟失,編碼在技術上是無效的(可是它是容忍的)。有關詳細信息,請參閱命令行選項-asn1-kludge的說明。

環境變量

若是定義了變量OPENSSL_CONF,則容許指定備用配置文件,它將被-config選項覆蓋(若是存在)。出於兼容性緣由,SSLEAY_CONF環境變量用於相同的用途,但不鼓勵使用它。

BUGS

  OpenSSL處理T61Strings(又名TeletexStrings)是壞的:它將它們視爲ISO-8859-1(拉丁文1),Netscape和MSIE具備類似的行爲。若是你須要的字符是PrintableStrings中不可用的字符,而且您不想使用或不能使用BMPStrings,則可能會致使問題。
  做爲T61String處理的結果,在OpenSSL中惟一正確的表示重音字符的方法是使用BMPString:不幸的是Netscape當前對這些字符進行調整。若是您必須使用Netscape和MSIE重音字符,那麼您當前須要使用無效的T61String格式。
   目前的提示不是很友好。它不容許您確認您剛剛輸入的內容。在配置文件中靜態定義了證書請求中的其餘擴展。其中一些:像subjectAltName中的電子郵件地址應由用戶輸入。

例子

//驗證證書請求
$openssl req -verify -in root.req -text -noout -pubkey -modulus -subject

//建立一個私鑰,並用其生成一個證書請求
$openssl genpkey -out rsa_pri.key -outform PEM -pass pass:123456 -aes-128-cbc \
-algorithm RSA -pkeyopt rsa_keygen_bits:1024

$openssl req -new -key rsa_pri.key -inform PEM -passin pass:123456 -out root.req -subj
/CN=china/OU=test/O=abc/CN=forxy

//等效於
$ openssl req -newkey rsa:1024 -keyout new_rsa_pri.key -outform PEM -passout pass:123456 -out root.req -subj /CN=china/OU=test/O=abc/CN=forxy

//產生一個自簽名的根證書,不提供私鑰
$openssl req -x509 -set_serial 10001 -days 10 -subj /CN=china -newkey rsa:1024 -keyout new_rsa_pri.pkey -outform PEM -passout pass:123456 -out root_new.cer -outform PEM

//產生一個自簽名的根證書,提供私鑰
$openssl req -x509 -set_serial 10001 -days 10 -key rsa_pri.pem -keyform PEM -passin pass:123456 -in root.req -inform PEM -out root.cer -outform PEM

//oid_file選項指定的文件
1.2.3.4 shortName A longer Name
1.2.3.6 otherName Other longer Name

//oid_section指定的文件
testoid1=1.2.3.5
testoid2=${testoid1}.6

//帶提示的配置文件
[ req ]
default_bits = 2048
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = v3_ca

dirstring_type = nobmp

[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = AU
countryName_min = 2
countryName_max = 2

localityName = Locality Name (eg, city)

organizationalUnitName = Organizational Unit Name (eg, section)

commonName = Common Name (eg, YOUR name)
commonName_max = 64

emailAddress = Email Address
emailAddress_max = 40

[ req_attributes ]
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20

[ v3_ca ]

subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
basicConstraints = CA:true

// 包含全部字段的配置文件

RANDFILE = $ENV::HOME/.rnd

[ req ]
default_bits = 2048
default_keyfile = keyfile.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
prompt = no
output_password = mypass

[ req_distinguished_name ]
C = GB
ST = Test State or Province
L = Test Locality
O = Organization Name
OU = Organizational Unit Name
CN = Common Name
emailAddress = test@email.address

[ req_attributes ]
challengePassword = A challenge password
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
2.3.2 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_hash] [-issuer_hash] [-ocspid] [-subject] [-issuer] [-nameopt option]
[-modulus] [-pubkey] [-fingerprint] [-alias] [-noout] [-trustout] [-clrtrust]
[-clrreject] [-addtrust arg][-addreject arg] [-setalias arg] [-days arg] [-set_serial n]
[-signkey filename] [-passin arg] [-x509toreq] [-req] [-CA filename] [-CAkey filename]
[-CAcreateserial] [-CAserial filename] [-force_pubkey key] [-text] [-certopt option]
[-C] [-md2|-md5|-sha1|-mdc2] [-clrext] [-extfile filename] [-extensions section]
[-engine id]
1
2
3
4
5
6
7
8
9
輸入,輸出和通常用途選項
-inform DER | PEM | NET— X509證書或證書請求的輸入格式, DER格式是證書的DER編碼,PEM是添加了頭部和尾部的DER編碼的base64編碼。 NET選項是一個晦澀的Netscape服務器格式,如今已通過時了。
-outform DER | PEM | NET——輸出格式,這些選項與-inform選項具備相同的含義。
in filename——若是未指定此選項,則從標準輸入讀取。
-out文件名——默認狀況下,它指定要寫入的輸出文件名或標準輸出。
-md2 | -md5 | -sha1 | -mdc2—— 摘要算法。 這會影響使用消息摘要的任何簽名或顯示選項,例如-fingerprint,-signkey和-CA選項。 若是未指定,則使用SHA1。 若是用於登陸的密鑰是DSA密鑰,則此選項不起做用:SHA1始終與DSA密鑰一塊兒使用。
-engine id—— 指定引擎。
顯示選項
注意:-alias和-purpose選項也是顯示選項,但在解釋在「信任設置」部分。
-text—— 以文本形式打印證書。輸出所有細節,包括公鑰,簽名算法,發行人和主題名稱,任何擴展名的序列號和任何信任設置。
-certopt——定製與-text一塊兒使用的輸出格式。選項參數能夠是單個選項或多個選項,以逗號分隔。可使用-certopt開關屢次設置多個選項。有關詳細信息,請參閱文本選項部分。
-noout——此選項可防止輸出編碼版本信息。
-pubkey——以PEM格式輸出證書的SubjectPublicKeyInfo。
-modulus——此選項打印證書中公鑰的模數值。
-serial——輸出證書序列號。
-subject_hash——輸出證書主題名稱的「哈希」。這在OpenSSL中用於造成索引,以容許按主題名稱查找目錄中的證書。
-issuer_hash——輸出證書頒發者名稱的「哈希」。
-ocspid——輸出主題名稱和公鑰的OCSP哈希值。
-hash——「-subject_hash」的同義詞,用於向後兼容性。
-subject_hash_old——使用OpenSSL版本1.0.0以前使用的舊算法輸出證書主題名稱的「散列」。
-issuer_hash_old—— 使用OpenSSL版本1.0.0以前使用的舊算法輸出證書頒發者名稱的「哈希」。
-subject——輸出證書的主題。
-issuer——輸出頒發者名稱。
-nameopt option——用於肯定主題或發行者名稱的顯示方式。選項參數能夠是單個選項或多個選項,以逗號分隔。-nameopt能夠被屢次使用以設置多個選項。有關詳細信息,請參閱「NAME OPTIONS」部分。
-email——輸出電子郵件地址(若是有)。
-ocsp_uri——輸出OCSP響應者地址(若是有)。
-startdate——打印證書的開始日期,即notBefore日期。
-enddate——打印證書的到期日期,即notAfter日期。
-dates——打印證書的開始和到期日期。
-checkend arg——檢查證書是否在下一個arg秒內到期,若是是,則返回非零,不然爲零。
-fingerprint——打印整個證書的DER編碼版本的摘要(請參閱摘要選項)。
-C——這將以C源文件的形式輸出證書。
可信設置——請注意,這些選項目前是實驗性的,可能會有所改變。
受信任的證書是普通證書,其中附有數個附加的信息,例如證書的許可和禁止使用以及「別名」。一般當證書被驗證時,至少有一個證書必須是「可信任的」。默認狀況下,受信任的證書必須在本地存儲,而且必須是根CA:任何以CA結尾的證書鏈可用於任何目的。目前的信任設置僅與根CA一塊兒使用。它們容許對根CA可使用的目的進行更精細的控制。例如,CA可能被信任爲SSL客戶端,但不能使用SSL服務器。 有關信任設置的含義的更多信息,請參閱verify實用程序的說明。將來版本的OpenSSL將會識別任何證書上的信任設置,不只僅是根CA。
-trustout——使x509輸出可信證書。能夠輸入普通或可信任的證書,但默認狀況下會輸出普通證書,並丟棄任何信任設置。使用-trustout選項,輸出可信證書。若是任何信任設置被修改,將自動輸出受信任的證書。
-setalias arg—— 設置證書的別名。 這將容許使用暱稱來引用證書,例如「Steve’s Certificate」。
-alias——輸出證書別名(若是有)。
-clrtrust——清除證書附加項裏全部有關用途容許的內容。
-clrreject——清除證書附加項裏全部有關用途禁止的內容。
-addtrust arg——添加證書附加項裏全部有關用途容許的內容。
-addreject arg——添加證書附加項裏全部有關用途禁止的內容。
-purpose——打印出證書附加項裏全部有關用途容許和用途禁止的內容。
簽名選項—— x509實用程序可用於簽署證書請求:所以它能夠像「迷你CA」同樣運行。
-signkey filename——私鑰文件。 若是輸入文件是證書,則將頒發者設置爲其主題名稱(即便其自簽名)將公鑰更改成提供的值,並更改開始和結束日期。開始日期設置爲當前時間,結束日期設置爲由-days選項肯定的值。除非提供了-clrext選項,不然將保留任何證書擴展名。若是輸入是證書請求,則使用提供的私鑰按照證書請求中的subject建立自簽名證書。(主要用於自簽名,與req程序中的-x509同樣)
-passin arg—— 私鑰口令。有關arg的格式的更多信息
-clrext——從證書中刪除任何擴展項。當從另外一個證書建立證書時使用此選項(例如使用-signkey或-CA選項)。一般全部的擴展都保留。
-keyform PEM | DER——指定-signkey選項中使用的私鑰文件的格式(DER或PEM)。
-days arg—— 指定使證書有效的天數。默認爲30天。
-x509toreq——將證書轉換爲證書請求。 -signkey選項用於傳遞所需的私鑰。
-req——默認-in輸入證書。使用此選項表示輸入的是證書請求。
-set_serial n——指定要使用的序列號。此選項可與-signkey或-CA選項一塊兒使用。若是與-CA選項結合使用,則不使用序列號文件(由-CAserial或-CAcreateserial選項指定)。 序列號能夠是十進制或十六進制(若是前面是0x)。也能夠指定負序列號,但不建議使用它們。
-CA filename——指定要用於簽名的CA證書。當此選項存在時,x509的行爲就像「迷你CA」。該CA使用此選項對輸入文件進行簽名:將其頒發者名稱設置爲CA的主題名稱,並使用CAs私鑰進行數字簽名。此選項一般與-req選項組合。沒有-req選項,輸入是必須是自簽名的證書。
-CAform PEM|DER ——指定CA證書的格式
-CAkey filename——設置CA私鑰以簽署證書。若是未指定此選項,則假定CA私鑰存在於CA證書文件中。
-CAkeyform PEM|DER——指定CA私鑰的格式
-CAserial filename——設置要使用的CA序列號文件,當-CA選項用於簽署證書時,它使用文件中指定的序列號。該文件包含一行偶數個十六進制數字。每次使用後,序列號將增長並再次寫入文件。默認文件名由附加了「.srl」的CA證書文件基礎名稱組成。例如,若是CA證書文件被稱爲「mycacert.pem」,則它但願找到一個名爲「mycacert.srl」的序列號文件。
-CAcreateserial——使用此選項,當CA序列號文件不存在時將被建立:它將包含序列號「02」,正在簽名的證書將具備1做爲其序列號。一般若是指定了-CA選項而且序列號文件不存在,則會出現錯誤。
-extfile filename—— 指定包含證書擴展項的文件名。若是沒有,那麼生成的證書將沒有任何擴展項。
-extensions section——指定要添加證書擴展項的section。 若是未指定此選項,則擴展名應包含在未命名(默認)部分中,默認部分應包含一個名爲「extensions」的變量,該變量包含要使用的部分。 有關擴展部分格式的詳細信息,請參閱x509v3_config手冊頁。
-force_pubkey key—— 當建立證書時,將其公鑰設置爲密鑰而不是證書或證書請求中的密鑰。 此選項對於建立證書,在算法沒法正常簽署請求時頗有用,例如DH。 可使用-keyform選項指定公鑰格式。
名稱選項——nameopt選項肯定主題和發行者的顯示方式。若是沒有nameopt開關,則使用與之前兼容的默認「oneline」格式。OpenSSL版本。每一個選項在下面詳細描述,全部選項均可以在前面加a -來關閉該選項。一般只會使用前四個。
compat——使用舊格式。這至關於沒有指定任何名稱選項。
RFC2253——至關於使用esc2253,esc_ctrl,esc_msb,utf8,dump_nostr,dump_unknown,dump_der,sep_comma_plus,dn_rev和sname 參數
oneline——一種比RFC2253更可讀的一行格式。至關於指定esc_2253,esc_ctrl,esc_msb,utf8,dump_nostr,dump_der,use_quote,sep_comma_plus_space,space_eq和sname選項。
multiline—— 多行格式。它等效於esc_ctrl,esc_msb,sep_multiline,space_eq,lname和align。
esc_2253——在字符串中轉義RFC2253所需的「特殊」字符,即+「<>;另外,在字符串的開頭的#和字符串開頭或結尾處的空格字符也要進行轉義。
esc_ctrl ——轉義控制字符。ASCII值小於0x20(空格)的字符和delete(0x7f)字符。它們使用RFC2253 中的\ XX符號進行轉義(其中XX是表示字符值的兩個十六進制數字)
esc_msb——轉義MSB集合字符,即ASCII值大於127。
use_quote—— 經過以引號圍繞整個字符串轉義一些字符,沒有選項時,全部的轉義都是用\字符完成的。
utf8——首先將全部字符串轉換爲UTF8格式。這是RFC2253所要求的。若是您有UTF8兼容終端,則使用此選項(而不是設置esc_msb)可能會讓多字節(國際)字符的正確顯示。此選項不存在,則大於0xff的多字節字符將使用格式\ UXXXX(16位)和\ WXXXXXXXX(32位)來表示。此外,若是此選項關閉,任何UTF8Strings將首先轉換爲其字符形式。
ignore_type——此選項不會以任何方式嘗試解釋多字節字符。這就是他們的內容八位字節只是被轉儲,就像一個八位位組表明每一個字符同樣。這對於診斷目的是有用的,但會致使至關奇怪的輸出。
show_type——顯示ASN1字符串的類型。該類型位於字段內容以前。例如「BMPSTRING:Hello World」。
dump_der——當設置此選項時,須要使用hexdumped的任何字段將使用字段的DER編碼進行轉儲。不然只會顯示內容八位字節。兩種選項都使用RFC2253 #XXXX …格式。
dump_nostr——轉儲非字符串類型(例如OCTET STRING),若是未設置此選項,則將顯示非字符串類型,由於每一個內容字節表示單個字符。
dump_all——轉儲全部字段。當與dump_der一塊兒使用時,該選項容許明確地肯定結構的DER編碼。
dump_unknown——轉儲OpenSSL沒法識別OID的任何字段。
sep_comma_plus, sep_comma_plus_space, sep_semi_plus_space, sep_multiline—— 這些選項決定了字段分隔符。第一個字符在RDN之間,而第二個是多個AVA之間(多個AVA很是罕見,而且不鼓勵使用它們)。以「空格」結尾的選項還會在分隔符以後放置一個空格,使其更易於閱讀。 sep_multiline對RDN分隔符使用換行字符,併爲AVA分隔符使用間隔的+。它還將字段縮小四個字符。若是沒有指定字段分隔符,則默認使用sep_comma_plus_space。
dn_rev——反轉DN的字段。 這是RFC2253所要求的。 做爲反作用,這也反轉了多個AVA的順序,但這是容許的。
nofname,sname,lname,oid—— 這些選項會改變字段名稱的顯示方式。
nofname根本不顯示字段。
sname使用「短名稱」表單(例如,用於commonName的CN)。
lname使用長格式。
oid以數字形式表示OID,可用於診斷目的。
align——調整字段值以得到更可讀的輸出。 僅適用於sep_multiline。
space_eq——在字段名後面的=字符上放置空格。
文本選項 ——除了自定義name輸出格式,還能夠在文本選項存在時自定義使用certopt選項打印的實際字段。默認行爲是打印全部字段
compatible—— 使用舊格式。這至關於完​​全沒有指定輸出選項。
no_header——不要打印頭信息:只打印「證書」和「數據」的行。
no_version——不要打印出版本號。
no_serial——不要打印出序列號。
no_signame——不打印出使用的簽名算法。
no_validity—— 不打印有效日期,那就是notBefore和notAfter字段
no_subject——不打印主題名稱
no_issuer——不要打印出頒發者
no_pubkey—— 不要打印出公鑰
no_sigdump——不要給出證書籤名的十六進制dump
no_aux—— 不要打印證書信任信息
no_extensions——不要打印任何X509V3擴展。
ext_default—— 保留默認擴展行爲:嘗試打印不支持的證書擴展名
ext_error——打印不支持的證書擴展的錯誤消息
ext_parse—— ASN1解析不受支持的擴展
ext_dump—— 十六進制轉儲不支持擴展
ca_default—— ca實​​用程序使用的值,至關於no_issuer,no_pubkey,no_header,no_version,no_sigdump和no_signame。
注意
PEM格式使用頭部和尾部:
—–BEGIN CERTIFICATE—–
—–END CERTIFICATE—–
它還將處理包含的文件:
—–BEGIN X509 CERTIFICATE—–
—–END X509 CERTIFICATE—–
可信任的證書有如下行:
—–BEGIN TRUSTED CERTIFICATE—–
—–END TRUSTED CERTIFICATE—–
使用nameopt選項轉爲UTF8格式的假定T61Strings使用ISO8859-1字符集。 雖然這是錯誤的,但Netscape和MSIE都是作許多證書。 因此儘管這是不正確的,但更有可能正確顯示大多數證書。
-fingerprint選項使用DER編碼證書的摘要。 這一般被稱爲「指紋」。 因爲消息摘要的性質,證書的指紋對於該證書是惟一的,而且具備相同指紋的兩個證書能夠被認爲是相同的。
Netscape指紋使用MD5,而MSIE使用SHA1。
-email選項搜索主題名稱和主題備用名稱擴展名。 只會打印出惟一的電子郵件地址:它不會屢次打印相同的地址。
證書擴展項
-purpose選項檢查證書擴展項,並肯定可使用的擴展項。完成的實際檢查至關複雜,包括處理破壞的證書和軟件的各類黑客和解決方法。在證書鏈中,當驗證不信任的證書也將使用一樣的代碼。由於這個字段對驗證代碼已經拒絕了的證書鏈來講很是有用。
basicConstraints擴展CA標誌用於肯定證書是否能夠用做CA。若是CA標誌爲真,那麼它是CA,若是CA標誌爲false,那麼它不是CA。全部CA應該將CA標誌設置爲true。 若是basicConstraints擴展名不存在,則證書被認爲是「可能的CA」,根據證書的預期用途檢查其餘擴展項。在這種狀況下會發出警告,由於證書實際上不該被視爲CA:可是它被容許做爲CA來解決一些破壞的軟件。若是證書是V1證書(所以沒有擴展名),而且它是自簽名的,它也被認爲是CA,可是再次給出警告:這是爲了解決Verisign根的問題,這是V1自簽名證書。 若是keyUsage擴展項存在,則對證書的使用做出額外限制。若是存在keyUsage擴展項,CA證書必須設置keyCertSign位。若是擴展密鑰用法存在,則附加的約束將會做用到該證書上。若是擴展密鑰用法存在,密鑰僅僅可以用於指定的證書用途。 如下給出了每一個測試的完整描述。關於basicConstraints和keyUsage和V1證書的註釋適用於全部CA證書。
SSL Client ——擴展密鑰用法必須不存在或包含「web client authentication」OID值。密鑰用法必須不存在或者必需要設置digitalSignature字節。Netscape類型必須不存在或者必需要設置SSL Client字節。
SSL Client CA—— 擴展密鑰用法擴展項必須不存在,或包括「Web客戶端認證」OID。 Netscape證書類型必須不存在,或者必須設置SSL CA位:若是basicConstraints擴展名不存在,則將其用做一個工做。
SSL Server——擴展密鑰用法必須不存在或包含「web server authentication」OID值。密鑰用法必須不存在或者必須有digitalSignature,keyEncipherment設置或者二者都要設置。Netscape類型必須不存在或者必需要設置SSL Server字節。
SSL Server CA——擴展密鑰用法必須不存在或包含「web server authentication」OID值。Netscape類型必須不存在或者必需要設置SSL Server字節:若是basicConstraints額外信息不存在,它將會使用。
Netscape SSL Server若是密鑰用法存在,Netscape格式的SSL 客戶端必需要有keyEncipherment字節被設置後才能鏈接到服務器。這個選項不是有效的由於一些算法套件要用密鑰進行數字簽名。要否則就和普通的SSL Server同樣。
Common S/MIME Client Tests——擴展密鑰用法必須不存在或包含「email protection」OID值。Netscape類型必須不存在或者必需要設置S/MIME字節。若是在Netscape 格式證書中,S/MIME字節沒有被設置,SSL client字節將會默許做爲一個可供選擇。可是一個警告將會顯示:這是由於一些證書沒有設置S/MIME字節。
S/MIME Signing——若是該擴展密鑰用法存在,則普通的S/MIME客戶端必須設置digitalSignature字節。
S/MIME Encryption——若是該擴展密鑰用法存在,則普通的S/MIME客戶端必須設置keyEncipherment字節。
S/MIME CA——擴展密鑰用法必須不存在或包含「email protection」OID值。Netscape類型必須不存在或者必需要設置S/MIME CA字節:若是basicConstraints額外信息不存在,它將會使用。
CRL Signing——擴展密鑰用法必須不存在或或者必需要設置CRL signing字節。
CRL Signing CA——普通CA測試申請。
BUGs:
證書中的擴展不會轉發到證書請求中,反之亦然。
在某些狀況下,有可能經過指定錯誤的私鑰或使用不一致的選項來生成無效的證書或請求:應該檢查這些證書或請求。
應該有明確設置開始和結束日期的選項,而不是與當前時間的偏移。
目前正在開發實施TRUST SETTINGS中描述的驗證行爲的代碼。 所以,它描述了預期的行爲,而不是當前的行爲。 但願它在OpenSSL 0.9.5及更高版本中表明現實。
例子
//自簽證書
$openssl x509 -req -signkey rsa_pri.key -keyform PEM -passin pass:123456 -in root.req -inform PEM -out root.cer -outform PEM

//簽發用戶證書
$openssl x509 -req -set_serial 00001 -days 100 -CA root.cer -CAform PEM -CAkey rsa_pri.key -CAkeyform PEM -passin pass:123456 -in user.req -inform PEM -out user.cer -outform PEM

//解析證書完整信息
$openssl x509 -in user.cer -inform PEM -text -noout

//查看證書指定信息
$openssl x509 -in user.cer -inform PEM -noout -pubkey -modulus -serial -subject -issuer -email -startdate -enddate -dates -fingerprint -subject_hash -issuer_hash -subject_hash_old -issuer_hash_old

//以C源碼輸出證書
$openssl x509 -in user.cer -inform PEM -out user.infor -C

//轉換證書格式
$openssl x509 -in user.cer -inform PEM -out user.der -outform DER
//查看證書用途
$openssl x509 -purpose -noout -in user.cer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2.3.3 verify
  用於驗證證書鏈。

openssl verify [-CApath directory] [-CAfile file] [-purpose purpose] [-policy arg]
[-crl_check] [-crl_check_all] [-policy_check] [-explicit_policy] [-inhibit_any] [-inhibit_map] [-x509_strict][-extended_crl] [-use_deltas] [-policy_print] [-no_alt_chains] [-untrusted file] [-help] [-issuer_checks] [-trusted file] [-verbose] [-] [certificates]
1
2
2.4 PKI
2.4.1 pkcs7
  pkcs7處理DER或者PEM格式的pkcs#7文件

openssl pkcs7 [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-out filename]
[-print_certs] [-text] [-noout] [-engine id]
1
2
-inform PEM|DER:輸入文件格式
-outform DER|PEM:輸出文件格式,DER或者PEM格式。
-in filename:輸入的須要處理的文件,默認爲標準輸入。
-out filename:輸出文件,默認爲標準輸出。
-print:打印出pkcs7的全部信息值。
-print_certs:打印文件中的證書或CRL信息,在一行中打印出持有者和頒發者。
-text:打印證書相關信息。
-noout:不打印證書編碼版本信息。
-engine id:指定引擎。
注意:
The PEM PKCS#7 format uses 頭部和尾部:

-----BEGIN PKCS7-----
-----END PKCS7-----
1
2
還有一種可兼容的格式:

-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
1
2
例子
//把一個PKCS#7文件從PEM格式轉換成DER格式:
$openssl pkcs7 -in pk7.pem -outform DER -out pk7.der

//打印文件全部證書
$openssl pkcs7 -in pk7.pem -print_certs -out certs.pem
1
2
3
4
5
2.4.2 pkcs8
  pkcs8命令處理PKCS#8格式的私鑰。它可使用各類PKCS#5(v1.5和v2.0)和PKCS#12算法來處理未加密的 PrivateKeyInfo格式的和已加密的PrivateKeyInfo格式 的PKCS#8。

openssl pkcs8 [-topk8] [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg]
[-out filename] [-passout arg] [-noiter] [-nocrypt][-nooct] [-embed] [-nsdb] [-v2 alg]
[-v2prf alg] [-v1 alg] [-engine id]
1
2
3
-topk8——默認輸入PKCS#8私鑰,輸出傳統格式私鑰。使用-topk8選項,狀況相反:它讀取傳統的格式私鑰,輸出一個PKCS#8格式的密鑰。
-inform PEM|DER——輸入私鑰文件的格式
-outform PEM|DER——輸出撕咬的格式
-in filename——輸入的私鑰文件名
-passin arg——輸入私鑰口令
-out filename——輸出私鑰文件名
-passout arg——輸出私鑰口令
-noiter——MAC保護計算次數爲1
-nocrypt——輸入或者輸出pkcs8默認是加密的,使用此選型不加密
-nooct——此選項以某種軟件使用的損壞格式生成RSA私鑰。具體來講,私鑰應該包含在OCTET STRING中,可是一些軟件只包含結構自己,而不須要周圍的OCTET STRING。
-embed——此選項以損壞的格式生成DSA密鑰。 DSA參數嵌入在PrivateKey結構中。在這種形式下,OCTET STRING包含一個由兩個結構組成的ASN1 SEQUENCE:一個包含參數的SEQUENCE和一個包含私鑰的ASN1 INTEGER。
-nsdb—— 此選項用Netscape私鑰數據兼容的損壞格式生成DSA密鑰。 PrivateKey分別包含由公鑰和私鑰組成的SEQUENCE。
-v2 alg—— 此選項可使用PKCS#5 v2.0加密算法。一般PKCS#8私鑰使用基於口令的加密算法加密,稱爲pbeWithMD5AndDES-CBC,它使用56位DES加密,是PKCS#5 v1.5中最強大的加密算法。使用-v2選項指定使用PKCS#5 v2.0算法,這可使用任何加密算法,例如168位三重DES或128位RC2,可是尚未不少應用支持PKCS#5 v2.0。若是您只是使用OpenSSL私鑰,那麼這並不重要。alg參數是要使用的加密算法,有效值包括des,des3和rc2。 建議使用des3。
-v2prf alg—— 此選項將PRF算法設置爲與PKCS#5 v2.0一塊兒使用。 一個典型的值是hmacWithSHA256。 若是未設置此選項,則使用默認值,若是沒有默認值,則使用hmacWithSHA1。
-engine id—— 引擎
-v1 alg——此選項指定要使用的PKCS#5 v1.5或PKCS#12算法。 下面列出了可能的算法的完整列表。

PBE-MD2-DES PBE-MD5-DES——這些算法被包含在原始的PKCS#5 v1.5規範中。他們只提供56位保護,由於它們都使用DES。
PBE-SHA1-RC2-64 PBE-MD2-RC2-64 PBE-MD5-RC2-64 PBE-SHA1-DES——這些算法在原始PKCS#5 v1.5規範中沒有說起,可是它們使用相同的密鑰導出算法,並被一些軟件支持。它們在PKCS#5 v2.0中被說起。它們使用64位RC2或56位DES。
PBE-SHA1-RC4-128 PBE-SHA1-RC4-40 PBE-SHA1-3DES PBE-SHA1-2DES PBE-SHA1-RC2-128 PBE-SHA1-RC2-40——這些算法使用基於PKCS#12密碼的加密算法,並容許使用諸如三重DES或128位RC2的強加密算法。
注意

PEM編碼PKCS#8文件的加密形式使用以頭部和尾部:
—–BEGIN ENCRYPTED PRIVATE KEY—–
—–END ENCRYPTED PRIVATE KEY—–
未加密的使用:
—–BEGIN PRIVATE KEY—–
—–END PRIVATE KEY—–

使用PKCS#5 v2.0算法和高迭代次數加密的私鑰比那些使用傳統SSLeay兼容格式加密的私鑰更安全。所以,若是安全性被認爲是重要的,則應轉換密鑰。

默認加密只有56位,由於這是PKCS#8的大多數當前實現將支持的加密。
某些軟件可能使用pkcs#12加密算法的PKCS#8格式私鑰:這些是自動處理的,但沒有選項生成它們。
能夠輸出DER編碼的PKCS#8格式私鑰,由於加密細節包含在ASN1級別,而傳統格式包括它們在PEM級別。
標準

來自該PKCS#5 v2.0實現的測試向量使用三重DES,DES和RC2以較高的迭代計數發佈到pkcs-tng郵件列表,有幾我的確認他們能夠解密所生成的私鑰,所以能夠認爲 至少在這些算法方面,PKCS#5 v2.0的實現是至關準確的。
PKCS#8 DSA(和其餘)私鑰的格式沒有很好的記錄:它被隱藏在PKCS#11 v2.01,第11.9節。 OpenSSL的默認DSA PKCS#8私鑰格式符合本標準。
BUGS
應該有一個選項,打印出使用的加密算法和其餘細節,如迭代計數。
PKCS#8使用三重DES和PKCS#5 v2.0應該是OpenSSL的默認私鑰格式:爲了兼容性,幾個實用程序目前使用舊格式。
例子
//pkcs#1私鑰生成pkcs8的私鑰
$openssl pkcs8 -topk8 -in rsa_pri.key -inform PEM -passin pass:123456 -out rsa_pri.pk8 -outform PEM -passout pass:123456 -v2 des3
//pkcs8的私鑰生成pkcs#1私鑰
$openssl pkcs8 -in rsa_pri.pk8 -inform PEM -passin pass:123456 -out rsa_pri.key -outform PEM -passout pass:123456 -v2 des3
1
2
3
4
2.4.3 pkcs12
pkcs12工具,能生成和分析pkcs12,也叫pfx文件。PKCS#12文件能夠被用於多個程序,例如包含Netscape、 MSIE 和 MS Outlook。

openssl pkcs12 [-export] [-chain] [-inkey filename] [-certfile filename] [-name name]
[-caname name] [-in filename] [-out filename] [-noout] [-nomacver] [-nocerts] [-clcerts]
[-cacerts] [-nokeys] [-info]
[-des | -des3 | -idea | -aes128 | -aes192 | -aes256| -camellia128 | -camellia192 | -camellia256 | -nodes]
[-noiter] [-maciter | -nomaciter | -nomac][-twopass] [-descert] [-certpbe cipher]
[-keypbe cipher] [-macalg digest] [-keyex] [-keysig] [-password arg] [-passin arg]
[-passout arg] [-rand file(s)][-CAfile file] [-CApath dir] [-CSP name]
1
2
3
4
5
6
7
這裏有許多選項,默認狀況下pkcs12用於解析pkcs12文件,使用-export選項能夠建立一個PKCS#12文件
解析選項
-in filename——指定輸入的pkcs12文件,不指定則從標準輸入
-out filename——指定輸出的證書或私鑰文件,不指定則爲標準輸出,只能時PEM格式
-passin arg——輸入的pkcs12文件的口令
-passout arg——輸出的口令
-password arg——和-export一塊兒使用時等同於 -passout,不然等同於-passin
-noout——禁止在將私鑰和證書輸出爲pkcs12時,顯示編碼版本信息
-clcerts—— 只輸出客戶端證書(而不是CA證書)
-cacerts——只輸出CA證書(不是客戶端證書)。
-nocerts—— 不會輸出任何證書。
-nokeys ——不輸出私鑰。
-info——輸出有關PKCS#12文件結構,使用的算法和迭代計數等附加信息。
-des | -des3 | -idea | -aes128 | -aes192 | -aes256| -camellia128 | -camellia192 | -camellia256 輸出私鑰的加密方式
-nodes——根本不加密私鑰。
-nomacver——在讀取文件以前,不要嘗試驗證MAC完整性。
-twopass——提示單獨的完整性密碼和加密密碼:大多數軟件老是假定都是同樣的,因此這個選項會使這樣的PKCS#12文件不可讀。
文件建立選項
-export——此選項指定PKCS#12文件將被建立而不是解析。
-out filename—— 這指定將PKCS#12文件輸出的文件名。默認使用標準輸出。
-in filename——輸入的證書和私鑰的文件名,默認爲標準輸入。他們都必須是PEM格式。順序可有可無,但應有一個私鑰及其相應的證書。若是存在其餘證書,它們也將被包含在PKCS#12文件中。
-inkey filename——指定讀取私鑰的文件。若是不存在,則私鑰必須存在於輸入文件中。
-name friendlyname——這指定了證書和私鑰的「友好名稱」。該名稱一般經過軟件導入文件顯示在列表框中。
-certfile filename——從其中讀取其餘證書的文件名。
-caname friendlyname—— 這爲其餘證書指定了「友好名稱」。能夠屢次使用此選項以按照它們顯示的順序爲全部證書指定名稱。 Netscape忽略其餘證書上的友好名稱,而MSIE顯示它們。
-pass arg, -passout arg——輸出的pkcs12文件的口令
-passin password——輸入的私鑰的口令
-chain—— 若是此選項存在,則嘗試包括用戶證書的整個證書鏈。標準CA store 用於此搜索。若是搜索失敗,則被認爲是致命的錯誤。
-descert——使用三重DES加密證書,這可能會致使PKCS#12文件沒法讀取某些「導出等級」軟件。默認狀況下,私鑰使用三重DES加密,證書使用40位RC2加密。
-keypbe alg,-certpbe alg——這些選項容許指定加密私鑰和證書的算法。可使用任何PKCS#5 v1.5或PKCS#12 PBE算法名稱。若是指定了一個密碼名稱(如list-cipher-algorithms命令的輸出),那麼它與PKCS#5 v2.0一塊兒使用。爲了實現互操做性,建議只使用PKCS#12算法。
-keyex|-keysig——指定私鑰用於密鑰交換或只是簽名。 此選項僅由MSIE和相似的MS軟件解釋。 一般,「出口等級」軟件只容許512位RSA密鑰用於加密目的,但用於簽名的任意長度密鑰。 -keysig選項標記僅用於簽名的鍵。 只能簽名密鑰可用於S / MIME簽名,Authenticode(ActiveX控件簽名)和SSL客戶端身份驗證,但只有MSIE 5.0及更高版本的才支持使用僅簽名密鑰進行SSL客戶端身份驗證。
-macalg digest—— 指定MAC摘要算法。 默認使用SHA1。
-nomaciter,-noiter——這些選項會影響MAC和密鑰算法的迭代次數。除非您但願生成與MSIE 4.0兼容的文件,不然您應該不使用這些選項。爲了阻止經過使用大量經常使用密碼的字典來攻擊,從密碼導出密鑰的算法可能會使用迭代計數:這會致使算法的某一部分被重複並減慢。 MAC用於檢查文件的完整性,可是因爲它一般具備與密鑰和證書相同的密碼,所以它也可能被攻擊。默認狀況下,MAC和加密迭代計數都設置爲2048,使用這些選項能夠將MAC和加密迭代計數設置爲1,這將減小文件的安全性,除非您真的必須使用這些選項。大多數軟件支持MAC和密鑰迭代計數。 MSIE 4.0不支持MAC迭代計數,所以須要-nomaciter選項。
-maciter——此選項以是爲了與之前的版本兼容,之前須要使用MAC迭代計數,但如今默認狀況下它們已被使用。
-nomac——不要嘗試提供MAC完整性。
-rand file(s)——指定隨機數種子文件,或者EGD套接字的隨機數據的文件,多個文件間用分隔符分開,windows用「;」,OpenVMS用「,「,其餘系統用「:」
-CAfile file—— CA存儲爲文件。
-CApath dir——CA存儲爲目錄。此目錄必須是標準證書目錄:這是每一個主題名稱的哈希(使用x509 -hash)應連接到每一個證書。
-CSP name——將名稱寫爲Microsoft CSP名稱。
注意
雖然有不少選項,但大多數選項不多使用。對於僅PKCS#12文件解析,-in和-out須要用使用,對於PKCS#12文件建立,-export和-name也要使用。
若是不存在-cacerts,-cacerts或-nocerts選項,則全部證書將按照它們在輸入PKCS#12文件中顯示的順序輸出。不能保證第一個證書是與私鑰對應的證書。某些軟件須要私鑰和證書並假定文件中第一個證書是與私鑰相對應:這可能並不是老是如此。使用-clcerts選項將經過僅輸出與私鑰對應的證書來解決此問題。若是須要CA證書,則可使用-nokeys -cacerts選項將其輸出到單獨的文件,以便輸出CA證書。
-keypbe和-certpbe算法容許指定私鑰和證書的精確加密算法。 一般,默認值是正常的,可是偶爾軟件不能處理三重DES加密的私鑰,那麼選項-keypbe PBE-SHA1-RC2-40能夠用於將私鑰加密減小到40位RC2。 全部算法的完整描述包含在pkcs8手冊頁中。
BUGS
有些人會認爲PKCS#12標準是一個大錯誤
在0.9.6a以前的OpenSSL版本在PKCS#12密鑰生成中有錯誤。在極少的狀況下,這可能會產生一個使用無效密鑰加密的PKCS#12文件。所以,一些從其餘應用(MSIE或Netscape)觸發這個錯誤的PKCS#12文件沒法被OpenSSL解密,而且OpenSSL也可能產生不能被其餘應用解密的PKCS#12文件。生成這樣的文件的機會相對較小:256個不到1個。
修復這個錯誤的反作用是任何舊的無效加密的PKCS#12文件不能再被固定版本解析。在這種狀況下,pkcs12實用程序會報告MAC是否正常,可是在提取私鑰時會出現解密錯誤。
經過使用較早版本的OpenSSL從PKCS#12文件中提取私鑰和證書,並使用較新版本的OpenSSL從密鑰和證書中從新建立PKCS#12文件,能夠解決此問題。例如:
old-openssl -in bad.p12 -out keycerts.pem
openssl -in keycerts.pem -export -name「個人PKCS#12文件」-out fixed.p12
1
2
例子
$openssl pkcs12
1
2.5 工具類
2.5.1 smime
   smime命令處理S / MIME郵件。它能夠加密,解密,簽名和驗證S / MIME消息

openssl smime [-encrypt] [-decrypt] [-sign] [-resign] [-verify] [-pk7out] [-[cipher]] [-in file] [-no_alt_chains] [-certfile file] [-signer file] [-recip file] [-inform SMIME|PEM|DER] [-passin arg] [-inkey file] [-out file] [-outform SMIME|PEM|DER] [-content file] [-to addr] [-from ad] [-subject s] [-text] [-indef] [-noindef] [-stream] [-rand file(s)] [-md digest] [cert.pem]...12345命令選項——有六個操做選項能夠設置要執行的操做類型。其餘選項的含義因操做類型而異 -encrypt—— 加密指定收件人證書的郵件。輸入文件是要加密的消息。輸出文件是MIME格式的加密郵件。-decrypt—— 使用提供的證書和私鑰解密郵件。輸入文件的是MIME格式的加密郵件消息。解密的郵件被寫入到輸出文件。-sign——使用提供的證書和私鑰簽名。輸入文件是要簽名的消息。 MIME格式的簽名消息將寫入到輸出文件。-verify——驗證簽名郵件。指望輸入的簽名郵件消息並輸出簽名數據。支持明文和不透明簽名。-pk7out——輸入消息並寫出PEM編碼的PKCS#7結構。-resign——利用已有的消息或者一個或多個簽名者從新簽名。-in filename——要加密或簽名的輸入消息或要解密或驗證的MIME消息。-inform SMIME|PEM|DER——這指定了PKCS#7結構的輸入格式。默認值爲SMIME,它讀取S / MIME格式的消息。 指定PEM和DER以讀取PEM和DER格式PKCS#7結構。這當前隻影響PKCS#7結構的輸入格式,若是沒有輸入PKCS#7結構(例如使用-encrypt或-sign),則此選項不起做用。-out filename——輸出的已解密或驗證的消息文本或已簽名或加密的MIME格式消息。-outform SMIME|PEM|DER—— 這指定了PKCS#7結構的輸出格式。默認是SMIME,它寫入一個S / MIME格式的消息。 PEM和DER格式更改成輸出PEM和DER格式PKCS#7結構。這當前隻影響PKCS#7結構的輸出格式,若是沒有輸出PKCS#7結構(例如使用-verify或-decrypt),則此選項不起做用。-stream -indef ——-stream和-indef選項是等效的,啓用用於編碼操做的流I / O。這容許數據的單次處理,而不須要將整個內容保存在內存中,可支持很是大的文件。若是輸出格式爲SMIME,則默認狀況下,全部其餘操做都關閉流,S / MIME簽名將自動設置爲流。-noindef——在產生不定長度構造的編碼時禁用流IO。 此選項目前無效。 在未來流式傳輸將在全部相關操做上默認啓用,此選項將禁用它。-content filename—— 這指定一個包含分離的內容的文件,這僅對-verify命令有用。 這僅在PKCS#7結構使用不包含內容的分離簽名格式纔可用。 若是輸入格式爲S / MIME,則此選項將覆蓋任何內容,並使用多部分/已簽名的MIME內容類型。-text—— 若是加密或簽名,此選項會將明文的(文本/純文本)MIME頭部添加到提供的消息中。 若是解密或驗證它剝離明文頭部:若是解密或已驗證的消息不是MIME類型text / plain,則會發生錯誤。-CAfile file—— 包含受信任的CA證書的文件,僅與-verify一塊兒使用。-CApath dir—— 包含受信任的CA證書的目錄,僅與-verify一塊兒使用。此目錄必須是標準證書目錄:這是每一個主題名稱的哈希(使用x509 -hash)應連接到每一個證書。-md digest——在簽名或辭職時使用的摘要算法。若是不存在,那麼將使用默認摘要算法簽名(一般是SHA1)。-[cipher]——使用加密算法。例如,DES(56位) -des,三重DES(168位)-des3,EVP_get_cipherbyname()函數)也能夠在破折號以前使用,例如-aes_128_cbc。請參閱OpenSSL支持的密碼列表。若是未指定,則使用三重DES。僅用於-encrypt。-nointern—— 當驗證消息時,一般將搜索包含在消息中的簽名證書。使用此選項,只會使用-certfile選項中指定的證書。可是,提供的證書仍然能夠用做不可信CA。-noverify—— 不要驗證簽名信息的簽名者證書。-nochain——不要對簽名者證書進行證書鏈驗證:不要將簽名的郵件中的證書做不可信CAs。-nosigs——不要嘗試驗證郵件上的簽名。-nocerts——當簽名的時候不包含簽名者的證書信息值,默認是要包含的,這將減小簽名消息的大小,但驗證者必須具備本地可用的簽名者證書的副本(例如使用-certfile選項傳遞)。-noattr——一般當消息被簽名時,應包括一組屬性,其中有簽名時間和支持的對稱算法。使用此選項,它們不包括在內。-binary——一般,輸入消息被轉換爲「規範」格式,其按照S / MIME規範的要求使用CR和LF做爲行尾。當此選項存在時,不會發生轉換。這在處理可能不是MIME格式的二進制數據時頗有用。-nodetach——簽名時使用不透明的簽名:此格式更能抵抗郵件中繼的翻譯,但不能由不支持S / MIME的郵件代理讀取。若是沒有此選項,則使用MIME類型multipart / signed進行明文簽名。-certfile file——容許指定其餘證書。當簽名這些證書將包含在消息中。當驗證這些將搜索簽署者證書。證書應採用PEM格式。-signer file——在簽名或者從新簽名時的簽名證書,若是須要多個簽名者,該選項能夠屢次使用。 若是正在驗證消息,則驗證成功後,簽名者證書將被寫入該文件。-recip file——解密消息時的收件人證書。 此證書必須與消息的一個收件人匹配,不然發生錯誤。-inkey file—— 簽名或解密時使用的私鑰。 這必須匹配相應的證書。 若是未指定此選項,則私鑰必須包含在使用-recip或-signer文件指定的證書文件中。 簽名時,能夠屢次使用此選項來指定連續的私鑰。-passin arg——私鑰口令-rand file(s)——指定隨機數種子文件,或者EGD套接字的隨機數據的文件,多個文件間用分隔符分開,windows用「;」,OpenVMS用「,「,其餘系統用「:」cert.pem…——一個或多個郵件收件人證書:在加密郵件時使用。-to, -from, -subject——相關郵件標題。 這些包含在消息的簽名部分以外,能夠手動包含它們。 若是簽名,那麼許多S / MIME郵件客戶端會檢查簽名者證書的電子郵件地址是否匹配,在From:address中指定。-purpose, -ignore_critical, -issuer_checks, -crl_check, -crl_check_all, -policy_check, -extended_crl, -x509_strict, -policy -check_ss_sig -no_alt_chains——設置證書鏈驗證的各類選項。 詳見驗證手冊頁。注意 發送MIME消息必須在標頭和輸出之間沒有任何空白行。某些郵件程序會自動添加一個空行。將郵件直接發送到sendmail是實現正確格式的一種方式。提供的要簽名或加密的消息必須包含必需的MIME頭部,不然許多S / MIME客戶端不會正確顯示(若是有的話)。您可使用-text選項自動添加純文本標題。「簽名而且加密」消息是一個已簽名且被加密的消息。這能夠經過加密已經簽名的消息來生成:參見示例部分。該版本的程序只容許每一個消息一個簽名者,但它將驗證接收到的消息的多個簽名者。某些S / MIME客戶端若是消息包含多個簽名者,則會阻塞。經過簽名已經簽名的消息能夠並行地簽署消息。選項-encrypt和-decrypt反映S / MIME客戶端中的常見用法。嚴格來講,者用於處理PKCS#7信封數據:PKCS#7加密數據用於其餘目的。-resign選項在添加新簽名者時使用現有的消息摘要。這意味着屬性至少必須存在於使用相同消息摘要的一個現有簽名者中,不然此操做將失敗。-stream和-indef選項支持實驗流I / O支持。所以,編碼是使用不肯定長度構造的BER編碼而再也不是DER。若是內容未分離,則-encrypt操做和-sign操做支持流式傳輸。Streaming始終用於具備分離數據的-sign操做,可是內容再也不是PKCS#7結構的一部分,而編碼仍然是DER。退出代碼 0——操做徹底成功。1——解析命令選項發生錯誤。2——其中一個輸入文件沒法讀取。3——建立PKCS#7文件或讀取MIME消息時發生錯誤。4——解密或驗證消息時發生錯誤。5——消息已正確驗證,但寫入簽名者證書時出現錯誤。bug MIME解析器不是很聰明:它彷佛處理了我拋出的大多數消息,但它可能會阻礙別人。當前只會將簽名者的證書寫入文件:若是簽名者具備單獨的加密證書,則必須手動提取。理想狀況下,應保留每一個電子郵件地址的證書的數據庫代碼當前沒有注意SMIMECapabilities signed屬性中提供的容許的對稱加密算法。 這意味着用戶必須手動包括正確的加密算法。 它應該將容許的密碼列表存儲在數據庫中,並使用它們。簽名人的證書不進行吊銷檢查。當前的代碼只能處理S / MIME v2消息,更復雜的S / MIME v3結構可能會致使解析錯誤。例子1  聲明:OpenSSL之命令行詳解是根據盧隊長髮布在https://blog.csdn.net/as3luyuan123/article/details/16105475的系列文章整理修改而成,我本身所作的工做主要是針對新的1.0.2版本進行驗證,修改錯別字,和錯誤,從新排版,以及整理分類,配圖。 未經做者容許,嚴禁用於商業出版,不然追究法律責任。網絡轉載請註明出處,這是對原創者的起碼的尊重!!!--------------------- 原文連接:https://blog.csdn.net/liao20081228/article/details/77159039

相關文章
相關標籤/搜索