[https][openssl] OpenSSL 公鑰、私鑰以及自簽名證書

 

轉自:https://www.zybuluo.com/muyanfeixiang/note/392079html

簡介

公鑰私鑰用來互相加解密的一對密鑰,通常是採用RSA非對稱算法。公鑰加密的私鑰能解密,私鑰加密的公鑰能解密。關於公私鑰更多內容,網上都有就不詳細介紹。算法

關於CA證書,是由第三方機構下發的,能夠對私鑰簽名附加上機構信息。瀏覽器就能夠在https協議中經過該證書信任第三分站點。固然也能夠本身生成根證書來簽發子證書。c#

 

操做

 

生成根證書

1.首先生成私鑰瀏覽器

 
  1. openssl genrsa -out root.key 2048

該命含義以下: 
genrsa——使用RSA算法產生私鑰 
-aes256——使用256位密鑰的AES算法對私鑰進行加密(以忽略) 
-out——輸出文件的路徑 
2048——指定私鑰長度 
2.生成根證書籤發申請文件(csr文件)ide

 
  1. openssl req -new -key root.key -out root.csr -subj "/C=CN/ST=ShangHai/L=ShangHai/O=Yunan International Trust Company/OU=Internet Finance/CN=YNTRUST"

該命令含義以下: 
req——執行證書籤發命令 
-new——新證書籤發請求 
-key——指定私鑰路徑 
-out——輸出的csr文件的路徑 
-subj——證書相關的用戶信息(subject的縮寫) 
3.自簽發根證書(cer文件)工具

 
  1. openssl x509 -req -days 3000 -sha1 -extensions v3_ca -signkey root.key -in root.csr -out root.cer

該命令的含義以下: 
x509——生成x509格式證書 
-req——輸入csr文件 
-days——證書的有效期(天) 
-sha1——證書摘要採用sha1算法 
-extensions——按照openssl.cnf文件中配置的v3_ca項添加擴展 
-signkey——簽發證書的私鑰 
-in——要輸入的csr文件 
-out——輸出的cer證書文件 
使用的-extensions值爲v3_ca,v3_ca中指定的basicConstraints的值爲CA:TRUE,表示該證書是頒發給CA機構的證書。post

到此就完成了根證書的生成。編碼

 

使用根證書籤發服務端證書

和生成根證書的步驟相似,這裏就再也不介紹相同的參數了。 
1.生成服務端私鑰(能夠給商戶客戶)加密

 
  1. openssl genrsa -out private/server-key.pem 2048

2.生成證書請求文件url

 
  1. openssl req -new -key private/server-key.pem -out private/server.csr -subj "/C=CN/ST=ShangHai/L=ShangHai/O=Yunan International Trust Company/OU=Internet Finance/CN=YNTRUST"

3.使用根證書籤發服務端證書(此時證書只有公鑰,沒有私鑰)

 
  1. openssl x509 -req -days 3000 -sha1 -extensions v3_req -CA root_cert/root.cer -CAkey root_cert/root.key -CAserial ca.srl -CAcreateserial -in private/server.csr -out private/server.cer

這裏有必要解釋一下這幾個參數: 
-CA——指定CA證書的路徑 
-CAkey——指定CA證書的私鑰路徑 
-CAserial——指定證書序列號文件的路徑 
-CAcreateserial——表示建立證書序列號文件(即上方提到的serial文件),建立的序列號文件默認名稱爲-CA,指定的證書名稱後加上.srl後綴 
注意:這裏指定的-extensions的值爲v3_req,在OpenSSL的配置中,v3_req配置的basicConstraints的值爲CA:FALSE 
4.將上一步的證書轉換爲der格式(二進制格式,不能文本打開)

 
  1. openssl x509 -outform der -in test-private/server.cer -out private/publicserver.ccertificate.der
 

證書格式的轉換

以上生成的公私鑰和證書都是PEM格式的,但不少時候不一樣場景中還須要用到其餘格式的證書:

 
  1. p12pfx

