用openssl生成SSL使用的私鑰和證書,並自己做CA簽名


1、概念介紹:

什么是x509證書鏈

x509證書一般會用到三類文件,key,csr,crt。
Key是私用密鑰,openssl格式,通常是rsa算法。
csr是證書請求文件,用於申請證書。在制作csr文件的時候,必須使用自己的私鑰來簽署申請,還可以設定一個密鑰。

crt是CA認證后的證書文件(windows下面的csr,其實是crt),簽署人用自己的key給你簽署的憑證。

概念

首先要有一個CA根證書,然后用CA根證書來簽發用戶證書。
用戶進行證書申請:一般先生成一個私鑰,然后用私鑰生成證書請求(證書請求里應含有公鑰信息),再利用證書服務器的CA根證書來簽發證書。
特別說明:
(1)自簽名證書(一般用於頂級證書、根證書): 證書的名稱和認證機構的名稱相同.
(2)根證書:根證書是CA認證中心給自己頒發的證書,是信任鏈的起始點。任何安裝CA根證書的服務器都意味着對這個CA認證中心是信任的。
數字證書則是由證書認證機構(CA)對證書申請者真實身份驗證之后,用CA的根證書對申請人的一些基本信息以及申請人的公鑰進行簽名(相當於加蓋發證書機構的公章)后形成的一個數字文件。數字證書包含證書中所標識的實體的公鑰(就是說你的證書里有你的公鑰),由於證書將公鑰與特定的個人匹配,並且該證書的真實性由頒發機構保證(就是說可以讓大家相信你的證書是真的),因此,數字證書為如何找到用戶的公鑰並知道它是否有效這一問題提供了解決方案。

2、實際實踐

奇怪的地方在於,我用brpc的ssloption加載server.crt和server.key,會報:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca 錯誤,client端使用python request.get會報

requests.exceptions.SSLError: HTTPSConnectionPool(host='localhost', port=8288): Max retries exceeded with url: /GeneralClassifyService/process (Caused by SSLError(SSLError(1, '_ssl.c:504: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed'),))

后來使用了二中的ca.key.pem和ca.cert.pem,同時在請求時

verify="../../cret6/ca.cert.pem"
cert=('../../cret6/client.cert.pem', '../../cret6/client.key.pem')
res = requests.get(url, data=json.dumps(demo), verify=verify)

這樣才請求成功

一、自簽名的情況,RSA的公鑰私鑰只有一對,用私鑰對公鑰證書做簽名。而我們的場景是,自己做CA,有一個CA的公鑰私鑰對。 而socket的服務端也有一個公鑰私鑰對。 用CA的私鑰對socket服務端的公鑰證書做簽名。
1、創建key,沒有用des3加密

openssl genrsa -out ca.key 1024

2、需要在提示之下輸入許多信息,包括國家代碼,省份,城市,公司機構名等

openssl req -new -x509 -days 36500 -key ca.key -out ca.crt

3、生成server端的私鑰key:

openssl genrsa -out server.key 1024

4、生成server端的req文件(這一步生成的req文件,包含公鑰證書,外加身份信息,例如國家,省份,公司等。用它提交給ca,讓ca來對它做簽名 ):

openssl req -new -key server.key -out server.csr

5、用CA的私鑰對server的req文件做簽名,得到server的證書:

openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt

 二、使用加密的方式生成,這里每次需要輸入的密碼都是一致的。未明了的地方在,作者提示:CA的公用名不能與客戶端和服務器證書的公用名相同The Common Name for the CA cannot be the same as the Common Name for the client and server certificates.

openssl genrsa -out -des3 ca.key.pem 2048
openssl genrsa -out server.key.pem 2048
openssl genrsa -out client.key.pem 2048

openssl req -x509 -new -nodes -key ca.key.pem -sha256 -days 365 -out ca.cert.pem -subj /C=US/ST=CA/L=Somewhere/O=Someone/CN=FoobarCA

openssl req -new -sha256 -key server.key.pem -subj /C=US/ST=CA/L=Somewhere/O=Someone/CN=Foobar -out server.csr
openssl x509 -req -in server.csr -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -out server.cert.pem -days 365 -sha256

openssl req -new -sha256 -key client.key.pem -subj /C=US/ST=CA/L=Somewhere/O=Someone/CN=Foobar -out client.csr
openssl x509 -req -in client.csr -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -out client.cert.pem -days 365 -sha256

轉自:https://stackoverflow.com/questions/53104296/unknown-ca-with-self-generated-ca-certificates-and-client-server

三、去除加密的方法

(1)添加密碼

openssl rsa -aes256 -in your.key -out your.encrypted.key
mv your.encrypted.key your.key
chmod 600 your.key

-aes256表明使用AES256加密,加密算法共有:aes128aes192aes256camellia128camellia192camellia256des (which you definitely should avoid), des3 or idea

(2)去除密碼

openssl rsa -in your.key -out your.open.key

會需要輸入一次密碼

轉自:https://security.stackexchange.com/questions/59136/can-i-add-a-password-to-an-existing-private-key

四、密鑰證書的一些工具

(1)查看證書內容:

openssl x509 -in mycacert.crt -text 

-pubkey:打印公鑰信息

-subject:打印出請求信息中申請者的信息值

(2)使用CA驗證server證書

openssl verify -CAfile ca.cert.pem server.cert.pem

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM