轉載請標明出處:http://blog.csdn.net/shensky711/article/details/52225073
本文出自: 【HansChen的博客】
用openssl指令逐步生成各個文件
- 生成服務器密鑰:openssl genrsa -out server_private.key 2048
- 從密鑰生成公鑰(非必須):openssl rsa -in server_private.key -pubout > server_public.key
- 生成證書請求文件,這裏會讓你輸入一堆信息,比如組織名稱、個人信息等:openssl req -new -key server_private.key -out server_req.csr
初始化CA環境
mkdir demoCA cd demoCA mkdir certs crl newcerts touch index.txt serial echo 00 > serial cd ..
生成ca密鑰:openssl genrsa -out ca.key 2048
- 生成ca證書:openssl req -new -x509 -key ca.key -out ca.crt
- 用ca對服務器證書請求文件進行簽名:openssl ca -in server_req.csr -out server.crt -cert ca.crt -keyfile ca.key -config /usr/ssl/openssl.cnf
- 可以把服務端的私鑰和已簽名的證書合併到一個pkcs12格式的文件:openssl pkcs12 -export -out server.pfx -inkey server_private.key -in server.crt
- 也可以把pkcs12格式轉化爲java常用的jks格式:keytool -importkeystore -v -srckeystore server.pfx -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore server.jks -deststoretype jks -deststorepass 123456
用keytool生成
keytool主要可以幫我們:
- 創建一個新的JKS(Java Key Store)文件(裏面包含了一個新生成的服務器密鑰)
- 導出一個CSR(Certificate Signung Request)證書申請文件
- 導入一個簽名後的證書文件到jks文件中
以下是操作步驟:
- 生成新的jks文件:keytool -genkeypair -alias server -keyalg RSA -keystore server.jks
- 到出證書請求文件:keytool -certreq -alias server -file server.csr -keystore server.jks
- 用ca對請求文件進行簽名(ca的生成請參考上面):openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config demoCA/config/openssl.cnf
- 導入已簽名的證書到jks:keytool -importcert -alias server -file server.crt -keystore server.jks
這樣,我們就得到了一個包含了服務器密鑰以及已簽名證書的jks文件了
最終生成的文件
最終服務端需要用到的文件有:
1. 服務器私鑰
2. 經過CA簽名的證書(包含服務器公鑰、基本信息)
客戶端需要用到的文件有:
1. CA的證書(包含了CA的公鑰,用以對服務器的證書解密,校驗證書真僞)
有些服務器配置可以使用私鑰+證書合併在一起的文件,如jks或者pkcs12文件,這類文件一般叫key.keystore。客戶端使用的ca證書一般稱爲:truststore
遇到的問題
openssl對證書籤名的時候有可能報國家、組織、地區需一致的錯誤,是因爲在openssl.cfg中的policy_match裏面的前三個都選了match,可以修改optional,修改後就可以了