p12/pfx是按照PKCS#12編碼的對象,它一般由X.509證書和對應的私鑰組成。生成p12格式的方法以下:

 
  1. openssl pkcs12 -export -in server.cer -inkey server-key.pem -out server.pfx

因爲文件中保存了私鑰,所以執行該命令,openssl會要求用戶輸入密碼,用於保護私鑰。

 

從私鑰導出公鑰

 
  1. openssl rsa -in server-key.pem -pubout -outform PEM -out server-key-pub.pem
 

c#操做簽名和驗證

 
  1. X509Certificate2 pri = new X509Certificate2(@"D:\self_cerf\certs\000191400205798.pfx", "123456"); //讀取簽名私鑰
  2. var testData = Encoding.UTF8.GetBytes("liuyanbin");
  3. RSACryptoServiceProvider rsaObj = null;
  4. if (pri.HasPrivateKey)
  5. {
  6. rsaObj = (RSACryptoServiceProvider)pri.PrivateKey;
  7. var signature = rsaObj.SignData(testData, new SHA1CryptoServiceProvider());//使用SHA1算法得到摘要並進行簽名
  8. //var pri_pub = (RSACryptoServiceProvider)pri.PublicKey.Key;
  9. //var ss = rsaObj.VerifyData(testData, new SHA1CryptoServiceProvider(), signature);
  10. var rsa = PemKeyUtils.GetRSAProviderFromPemFile(@"D:\self_cerf\private\server-key-pub.pem");//獲取公鑰
  11. var result = rsa.VerifyData(testData, new SHA1CryptoServiceProvider(), signature);//驗證簽名
  12. }

PemKeyUtils代碼詳見公鑰相關代碼

 

-------------------  update @ 20170515  -----------------------------------

生成帶密碼的私鑰(請注意:這個方法是錯誤的!!!):

/home/tong/Keys/https/test [tong@T7] [17:38]
> openssl genrsa -out server-withpass.pem -passout pass:one1234 2048 
Generating RSA private key, 2048 bit long modulus
....................+++
..+++
e is 65537 (0x010001)

密碼參數的格式: man 1 openssl 

  -------------  4 hours later  ------------

發現各類詭異問題,始終感受加密沒有成功。。。。。 原來。。。。 真的沒有成功。。。尼瑪。。。請看 man genrsa 的這一段:

       -aes128|-aes192|-aes256|-camellia128|-camellia192|-camellia256|-des|-des3|-idea
           These options encrypt the private key with specified cipher before outputting it. If none of these options is specified no encryption is used. If
           encryption is used a pass phrase is prompted for if it is not supplied via the -passout argument.

 

因而,從新修改上邊的命令:

/home/tong/Keys/https/test [tong@T7] [20:46]
> openssl genrsa -out server-withpass.pem -des3 -passout pass:one1234 2048
Generating RSA private key, 2048 bit long modulus
..+++
.........+++
e is 65537 (0x010001)

 

 怎麼驗證有沒有加密呢?加密成沒成功?

1. 導出一下公鑰,若是有加密,必定會和你要密碼的

/home/tong/Keys/https/test [tong@T7] [9:23]
> openssl rsa -in server-withpass.pem -pubout
Enter pass phrase for server-withpass.pem:

2.  cat 一下,就能夠看出來了。加了密的和沒加密的內容不一樣

/home/tong/Keys/https/test [tong@T7] [9:25]
> cat server-withpass.pem 
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,83CB22577C5385B6

fwFmtRTl8tZhL7MLOQk0LwaL5IFZWel0x
...... ......
69hch0TG+LsnMdNTkbQtwbBIaZGvafwL2ir7VNxHjM1N0Nw
-----END RSA PRIVATE KEY-----

/home/tong/Keys/https/test [tong@T7] [9:26]
> cat server-key.pem 
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAxImkuzjwDrtKkvGN78/s
...... ......
a55nnYhvTpDqsLZtRFitPTP27q9LDns=
-----END RSA PRIVATE KEY-----

 

更對內容:

[ipsec][strongswan] 用strongswan pki工具生成自簽名證書

 

[ipsec][crypto] 有點不一樣的數字證書究竟是什麼

相關文章
相關標籤/搜索