1. 程式人生 > 實用技巧 >openssl 使用命令幫助

openssl 使用命令幫助

Openssl命令總覽

語法格式:
openssl command [ command_opts ] [ command_args ]

常用command:

  version  用於檢視版本資訊

  enc    用於加解密

  ciphers   列出加密套件

  genrsa   用於生成私鑰

  rsa    RSA密碼管理

  req    生成證書籤名請求(CSR)

  crl    證書吊銷列表(CRL) 管理

  ca    CA管理(例如對證書進行簽名)

  dgst   生成資訊摘要

  rsautl  用於完成RSA簽名、驗證、加密和解密功能

  passwd  生成雜湊密碼

  pkey   命令處理公鑰或私鑰。它們可以在各種形式之間進行轉換,並將其結構打印出來。 

  rand    生成偽隨機數

  speed    用於測試加解密速度

  s_client  通用的SSL/TLS客戶端測試工具

  X509    X.509證書管理

  verify   X.509證書驗證

  pkcs7    PKCS#7協議資料管理

OpenSSL命令 --version:

語法

openssl version [-a] [-v] [-b] [-o] [-f] [-p] [-d]

-a:列印所有資訊。
-v:僅列印版本資訊
-b:列印當前版本構建的日期
-o:庫構建時的相關資訊
-f:編譯引數 -p:平臺資訊 -d: 列出openssl的安裝目錄

OpenSSL命令---enc:

用途:

對稱加密演算法工具。它能夠運用塊或流演算法對資料進行加解密。還能夠將加解密的結果進行base64編碼。

用法:
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]

選項說明:

-ciphername:對稱演算法名稱,此命令有兩種使用方式:-ciphername方式或者省略enc直接使用ciphername。

-in filename:要加密/解密的輸入檔案,預設為標準輸入。

-out filename:要加密/解密的輸出檔案,預設為標準輸出。

-pass arg:輸入檔案如果有密碼保護,指定密碼來源。

-e:進行加密操作,預設操作。可以省略

-d:進行解密操作。

-a:使用base64編碼對加密結果進行處理。加密後進行base64編碼,解密前進行base64解密。

-base64:同-a選項。

-A:預設情況下,base64編碼為一個多行的檔案。使用此選項,可以讓生成的結果為一行。解密時,必須使用同樣的選項,否則讀取資料時會出錯。

-k:指定加密口令,不設定此項時,程式會提示使用者輸入口令。

-kfile:指定口令存放檔案。可以從這個口令存放檔案的第一行讀取加密口令。

-K key:使用一個16進位制的輸入口令。如果僅指定-K key而沒有指定-k password,必須用-iv選項指定IV。當-K key和-k password都指定時,用-K選項給定的key將會被使用,而使用password來產生初始化向量IV。不建議兩者都指定。

-iv IV:手工指定初始化向量(IV)的值。IV值是16進位制格式的。如果僅使用-K指定了key而沒有使用-k指定password,那麼就需要使用-iv手工指定IV值。如果使用-k指定了password,那麼IV值會由這個password的值來產生。

-salt:產生一個隨機數,並與-k指定的password串聯,然後計算其Hash值來防禦字典攻擊和rainbow table攻擊。

rainbow table攻擊:使用者將密碼使用單向函式得到Hash摘要並存入資料庫中,驗證時,使用同一種單向函式對使用者輸入口令進行Hash得到摘要資訊。將得到的摘要資訊和資料中該使用者的摘要資訊進行比對,一致則通過。考慮到多數人使用的密碼為常見的組合,攻擊者可以將所有密碼的常見組合進行單向Hash,得到一個摘要組合。然後與資料庫中的摘要進行比對即可獲得對應的密碼。

salt將隨機數加入到密碼中,然後對一整串進行單向Hash。攻擊者就很難通過上面的方式來得到密碼。

-S salt:使用16進位制的salt。

-nosalt:表示不使用salt。

-z:壓縮資料(前提是OpenSSL編譯時加入了zip庫)。

-md:指定摘要演算法。如:MD5 SHA1 SHA256等。

-p:打印出使用的salt、口令以及初始化向量IV。

-P:打印出使用的salt、口令以及IV,不做加密和解密操作,直接退出。

-bufsize number:設定I/O操作的緩衝區大小。因為一個加密的檔案可能會很大,每次能夠處理的資料是有限的。

-nopad:沒有資料填充(主要用於非對稱加密操作)。

-debug:列印除錯資訊。

-none:不對資料進行加密操作。

-engine:指定硬體引擎。

注意: 密碼可以用來產生初始化金鑰key和初始化向量IV。

新版的OpenSSL必須使用-salt選項。

OpenSSL支援的加密演算法:des des3 bf cast cast5 rc2 rc4 rc5 aes等




OpenSSL命令---ciphers:

用途:

用來展示加密演算法套件的工具。它能夠把所有OpenSSL支援的加密演算法按照一定規律排列(一般是加密強度)。

用法:
openssl ciphers [-v] [-ssl2] [-ssl3] [-tls1] [cipherlist]

選項說明:

-v:詳細列出所有加密套件。包括SSL版本(SSLv2、SSLv3以及TLS)、金鑰交換演算法、身份驗證演算法、對稱演算法、摘要演算法以及該演算法是否允許出口。

-ssl2:只列出sslv2使用的加密套件。

-ssl3:只列出sslv3使用的加密套件。

-tls1: 只列出tls使用的加密套件。

cipherlist:列出一個cipher list的詳細內容。此項能列出所有符合規則的加密套件,如果不加-v選項,它只會顯示各個套件名稱。

使用例項:

# openssl ciphers -h //列出ciphers引數簡要幫助

# openssl ciphers -v -ssl2

# openssl ciphers -v -ssl3

# openssl ciphers -v -tls1

# openssl ciphers 'SHA1' //列出所有使用SHA1演算法的套件

# openssl ciphers 'SSLv3' //列出SSLv3所使用的演算法

# openssl ciphers 'SHA1+DES' //列出所有包含SHA1和DES的套件

# openssl ciphers -v 'ALL:eNULL' //詳細列出所有非加密演算法

# openssl ciphers -v 'ALL:!ADH:@STRENGTH' //列出所有不包含匿名DH的演算法並排序

# openssl ciphers -v '3DES:+RSA' //僅列出包含3DES和RSA演算法的套件且將包含RSA的顯示在底部

OpenSSL命令---genrsa:

用途:

用來產生RSA私鑰。

用法:
openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand   file(s)] [-engine id] [numbits]

選項說明:

-out fiename: 指定輸出檔案。如果沒有設定此選項,將會輸出到標準輸出。

-passout arg: 指定密碼來源。

-des|-des3|-idea:用來加密私鑰檔案的三種對稱加密演算法。

-F4|-3:指定指數。-f4為0x1001  

-rand file(s):指定隨機種子。

-text——列印私鑰和公鑰和引數(PEM或DER結構)的(未加密)文字。

-engine id:硬體引擎。

numbits:  生成的金鑰位數。必須是本指令的最後一個引數。預設為512bits。

OpenSSL命令---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]

-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

OpenSSL命令---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]

輸入輸出項,通用選項
-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=[email protected]
或者,如果提示選項不存在或未設定為否,則該檔案包含欄位提示資訊。它由以下形式組成:
   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。
使用例項:

//驗證證書請求
$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 = [email protected]

[ req_attributes ]
challengePassword = A challenge password



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_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]
輸入,輸出和一般用途選項
-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