天天看點

openssl和keytool制證(tomcat ssl配置)

編譯好openssl就可以使用了。

生成CA跟證書與私鑰

req -new -x509 -keyout ca.key -out ca.crt -days 365 -config openssl.cnf

這樣我們就得到了私鑰檔案ca.key ca根證書ca.crt。openssl.cnf可以去官網下載下傳 不過它是适合linux系統的,需要修改 ,全部改成雙//。

利用keytool生成證書請求。

首先說明幾個概念: keytool 将密鑰和證書儲存在一個所謂的密鑰倉庫中。 在密鑰倉庫中有兩種不同類型的項:

密鑰項 : 每項存放極為敏感的加密密鑰資訊,這種資訊以一種受保護的格式儲存以防止未授權的通路。通常,儲存在這類項中的密鑰是機密密鑰,或是伴有用于認證相應公鑰用的證書“鍊”的私鑰。 keytool 隻處理後一類型的項,即私鑰及其關聯的證書鍊。

可信任的證書項 : 每項包含一個屬于另一團體的公鑰證書。它之是以叫做“可信任的證書”,是因為密鑰倉庫的擁有者相信證書中的公鑰确實屬于證書“主體”(擁有者)識别的身份。證書簽發人通過對證書簽名來保證這點。

對所有的密鑰倉庫項(密鑰項和可信任的證書項)的通路都要通過唯一的别名來進行。别名不區分大小寫,即别名 SHECA 和 sheca 指的是同一密鑰倉庫項。

       當用 -genkey 指令來生成密鑰對(公鑰和私鑰)或用 -import 指令來将證書或證書鍊加到可信任證書的清單中,以增加一個實體到密鑰倉庫中,必須指定了一個别名。後續 keytool 指令必須使用這一相同的别名來引用該實體。

     當第一次産生密鑰時,鍊中隻含有一個元素,即自簽名證書。自簽名證書是一個這樣的證書:其簽發人(簽名人)與主體(證書所認證的公鑰所屬的實體)相同。當調用 -genkey 指令來生成新的公鑰/私鑰對時,他同時也把公鑰打包進自簽名證書中(在對應的密鑰倉庫中)。

  之後,當證書簽名請求 (CSR) 被生成并送至認證機構 (CA) 後, CA 的答複将被導入,證書鍊将取代自簽名證書。在鍊的底部是認證主體公鑰的 CA 所發放的證書(答複)。鍊中下一個證書是用于認證 CA 公鑰的證書。(證書鍊一般是pkcs7格式的) 生成密鑰對

keytool -genkey -alias server -keyalg rsa -validity 365 -keystore d:/server.keystore

生成證書請求

keytool -certreq -alias server -file server.csr -keystore d:/server.keystore

利用openssl對server.csr簽名

openssl ca -in d:/server.csr -out server.crt -cert ca.crt -keyfile ca.key -notext -config openssl.cnf

直接這樣會報錯,主要是因為openssl.cnf配置檔案的原因。打開這個配置檔案,你會看到裡面有很多目錄,你需要建立對應的目錄結構,建立demoCA檔案夾以及其子檔案newcerts ,檔案index.txt、 serial。 如果這樣還是會報錯 ,需要注釋掉配置檔案中的#x509_extensions = x509v3_extensions 

簽名後就可以将根證書ca.crt和簽好名都server.crt導入到keytool的受信任的倉庫truts.keystore

keytool -import -v -trustcacerts -alias ca_root -file ca.crt -keystore d:/ trust .keystore

可以先将CA的根證書ca.crt導入到server.keystore中 在導入server.crt試試看能不能取代密鑰倉庫原有的證書鍊。取代上面括号中的 keytool -import -v -alias caroot -file ca.crt -keystore d:/server.keystore keytool -import -v - trustcacerts  -alias server -file server.crt -keystore d:/server.keystore

記得有2個密鑰倉庫,一個也可以,但是配置中有2個。

然後在tomcat的server.xml中配置

<Connector port="8443" maxHttpHeaderSize="8192"

maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" disableUploadTimeout="true"

acceptCount="100" scheme="https" secure="true"

clientAuth="false" sslProtocol="TLS" keystoreFile="d:/server.keystore" keystorepass="123456"

truststoreFile="d:/trust.keystore" truststorePass="123456"/>

繼續閱讀