一)keytool生成私鑰文件(.key)和簽名請求文件(.csr),openssl簽發數字證書

????? J2SDK在目錄%JAVA_HOME%/bin提供了密鑰庫管理工具Keytool,用于管理密鑰、證書和證書鏈。Keytool工具的命令在JavaSE6中已經改變,不過以前的命令仍然支持。Keytool也可以用來管理對稱加密算法中的密鑰。

最簡單的命令是生成一個自簽名的證書,并把它放到指定的keystore文件中:

keytool -genkey -alias tomcat -keyalg RSA -keystore c:/mykey

如果c:/mykey文件不存在,keytool會生成這個文件。按照命令的提示,回答一系列問題,就生成了數字證書。注意,公共名稱(cn)應該是服務器的域名。這樣keystore中就存在一個別名為tomcat的實體,它包括公鑰、私鑰和證書。這個證書是自簽名的。<o:p></o:p>

Keytool工具可以從keystore中導出證書,但是不能導出私鑰。對于配置apache這樣的服務器,就不太方便。這種情況下就完全用OpenSSL吧,下面將會介紹。不過keytool對于J2EE AppServer是很有用的,它們就是用keystore存儲證書鏈的。keystore的作用類似于windows存放證書的方式,不過跨平臺了,^_^下面用Keytool生成CSR(Certificate Signing Request),并用OpenSSL生成CA簽名的證書。

1.??? 準備
1)??? 在bin目錄下新建目錄 demoCA、demoCA/certs、demoCA/certs? 、 demoCA/newcerts
2)??? 在demoCA建立一個空文件 index.txt
3)??? 在demoCA建立一個文本文件 serial, 沒有擴展名,內容是一個合法的16進制數字,例如 0000
4)??? 配置環境變量PATH,加入%JAVA_HOME%/bin,本文用的JavaSDK1.6

2.??? 生成CA的自簽名證書
openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf

3.??? 生成server端證書
1)??? 生成KeyPair生成密鑰對
?keytool -genkey -alias tomcat_server -validity 365 -keyalg RSA -keysize 1024 -keypass 123456? -storepass 123456 -keystore server_keystore
? 輸入common name時,要和服務器的域名保持一致。
2)??? 生成證書簽名請求
keytool -certreq -alias tomcat_server -sigalg MD5withRSA -file tomcat_server.csr -keypass 123456 -storepass 123456 -keystore server_keystore
3)??? 用CA私鑰進行簽名,也可以到權威機構申請CA簽名。
?? openssl ca -in tomcat_server.csr -out tomcat_server.crt -cert ca.crt -keyfile ca.key -notext -config openssl.cnf
? 其中-notext表示不要把證書文件的明文內容輸出到文件中去,否則在后面用keytool導入到keystore時會出錯。
4)??? 導入信任的CA根證書到keystore
?? keytool -import -v -trustcacerts? -alias my_ca_root -file ca.crt -storepass 123456 -keystore server_keystore
5)??? 把CA簽名后的server端證書導入keystore
keytool -import -v -alias tomcat_server -file tomcat_server.crt -storepass 123456 -keystore server_keystore
6)??? 查看server端證書
?? keytool -list -v -keystore server_keystore?
?可以看到tomcat_server的證書鏈長度是2
?
4.??? 生成client端證書
1)??? 生成客戶端CSR
?? openssl genrsa -des3 -out tomcat_client.key 1024
openssl req -new -key tomcat_client.key -out tomcat_client.csr -config openssl.cnf
2)??? 用CA私鑰進行簽名,也可以到權威機構申請CA簽名
openssl ca -in tomcat_client.csr -out tomcat_client.crt -cert ca.crt -keyfile ca.key -notext -config openssl.cnf
3)??? 生成PKCS12格式證書
openssl pkcs12 -export -inkey tomcat_client.key -in tomcat_client.crt -out? tomcat_client.p12
4)??? 使用Keytool列出pkcs12證書的內容:
?? keytool -rfc -list -keystore tomcat_client.p12 -storetype pkcs12


二)openssl生成私鑰文件(.key)和簽名請求文件(.csr),以及簽發數字證書

操作目錄是openssl/bin(沒辦法改不了環境變量,如果你可以改的話,就不用在這個目錄下工作了),為了方便本人把apps下的openssl.cnf也復制到了這個目錄下來。文件名都是以本人使用的來說了:

1.首先要生成服務器端的私鑰(key文件):
openssl genrsa -des3 -out server.key 1024
運行時會提示輸入密碼,此密碼用于加密key文件(參數des3便是指加密算法,當然也可以選用其他你認為安全的算法.),以后每當需讀取此文件(通過openssl提供的命令或API)都需輸入口令.如果覺得不方便,也可以去除這個口令,但一定要采取其他的保護措施!
去除key文件口令的命令:
openssl rsa -in server.key -out server.key

2.openssl req -new -key server.key -out server.csr -config openssl.cnf
生成Certificate Signing Request(CSR),生成的csr文件交給CA簽名后形成服務端自己的證書.屏幕上將有提示,依照其指示一步一步輸入要求的個人信息即可.

3.對客戶端也作同樣的命令生成key及csr文件:
openssl genrsa -des3 -out client.key 1024
openssl req -new -key client.key -out client.csr -config openssl.cnf

4.CSR文件必須有CA的簽名才可形成證書.可將此文件發送到verisign等地方由它驗證,要交一大筆錢,何不自己做CA呢.
openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf

5.用生成的CA的證書為剛才生成的server.csr,client.csr文件簽名:
Openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
Openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cnf

現在我們所需的全部文件便生成了.

另:
client使用的文件有:ca.crt,client.crt,client.key
server使用的文件有:ca.crt,server.crt,server.key
.crt文件和.key可以合到一個文件里面,本人把2個文件合成了一個.pem文件(直接拷貝過去就行了)
---------------------------------------------------
合并證書文件(crt)和私鑰文件(key):

#cat client.crt client.key > client.pem
#cat server.crt server.key > server.pem


本文大部分來自網絡(http://zhouzhk.javaeye.com/blog/135081),稍作增補。