original: http://apps.hi.baidu.com/share/detail/30995314
弄了差不多兩天的證書,頭都大了 走了很多彎路,把知識(shí)拿出來跟大家share下,其實(shí)并不復(fù)雜。
背景:我們有個(gè)WEB服務(wù)器,比如TOMCAT,在TOMCAT上我們部署了個(gè)應(yīng)用http://localhost:8080/sslPro, 當(dāng)我們從瀏覽器以安全模式,即https訪問這個(gè)應(yīng)用時(shí),用到的知識(shí)數(shù)字證書,數(shù)字簽名。這里我們只講到單向認(rèn)證,即服務(wù)器端認(rèn)證。當(dāng)我從瀏覽器訪問服務(wù)器時(shí),我們的目的是要確認(rèn)我現(xiàn)在訪問的就是localhost上的sslPro,反過來服務(wù)器向我證明我就是localhost.
目的:我們要做的事是:用keytool生成證書簽名請(qǐng)求,用openssl生成自簽名證書,然后模擬CA用自己生成的自簽名證書對(duì)簽名請(qǐng)求進(jìn)行簽名,并把根證書及簽名后的證書倒入到KEYSTORE中
準(zhǔn)備:J2SDK在目錄%JAVA_HOME%/bin提供了密鑰庫(kù)管理工具Keytool,用于管理密鑰、證書和證書鏈。Keytool工具的命令在JavaSE6中已經(jīng)改變,不過以前的命令仍然支持。Keytool也可以用來管理對(duì)稱加密算法中的密鑰。有關(guān)Keytool的知識(shí)可以參考:http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/keytool.html。有關(guān)openssl的知識(shí)請(qǐng)參考:http://www.openssl.org。 下面的準(zhǔn)備很重要,(1)把openssl目錄下的文件openssl.cnf文件拷貝到openssl的bin目錄下,在bin目錄下新建目錄demoCA、demoCA/certs、demoCA/private、 demoCA/newcerts (2) 在demoCA建立一個(gè)空文件 index.txt (3) 在demoCA建立一個(gè)文本文件 serial, 沒有擴(kuò)展名,內(nèi)容是一個(gè)合法的16進(jìn)制數(shù)字,例如 0011, 我曾經(jīng)寫過0000,但會(huì)導(dǎo)致根證書跟簽名證書的序列號(hào)都是0,所以不行,建議不寫0000。(4) 配置好JDK的環(huán)境變量
過程:
a. 生成密鑰對(duì)
Keytool –genkey –alias test –keystore test.jks 根據(jù)提示輸入信息,記住:輸入的信息必須跟后面的自簽名證書信息一致,名字與姓氏我們這里應(yīng)該輸入localhost。 可以用-list查看信息。(到這一步,其實(shí)我們可以用export命令導(dǎo)出證書到cer文件,然后把cer文件導(dǎo)入到瀏覽器,這就是我們自己生成的沒有經(jīng)過簽名的證書)
b. 生成證書簽名請(qǐng)求
Keytool –certreq –alias test –keystore test.jks –file test.csr。
c. 生成CA的自簽名證書
openssl req -new -x509 -keyout root.key -out root.crt -config openssl.cnf 輸入信息
d. 把test.csr拷貝到openssl的bin目錄下,用CA私鑰進(jìn)行簽名(當(dāng)然也可以到權(quán)威機(jī)構(gòu)申請(qǐng)CA簽名,但要花很多錢)。
openssl ca -in test.csr -out demo.crt -cert root.crt -keyfile root.key -notext -config openssl.cnf (其中-notext表示不要把證書文件的明文內(nèi)容輸出到文件中去,否則在后面用keytool導(dǎo)入到keystore時(shí)會(huì)出錯(cuò)。) 。可以用openssl x509 -noout -text -in root.crt 命令查看
e. 導(dǎo)入信任的CA根證書到keystore
keytool -import -v -alias test2 -file root.crt -keystore test.jks
這一步你也可以把根證書倒入到keystore cacerts中,在目錄%JAVA_HOME%\jre\lib\security 目錄下,有關(guān)cacerts的官方資料如下:
The "cacerts" file represents a system-wide keystore with CA certificates. System administrators can configure and manage that file using keytool, specifying "jks" as the keystore type. The initial password of the "cacerts" keystore file is "changeit". 詳細(xì)信息可參考:http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/keytool.html#cacerts
f. 把CA簽名后的證書導(dǎo)入到keystore
keytool -import -v -trustcacerts -alias test –file demo.crt -keystore test.jks
好了,把test.jks拷貝到你應(yīng)用的WEB-INF目錄下。配置tomcat服務(wù)器,如下:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystorePass="changeit" keystoreFile="webapps\sslPro\WEB-INF\test.jks
keyAlias="test" "/>
現(xiàn)在當(dāng)你用HTTPS訪問你的應(yīng)用時(shí),如https://localhost:8443/proTest會(huì)出來一個(gè)框框,說此證書不在你的信用列表里,問是否信用。這個(gè)時(shí)候你還有一件事情要做,就是把你信用的根證書導(dǎo)入到你的瀏覽器中,下次在訪問時(shí)這個(gè)小框框就不會(huì)出來了,因?yàn)槟阋呀?jīng)信用它了。
這樣自己簽名的證書就做好了。寫來簡(jiǎn)單 , 但也花了不少時(shí)間。
兩個(gè)比較好的參考文章:http://zhouzhk.javaeye.com/blog/136943,http://industry.ccidnet.com/art/1078/20030709/53943_2.html
有關(guān)SSL的工作原理讀者可以參考下篇文章。