// 生成頂級CA的公鑰證書和私鑰檔案,有效期10年(RSA 1024bits,預設)
openssl req -new -x509 -days 3650 -keyout CARoot1024.key -out CARoot1024.crt
// 為頂級CA的私鑰檔案去除保護密碼
openssl rsa -in CARoot1024.key -out CARoot1024.key
// 生成頂級CA的公鑰證書和私鑰檔案,有效期15年(RSA 2048bits,指定)
openssl req -newkey rsa:2048 -x509 -days 5480 -keyout CARoot2048.key -out CARoot2048.crt
openssl rsa -in CARoot2048.key -out CARoot2048.key
// 為應用證書/中級證書生成私鑰檔案
openssl genrsa -out app.key 2048
// 根據私鑰檔案,為應用證書/中級證書生成 csr 檔案(證書請求檔案)
openssl req -new -key app.key -out app.csr
// 使用CA的公私鑰檔案給 csr 檔案簽名,生成應用證書,有效期5年
openssl ca -in app.csr -out app.crt -cert CARoot1024.crt -keyfile CARoot1024.key -days 1826 -policy policy_anything
// 使用CA的公私鑰檔案給 csr 檔案簽名,生成中級證書,有效期5年
openssl ca -extensions v3_ca -in app.csr -out app.crt -cert CARoot1024.crt -keyfile CARoot1024.key -days 1826 -policy policy_anything
以上是生成根證書與應用證書過程中要用到的所有指令,根據生成目标不同,分為三組。其中,前面兩組都用于生成自簽名的頂級CA(差別隻在于密鑰長度不同),實際應用中隻需根據需求選擇一組即可。
最後一組用于生成非自簽名的證書,包括中級證書與應用證書。所謂中級證書,是具有繼續頒發下級證書權限的子CA,而本文中所說的應用證書,特指不能用來繼續頒發下級證書,隻能用來證明個體身份的證書。頂級CA在簽發二者的時候,隻是多少一個 -extensions v3_ca 選項的差別,這個選項賦予被簽發的證書繼續簽發下級證書的權力。
典型示例:openssl req -new-x509 -days5480 -keyoutCA.key -outCA.crt
示例中,各選項(及參數)的意義如下:
req 使用openssl的req子指令
-new 生成新的證書請求
-x509 生成自簽名證書
-days 5480 自簽名證書的有效期5480天(15年)【僅當使用了 -x509 選項後有效】
-keyout CA.key 私鑰檔案名指定為CA.key【若為運作前就已有的私鑰檔案且原名不是CA.key,則改名為CA.key;否則新生成的私鑰檔案命名為CA.key】
-out CA.crt 指定輸出所生成自簽名證書的資訊到檔案,且檔案名為CA.crt【建議不要省略】
其中,-days,-keyout 兩個選項可以省略,省略的話使用預設值,有效期預設為 30 天【由程式内部在變量初始化的時候指定,與配置檔案無關】,私鑰檔案名的預設值由配置檔案 openssl.cnf 中相關條目指定,沒改過的話為 privkey.pem。
選項 -out 若是省略的話,openssl不會以檔案形式輸出生成的 證書/證書請求,而是會預設将檔案的資訊直接列印到螢幕上,這在大多數情況下,是不符合我們要求的。是以建議這個選項最好不要省略!
req子指令可以通過 -key 選項為證書請求指定使用一個已存在的私鑰檔案。但在示例中的情況下,雖然使用了-new 和 -x509兩個選項,但沒有使用 -key 選項,這時,req子指令會自動為自簽名證書生成一個RSA私鑰,密鑰長度的預設值由配置檔案 openssl.cnf 中的相關條目指定,沒改過的話為 1024 bits。
運作中會提示輸入加密密碼,如下:
writing new private key to 'CA.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
此密碼用于加密私鑰檔案 CA.key 中的私鑰資訊,如果不想在運作過程中還要輸入加密密碼,則可以使用選項 -passout 在指令中直接指定。選項 -passout 的使用形式為:
-passoutarg
其中,arg是選項 -passout 的參數,其格式有多種,詳參《OpenSSL官方文檔》中關于"PASS_PHRASE_ARGUMENTS"的介紹。
本小節典型示例中的指令,可以用選項 -passout 改造如下:
openssl req -new-x509 -days5480 -keyoutCA.key -out CA.crt-passoutpass:1314
運作中會提示輸入一些 Distinguished Name fields,即證書的識别名資訊字段,簡稱為DN字段,如下:
You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:US
State or Province Name (full name) [Berkshire]:California
Locality Name (eg, city) [Newbury]:
Organization Name (eg, company) [My Company Ltd]:GeoAuth Inc.
Organizational Unit Name (eg, section) []:.
Common Name (eg, your name or your server's hostname) []:Authentication Global Root
Email Address []:.
這些DN字段大部分有預設值,預設值由配置檔案 openssl.cnf中相關條目指定。如要在某一個DN字段使用預設值,則無需輸入任何資訊,直接點選"Enter"鍵;如果确實某個DN字段的值要置為空,則輸入一個 '.' 後,點選"Enter"鍵。
這些DN字段主要是拿來識别證書持有者身份的,下表是關于它們的縮寫、說明和一些填寫說明。【此部分參考了互動百科的SSL條目】
DN字段名
縮寫
說明
填寫要求
Country Name
C
證書持有者所在國家
要求填寫國家代碼,用2個字母表示
State or Province Name
ST
證書持有者所在州或省份
填寫全稱,可省略不填
Locality Name
L
證書持有者所在城市
可省略不填
Organization Name
O
證書持有者所屬組織或公司
最好還是填一下
Organizational Unit Name
OU
證書持有者所屬部門
Common Name
CN
證書持有者的通用名
必填。
對于非應用證書,它應該在一定程度上具有惟一性;
對于應用證書,一般填寫伺服器域名或通配符樣式的域名。
Email Address
證書持有者的通信郵箱
表2-1 DN字段的說明
注:表中所謂,證書不是應用證書時,其持有者的通用名要有“唯一性”,是指其通用名不要與一般主機上常見的信任證書清單或撤銷證書清單中的證書産生重複。
如果不想在運作過程中逐個輸入這些DN字段的值,則可以使用 -subj 選項在指令中直接指定。選項 -subj 的使用形式為:
-subj arg
其中,arg是選項 -subj 的參數,其格式類似于:/type0=value0/type1=value1/type2=... 形式。每一個 /type=value 形式的單元,都對應了一個完整的DN字段。其中,
/ 是每一個DN字段的開始标志;type0、type1等等,就是表2-1中提到的DN字段名的縮寫;=是DN字段的名和值之間的間隔符;
value0、value1等等,就是原本你要在運作過程中逐個輸入的DN字段的值。
對于您要将值置為空的DN字段,您可以略去不寫。本小節典型示例中的指令,可以用 -subj 選項改造如下【略去了 L 與 OU 兩個DN字段】:
openssl req -new-x509 -days5480 -subj/C=US/ST=California/O=GeoAuth\ Inc./CN=Authentication\ Global\ Root -keyout CA.key -out CA.crt
需要特别注意的是,如果您設定的DN字段的值如果存在一些特殊字元【比如 (空格)、((半角左括号)、)(半角右括号)……】,必須經過\(反斜杆)轉義。上例中已經給出了空格轉義的情況。
如前所述,示例隻能生成密鑰長度為1024bits的RSA公私鑰對。如果要生成密鑰長度不為1024bits的RSA公私鑰對,或是其他類型的【比如DSA、EC】公私鑰對,則必須使用選項 -newkey 來代替 -new 。選項 -newkey 的用法比較複雜,如需詳細了解,請參看《OpenSSL官方文檔》的相關頁面。本小節典型示例中的指令等效于以下指令:
openssl req -newkeyrsa:1024 -x509 -days5480-keyoutCA.key -outCA.crt
要生成一個密鑰長度為2048bits的RSA公私鑰對,指令為:
openssl req -newkeyrsa:2048 -x509 -days5480-keyoutCA2048.key -outCA2048.crt
上節提到,頂級CA的私鑰檔案是經過加密保護的,以後每當需讀取 CA.key 檔案中的私鑰資訊時,都需輸入解密密碼。這種做法适合有安全需求的場合,但如果覺得不友善,也可以去除這個密碼。
典型示例:openssl rsa -inCA.key -outCA.key
示例中,各選項/參數的意義如下:
rsa 使用openssl的rsa子指令
-in CA.key 經加密保護的私鑰檔案
-out CA.key 解除加密保護後的私鑰檔案【可以改名】
運作中會提示輸入解密密碼,如下:,
Enter pass phrase for CA.key:
writing RSA key
如果不想在運作過程中還要輸入解密密碼,則可以使用選項 -passin 在指令中直接指定。選項 -passin 的使用形式為:
-passinarg
其中,arg是選項 -passin 的參數,其格式同選項 -passout 的參數,詳參《OpenSSL官方文檔》中關于"PASS_PHRASE_ARGUMENTS"的介紹。
本小節典型示例中的指令,可以用選項 -passin 改造如下:
openssl rsa -inCA.key -out CA.key -passin pass:1314
基于同選項 -passout 一樣的考量,一般不建議直接在指令中指定解密密碼。
典型示例:openssl genrsa-outapp.key 2048
genrsa 使用openssl的genrsa子指令
-out app.key 指定輸出生成的私鑰資訊到檔案,且檔案名為app.key【建議别省略】
2048 指定所生成私鑰的比特長度【務必放在最後一個】
其中,選項 -out 若是省略的話,openssl不會以檔案形式輸出生成的 私鑰資訊,而是會預設将私鑰的資訊直接列印到螢幕上,這不符合我們的要求。是以建議這個選項不要省略!
genrsa子指令還可以有其他一些選項及參數,但不論還有多少選項,都必須把指定私鑰長度的參數放在最後一個。【如果指定私鑰長度的參數不是最後一個,則其後的參數好像會被舍棄。】
本小節典型示例所給出的指令,生成的是未經任何加密保護的私鑰檔案。這種方式用起來比較友善,但非常不安全。如果要為私鑰檔案附加加密保護,則有兩種方式:
A.在生成私鑰檔案的同時就指定輸出前要用某種加密算法加密保護;
B.生成明文的私鑰檔案後用 rsa 子指令附加某種加密算法的加密保護。
我計算機上安裝的openssl版本,在兩種方式下都支援這些加密算法選項:-des,-des3,-aes128,-aes192,-aes256。以加密選用192位的AES算法為例,指令如下:
// 在生成私鑰檔案的同時就指定輸出前要用192位的AES算法加密保護
openssl genrsa -aes192 -out app.key 1024
// 生成明文的私鑰檔案後用 rsa 子指令附加192位的AES算法加密保護
openssl rsa -aes192 -in app.key -out app.key
上例中的兩個指令,都會要求在運作中輸入加密密碼。同樣的,雖然不建議,但是openssl依然支援在指令中使用選項 -passout 指定加密密碼,選項 -passout 的用法參考2.1小節。唯一需要額外注意的是,對于genrsa子指令,選項 -passout 應放在 指定密鑰長度的參數 前面。
典型示例:openssl req -keyapp.key -out app.csr
req 使用openssl的req子指令
-new 生成新的證書請求
-key app.key 指定是為app.key檔案中的私鑰生成證書請求
-out app.csr 指定輸出所生成證書請求的資訊到檔案,且檔案名為app.csr
這和2.1節使用的是openssl的同一個子指令,是以參數的意義很多具有共通性。指令運作中也會要求輸入一些DN字段的值,參看本文2.1 [3] 中的相關介紹。同樣的,可以使用-subj選項在指令中直接指定這些DN字段的值。
典型示例:openssl ca-inapp.csr -outapp.crt -certCA.crt -keyfileCA.key -days1826 -policypolicy_anything
ca 使用openssl的ca子指令
-in app.csr 指定待簽發證書的 CSR檔案為 app.csr
-out app.crt 指定輸出所簽發證書的資訊到檔案,且檔案名為app.crt【建議不要省略】
-cert CA.crt 指定為應用/中級證書簽名的CA的公鑰證書為CA.crt【用到CA憑證的持有者資訊】
-keyfile CA.key 指定為應用/中級證書簽名的CA的私鑰檔案為CA.key【用CA私鑰實際執行簽名】
-days 1826 指定所簽發證書的有效期為1826天(5年)
-policy policy_anything 指定簽發政策為 policy_anything 【即,允許所簽發證書的持有者資訊和頒發者資訊之間不遵守任何比對政策】
其中,選項 -out 若是省略的話,openssl不會以檔案形式輸出生成的 應用證書/中級證書資訊,而是會預設将證書的資訊直接列印到螢幕上,這一般不符合我們的要求。是以建議這個選項不要省略!
留待下次補充。先參看這這篇吧,http://hi.baidu.com/mars208/item/3b3022ec95a9d704570f1d49
如何聯系我:【萬裡虎】www.bravetiger.cn
【QQ】3396726884 (咨詢問題100元起,幫助解決問題500元起)
【部落格】http://www.cnblogs.com/kenshinobiy/