轉自:https://www.zybuluo.com/muyanfeixiang/note/392079html
公鑰私鑰用來互相加解密的一對密鑰,通常是採用RSA非對稱算法。公鑰加密的私鑰能解密,私鑰加密的公鑰能解密。關於公私鑰更多內容,網上都有就不詳細介紹。算法
關於CA證書,是由第三方機構下發的,能夠對私鑰簽名附加上機構信息。瀏覽器就能夠在https協議中經過該證書信任第三分站點。固然也能夠本身生成根證書來簽發子證書。c#
1.首先生成私鑰瀏覽器
openssl genrsa -out root.key 2048
該命含義以下:
genrsa——使用RSA算法產生私鑰
-aes256——使用256位密鑰的AES算法對私鑰進行加密(以忽略)
-out——輸出文件的路徑
2048——指定私鑰長度
2.生成根證書籤發申請文件(csr文件)ide
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文件)工具
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.生成服務端私鑰(能夠給商戶客戶)加密
openssl genrsa -out private/server-key.pem 2048
2.生成證書請求文件url
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.使用根證書籤發服務端證書(此時證書只有公鑰,沒有私鑰)
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格式(二進制格式,不能文本打開)
openssl x509 -outform der -in test-private/server.cer -out private/publicserver.ccertificate.der
以上生成的公私鑰和證書都是PEM格式的,但不少時候不一樣場景中還須要用到其餘格式的證書:
p12/pfx
p12/pfx是按照PKCS#12編碼的對象,它一般由X.509證書和對應的私鑰組成。生成p12格式的方法以下:
openssl pkcs12 -export -in server.cer -inkey server-key.pem -out server.pfx
因爲文件中保存了私鑰,所以執行該命令,openssl會要求用戶輸入密碼,用於保護私鑰。
openssl rsa -in server-key.pem -pubout -outform PEM -out server-key-pub.pem
X509Certificate2 pri = new X509Certificate2(@"D:\self_cerf\certs\000191400205798.pfx", "123456"); //讀取簽名私鑰
var testData = Encoding.UTF8.GetBytes("liuyanbin");
RSACryptoServiceProvider rsaObj = null;
if (pri.HasPrivateKey)
{
rsaObj = (RSACryptoServiceProvider)pri.PrivateKey;
var signature = rsaObj.SignData(testData, new SHA1CryptoServiceProvider());//使用SHA1算法得到摘要並進行簽名
//var pri_pub = (RSACryptoServiceProvider)pri.PublicKey.Key;
//var ss = rsaObj.VerifyData(testData, new SHA1CryptoServiceProvider(), signature);
var rsa = PemKeyUtils.GetRSAProviderFromPemFile(@"D:\self_cerf\private\server-key-pub.pem");//獲取公鑰
var result = rsa.VerifyData(testData, new SHA1CryptoServiceProvider(), signature);//驗證簽名
}
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-----
更對內容: