$ mkdir -p ./demoCA/{private,newcerts}
$ touch ./demoCA/index.txt
$ echo 01 > ./demoCA/serial
產生的目錄結構如下:
`-- demoCA/
??? |-- index.txt
??? |-- newcerts/
??? |-- private/
??? `-- serial
?然后執行下面的命令。
創建根證書?
openssl rand -out private/.rand 1000
參考文件:
由于實驗需要,需要手動制作CA證書以及客戶端和服務器端證書,總結如下:
最近兩天,查閱了一些關于創建證書的資料,發現網上很多介紹并不是很完整,不具有完全的可操作性。
創建證書,我目前知道的大概這么幾種:
1.keytool
? ?不能創建CA證書
2.Sybase ASA自帶的createcert.exe
? ?好像不能創建PKCS12型證書
3.OpenSSL
? ?功能最強大。
所以,這里干脆只介紹OpenSSL了。
安裝完OpenSSL-Win32到d:\tools之后,修改配置文件d:\tools\OpenSSL-Win32\bin\openssl.cfg
找到:
[ CA_default ]
dir ?? ?= $ENV::OPENSSL_HOME/CA # Where everything is kept
這里原來值是./demoCA
還是用絕對路徑比較好。就放到d:\tools\OpenSSL-Win32\CA目錄下。
緊接著,做一些準備工作,創建一些子目錄,準備創建證書,
完全的批處理命令如下:
- @echo?off??
- @rem?set?OPENSSL_HOME=d:\tools\OpenSSL-Win32??
- set?PATH=%OPENSSL_HOME%\bin;%PATH%??
- mkdir?%OPENSSL_HOME%\CA??
- cd?/d?%OPENSSL_HOME%\CA??
- echo?"create?subdir?certs"??
- mkdir?certs??
- mkdir?newcerts??
- mkdir?private??
- mkdir?crl??
- echo?"create?file:?index?and?serial"??
- echo?0>index.txt??
- echo?01>serial??
- echo?"create?rand?file"??
- openssl?rand?-out?private/.rand?1000??
- @rem?echo?%random%?>>?private/.rand??
- @echo?off??
- set?PATH=d:\tools\Openssl-Win32\bin;%PATH%??
- echo?create?private?key?for?rootca??
- @rem?the?password,?set?it?as?123456??
- openssl?genrsa?-aes256?-out?private/ca.key.pem?2048??
- echo?generate?root?ca?request??
- openssl?req?-new?-key?private/ca.key.pem?-out?private/ca.csr?-subj?"/C=CN/ST=BJ/L=BJ/O=zlex/OU=zlex/CN=*.sql9.com"??
- echo?create?root?ca?cert??
- openssl?x509?-req?-days?10000?-sha1?-extensions?v3_ca?-signkey?private/ca.key.pem?-in?private/ca.csr?-out?certs/ca.cer??
- echo?convert?the?cert?from?cer?into?PKCS12??
- openssl?pkcs12?-export?-clcerts?-in?certs/ca.cer?-inkey?private/ca.key.pem?-out?certs/ca.p12??
- echo?use?keytool?can?query?the?pkcs12?cert?status??
- keytool?-list?-keystore?certs/ca.p12?-storetype?pkcs12?-v?-storepass?123456??
- echo?create?server?ca??
- openssl?genrsa?-aes256?-out?private/server.key.pem?2048??
- openssl?req?-new?-key?private/server.key.pem?-out?private/server.csr?-subj?"/C=CN/ST=BJ/L=BJ/O=zlex/OU=zlex/CN=www.sql9.com"??
- openssl?x509?-req?-days?3650?-sha1?-extensions?v3_req?-CA?certs/ca.cer?-CAkey?private/ca.key.pem?-CAserial?ca.srl?-CAcreateserial?-in?private/server.csr?-out?certs/server.cer??
- openssl?pkcs12?-export?-clcerts?-inkey?private/server.key.pem?-in?certs/server.cer?-out?certs/server.p12??
- echo?create?client?ca??
- openssl?genrsa?-aes256?-out?private/client.key.pem?2048??
- openssl?req?-new?-key?private/client.key.pem?-out?private/client.csr?-subj?"/C=CN/ST=BJ/L=BJ/O=zlex/OU=zlex/CN=sql9"??
- openssl?ca?-days?3650?-in?private/client.csr?-out?certs/client.cer?-cert?certs/ca.cer?-keyfile?private/ca.key.pem??
- openssl?pkcs12?-export?-clcerts?-inkey?private/client.key.pem?-in?certs/client.cer?-out?certs/client.p12??
- cp?-r?certs?certs.new ?
原文:http://blog.csdn.net/iihero/article/details/17626845?
這一針在農信銀2代項目中有幸能碰到加密方面的東西,所以就好好學習了一下。不足之處還請前輩們見諒。
OpenSSL功能遠勝于KeyTool,可用于根證書,服務器證書和客戶證書的管理
這里使用的是Win32OpenSSL_Light-1_0_1e.exe
http://www.slproweb.com/products/Win32OpenSSL.html
1,構建根證書
構建根證書前,需要構建隨機數文件(.rand),完整命令如
openssl rand -out private/.rand 1000
rand 隨機數命令。這里將隨機數文件輸出到private目錄下。
-out 輸出文件路徑,
這里的參數1000,指定來產生偽隨機字節數
2,構建根證書私鑰
openssl genrsa -aes256 -out private/ca.key.pem 2048
3,生成根證書簽發申請
完成密鑰構建操作后,我們需要生成根證書簽發申請文件(ca.csr),完整命令如代碼
openssl req -new -key private/ca.key.pem -out private/ca.csr -subj "/C=CN/ST=BJ/L=BJ/O=lesaas/OU=lesaas/CN=*.lesaas.cn"
req 產生證書簽發申請命令
-new 表示新請求
-key 密鑰,這里為private/ca.key.pem文件
-out 輸出路徑,這里為private/ca.csr文件
-subj 指定用戶信息。這里使用泛域名"*.lesaas.cn"
得到根證書簽發申請文件后,我們可以將其發生給CA機構簽發,當然我們也可以自行簽發根證書。
4,簽發根證書(自行簽發根證書)
openssl x509 -req -days 10000 -sha1 -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certs/ca.cer
x509 簽發X.509格式證書命令。
-req 表示證書輸入請求。
-days 表示有效天數,這里為10000天。
-shal 表示證書摘要算法,這里為SHA1算法。
-extensions 表示按OpenSSL配置文件v3_ca項添加擴展。
-signkey 表示自簽名密鑰,這里為private/ca.key.pem。
-in 表示輸入文件,這里為private/ca.csr。
-out 表示輸出文件,這里為certs/ca.cer。
====================================================================================================
OpenSSL產生的數據證書不能再JAVA語言環境中直接使用,需要將其轉化為PKCS#12編碼格式。
完整命令如代碼
5,根證書轉化
openssl pkcs12 -export -cacerts -inkey private/ca.key.pem -in certs/ca.cer -out certs/ca.p12
pkcs12 PKCS#12編碼格式證書命令。
-export 表示導出證書。
-cacerts 表示僅導出CA證書。
-inkey 表示輸入密鑰,這里為private/ca.key.pem
-in 表示輸入文件,這里為certs/ca.cer
-out 表示輸出文件,這里為certs/ca.p12
個人信息交換文件(PKCS#12) 可以作為密鑰庫或信任庫使用,我們可以通過KeyTool查看密鑰庫的詳細信息。
6,查看密鑰庫信息
keytool -list -keystore d:/CA/certs/ca.p12 -storetype pkcs12 -v -storepass 123456
注意,這里參數-storetype值為“pkcs12”。
我們已經構建了根證書(ca.cer),我們可以使用根證書簽發服務器證書和客戶證書。
7,構建服務器證書
服務器證書的構建與根證書構建相似,首先需要構建私鑰。
(1)構建服務器私鑰
openssl genrsa -aes256 -out private/server.key.pem 2048
genrsa 產生RSA密鑰命令。
-aes256 使用AES算法(256位密鑰)對產生的私鑰加密。可選算法包括DES,DESede,IDEA和AES。
-out 輸出路徑,這里指private/server.key.pem。
這里的參數2048,指RSA密鑰長度位數,默認長度為512位。
(2)生成服務器證書簽發申請
openssl req -new -key private/server.key.pem -out private/server.csr -subj "/C=CN/ST=BJ/L=BJ/O=lesaas/OU=lesaas/CN=www.lesaas.cn"
req 產生證書簽發申請命令
-new 表示新請求。
-key 密鑰,這里為private/ca.key.pem文件
-out 輸出路徑,這里為private/ca.csr文件
-subj 指定用戶信息,這里使用域名“www.lesaas.cn”作為用戶名。
我們已經獲得了根證書,可以使用根證書簽發服務器證書。
(3)簽發服務器證書
openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certs/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/server.csr -out
certs/server.cer
x509 簽發X.509格式證書命令。
-req 表示證書輸入請求。
-days 表示有效天數,這里為3650天。
-sha1 表示證書摘要算法,這里為SHA1算法。
-extensions 表示按OpenSSL配置文件v3_req項添加擴展。
-CA 表示CA證書,這里為certs/ca.cer
-CAkey 表示CA證書密鑰,這里為private/ca.key.pem
-CAserial 表示CA證書序列號文件,這里為ca.srl
-CAcreateserial表示創建CA證書序列號
-in 表示輸入文件,這里為private/server.csr
-out 表示輸出文件,這里為certs/server.cer
這里我們同樣需要將OpenSSL產生的數子證書轉化為PKCS#12編碼格式。完整命令如下
(4)服務器證書轉換
openssl pkcs12 -export -clcerts -inkey private/server.key.pem -in certs/server.cer -out certs/server.p12
pkcs12 PKCS#12編碼格式證書命令。
-export 表示導出證書。
-clcerts 表示僅導出客戶證書。
-inkey 表示輸入文件,這里為private/server.key.pem
-in 表示輸入文件,這里為certs/ca.cer
-out 表示輸出文件,這里為certs/server.p12
我們已經構建了服務器證書(server.cer),并可使用該證書構建基于單向認證網絡
(5)構建客戶證書
客戶證書的構建與服務器證書構建基本一致,首先需要構建私鑰。
產生客戶私鑰
openssl genrsa -aes256 -out private/client.key.pem 2048
genrsa 產生RSA密鑰命令
-aes256 使用AES算法(256為密鑰)對產生的私鑰加密。可選算法包括DES,DESede,IDEA和AES。
-out 輸出路徑,這里指private/client.key.pem
這里的參數2048,指RSA密鑰長度位數,默認長度為512位
完成客戶證書密鑰構建后,我們需要產生客戶證書簽發申請
(6)生成客戶證書簽發申請
openssl req -new -key private/client.key.pem -out private/client.csr -subj "/C=CN/ST=BJ/L=BJ/O=lesaas/OU=lesaas/CN=lesaas"
req 產生證書簽發申請命令
-new 表示新的請求。
-key 密鑰,這里為private/client.csr文件
-subj 指定用戶信息,這里使用“lesaas”作為用戶名
我們已經獲得了根證書,可以使用根證書簽發客戶證書(client.cer)
(7)簽發客戶證書
openssl ca -days 3650 -in private/client.csr -out certs/client.cer -cert certs/ca.cer -keyfile private/ca.key.pem
ca 簽發證書命令
-days 表示證書有效期,這里為3650天。
-in 表示輸入文件,這里為private/client.csr
-out 表示輸出文件,這里為certs/server.cer
-cert 表示證書文件,這里為certs/ca.cer
-keyfile 表示根證書密鑰文件,這里為private/ca.key.pem
最后,我們需要將獲得客戶證書轉化Java語言可以識別的PKCS#12編碼格式。
(8)客戶證書轉換
openssl pkcs12 -export -inkey private/client.key.pem -in certs/client.cer -out certs/client.p12
pkcs12 PKCS#12編碼格式證書命令、
-export 表示導出證書
-clcerts 表示僅導出客戶證書。
-inkey 表示輸入密鑰,這里為private/client.key.pem
-in 表示輸入文件,這里為certs/client.cer
-out 表示輸出文件,這里為certs/client.p12
至此,我們完成了雙向認證的所需的全部證書。
數字證書是公鑰的載體,而密鑰庫可以包含公鑰、私鑰信息。
JKS和PKCS#12都是比較常用的兩種密鑰庫格式/標準。對于前者,搞Java開發,尤其是接觸過HTTPS平臺的朋友,并不陌生。JKS文件(通常為*.jks或*.keystore,擴展名無關)可以通過Java原生工具——KeyTool生成;而后者PKCS#12文件(通常為*.p12或*.pfx,意味個人信息交換文件),則是通過更為常用的OpenSSL工具產生。
當然,這兩者之間是可以通過導入/導出的方式進行轉換的!當然,這種轉換需要通過KeyTool工具進行!
回歸正題,計費同事遇到一個難題:合作方交給他們一個*.pfx文件,需要他們從中提取密鑰,然后進行加密交互。其實,通過Java直接操作密鑰庫文件(或個人信息交換文件)對于一般Java開發人員來說,這都是個冷門。不接觸數字安全,根本不知所云。況且,Java原生的密鑰庫文件格式為JKS,如何操作*.pfx文件?密鑰庫操作需要獲知密鑰庫別名,*.pfx別名是什么?!接下來就解決這些問題!
(PKCS#12是base64編碼的)
方案:
通過keytool密鑰庫導入命令importkeystore,將密鑰庫格式由PKCS#12轉換為JKS。
檢索新生成的密鑰庫文件,提取別名信息。
由密鑰庫文件導出數字證書(這里將用到別名)。
通過代碼提取公鑰/私鑰、簽名算法等
先看格式轉換:
Cmd代碼 收藏代碼
echo 格式轉換
keytool -importkeystore -v -srckeystore zlex.pfx -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore zlex.keystore -deststoretype jks -deststorepass 123456
-importkeystore導入密鑰庫,通過格式設定,我們可以將PKCS#12文件轉換為JKS格式。
-v顯示詳情
-srckeystore源密鑰庫,這里是zlex.pfx
-srcstoretype源密鑰庫格式,這里為pkcs12
-srcstorepass源密鑰庫密碼,這里為123456
-destkeystore目標密鑰庫,這里為zlex.keystore
-deststoretype目標密鑰庫格式,這里為jks,默認值也如此
-deststorepass目標密鑰庫密碼,這里為123456
通過這個操作,我們能夠獲得所需的密鑰庫文件zlex.keystore。
這時,我們已經獲得了密鑰庫文件,只要確定對應的別名信息,就可以提取公鑰/私鑰,以及數字證書,進行加密交互了!
Cmd代碼 收藏代碼
echo 查看證書
keytool -list -keystore zlex.keystore -storepass 123456 -v
-list列舉密鑰庫
-keystore密鑰庫,這里是zlex.keystore
-storepass密鑰庫密碼,這里是123456
-v顯示詳情
現在,我們把證書導出!
Cmd代碼 收藏代碼
echo 導出證書
keytool -exportcert -alias 1 -keystore zlex.keystore -file zlex.crt -storepass 123456
-exportcert導出證書
-alias別名,這里是1
-keystore密鑰庫,這里是zlex.keystore
-file證書文件,這里是zlex.crt
-storepass密鑰庫密碼,這里是123456
現在證書也導出了,我們可以提取公鑰/私鑰,進行加密/解密,簽名/驗證操作了!當然,即便沒有證書,我們也能夠通過密鑰庫(JKS格式)文件獲得證書,以及公鑰/私鑰、簽名算法等。
IIS配置SSL時遇到的錯誤:
1)證書鏈中的一個或多個中間證書丟失?
How to configure intermediate certificates
- Open the Certificates Microsoft Management Console (MMC) snap-in. To do this, follow these steps:
- At a command prompt, type?Mmc.exe.
- If you are not running the program as the built-in Administrator, you will be prompted for permission to run the program. In the?Windows Security?dialog box, clickAllow.
- On the?File?menu, click?Add/Remove Snap-in.
- In the?Add or Remove Snap-ins?dialog box, click the?Certificates?snap-in in the?Available snap-ins?list, click?Add, and then click?OK.
- In the?Certificates snap-in?dialog box, click?Computer account, and then click?Next.
- In the?Select computer?dialog box, click?Finish.
- In the?Add or Remove Snap-ins?dialog box, click?OK.
- To add an intermediate certificate, follow these steps:
- In the Certificates MMC snap-in, expand?Certificates, right-click?Intermediate Certification Authorities, point to?All Tasks, and then click?Import.
- In the?Certificate Import?Wizard, click?Next.
- In the?File to Import?page, type the file name of the certificate that you want to import in the?File name?box, and then click?Next.
- Click?Next, and then complete the Certificate Import Wizard.