openssl基本原理 + 生成證書 + 使用實例

来源:https://www.cnblogs.com/hanxiaofei/archive/2018/05/13/9031749.html
-Advertisement-
Play Games

轉載自 https://blog.csdn.net/oldmtn/article/details/52208747 【oldmtn】 1. 基本原理 參考:http://www.cnblogs.com/phpinfo/archive/2013/08/09/3246376.html == Begin  ...


 

------轉載自 https://blog.csdn.net/oldmtn/article/details/52208747 【oldmtn

1. 基本原理

參考:http://www.cnblogs.com/phpinfo/archive/2013/08/09/3246376.html

== Begin http://www.cnblogs.com/phpinfo/archive/2013/08/09/3246376.html ==

公司一個項目要進行交易數據傳輸,因為這個項目銀行那邊也是剛剛開始啟動,所有的支持只有一個傳輸欄位的說明文檔,好吧,總的有人做事不是嘛,於是介面開發正式展開,第一步的難點就是加密解密,我選擇使用OpenSSL.

OpenSSL初接觸的人恐怕最難的在於先理解各種概念

  公鑰/私鑰/簽名/驗證簽名/加密/解密/非對稱加密

  我們一般的加密是用一個密碼加密文件,然後解密也用同樣的密碼.這很好理解,這個是對稱加密.而有些加密時,加密用的一個密碼,而解密用另外一組密碼,這個叫非對稱加密,意思就是加密解密的密碼不一樣.初次接觸的人恐怕無論如何都理解不了.其實這是數學上的一個素數積求因數的原理的應用,如果你一定要搞懂,百度有大把大把的資料可以看,其結果就是用這一組密鑰中的一個來加密數據,可以用另一個解開.是的沒錯,公鑰和私鑰都可以用來加密數據,相反用另一個解開,公鑰加密數據,然後私鑰解密的情況被稱為加密解密,私鑰加密數據,公鑰解密一般被稱為簽名和驗證簽名.

  因為公鑰加密的數據只有它相對應的私鑰可以解開,所以你可以把公鑰給人和人,讓他加密他想要傳送給你的數據,這個數據只有到了有私鑰的你這裡,才可以解開成有用的數據,其他人就是得到了,也看懂內容.同理,如果你用你的私鑰對數據進行簽名,那這個數據就只有配對的公鑰可以解開,有這個私鑰的只有你,所以如果配對的公鑰解開了數據,就說明這數據是你發的,相反,則不是.這個被稱為簽名.

  實際應用中,一般都是和對方交換公鑰,然後你要發給對方的數據,用他的公鑰加密,他得到後用他的私鑰解密,他要發給你的數據,用你的公鑰加密,你得到後用你的私鑰解密,這樣最大程度保證了安全性.

  RSA/DSA/SHA/MD5

  非對稱加密的演算法有很多,比較著名的有RSA/DSA ,不同的是RSA可以用於加/解密,也可以用於簽名驗簽,DSA則只能用於簽名.至於SHA則是一種和md5相同的演算法,它不是用於加密解密或者簽名的,它被稱為摘要演算法.就是通過一種演算法,依據數據內容生成一種固定長度的摘要,這串摘要值與原數據存在對應關係,就是原數據會生成這個摘要,但是,這個摘要是不能還原成原數據的,....,正常情況下是這樣的,這個演算法起的作用就是,如果你把原數據修改一點點,那麼生成的摘要都會不同,傳輸過程中把原數據給你再給你一個摘要,你把得到的原數據同樣做一次摘要演算法,與給你的摘要相比較就可以知道這個數據有沒有在傳輸過程中被修改了.

  實際應用過程中,因為需要加密的數據可能會很大,進行加密費時費力,所以一般都會把原數據先進行摘要,然後對這個摘要值進行加密,將原數據的明文和加密後的摘要值一起傳給你.這樣你解開加密後的摘要值,再和你得到的數據進行的摘要值對應一下就可以知道數據有沒有被修改了,而且,因為私鑰只有你有,只有你能解密摘要值,所以別人就算把原數據做了修改,然後生成一個假的摘要給你也是不行的,你這邊用密鑰也根本解不開.

   CA/PEM/DER/X509/PKCS

  一般的公鑰不會用明文傳輸給別人的,正常情況下都會生成一個文件,這個文件就是公鑰文件,然後這個文件可以交給其他人用於加密,但是傳輸過程中如果有人惡意破壞,將你的公鑰換成了他的公鑰,然後得到公鑰的一方加密數據,不是他就可以用他自己的密鑰解密看到數據了嗎,為瞭解決這個問題,需要一個公證方來做這個事,任何人都可以找它來確認公鑰是誰發的.這就是CA,CA確認公鑰的原理也很簡單,它將它自己的公鑰發佈給所有人,然後一個想要發佈自己公鑰的人可以將自己的公鑰和一些身份信息發給CA,CA用自己的密鑰進行加密,這裡也可以稱為簽名.然後這個包含了你的公鑰和你的信息的文件就可以稱為證書文件了.這樣一來所有得到一些公鑰文件的人,通過CA的公鑰解密了文件,如果正常解密那麼機密後裡面的信息一定是真的,因為加密方只可能是CA,其他人沒它的密鑰啊.這樣你解開公鑰文件,看看裡面的信息就知道這個是不是那個你需要用來加密的公鑰了.

  實際應用中,一般人都不會找CA去簽名,因為那是收錢的,所以可以自己做一個自簽名的證書文件,就是自己生成一對密鑰,然後再用自己生成的另外一對密鑰對這對密鑰進行簽名,這個只用於真正需要簽名證書的人,普通的加密解密數據,直接用公鑰和私鑰來做就可以了.

  密鑰文件的格式用OpenSSL生成的就只有PEMDER兩種格式,PEM的是將密鑰用base64編碼表示出來的,直接打開你能看到一串的英文字母,DER格式是二進位的密鑰文件,直接打開,你可以看到........你什麼也看不懂!.X509是通用的證書文件格式定義.pkcs的一系列標準是指定的存放密鑰的文件標準,你只要知道PEM DER X509 PKCS這幾種格式是可以互相轉化的.

== End http://www.cnblogs.com/phpinfo/archive/2013/08/09/3246376.html ==

為了方便理解,我畫了一個圖,如下:

 

 


2. 生成證書

參考:http://zctya.blog.163.com/blog/static/1209178201251310292958/

一:生成CA證書 
目前不使用第三方權威機構的CA來認證,自己充當CA的角色。  
網上下載一個openssl軟體 
1.創建私鑰 : 
C:\OpenSSL\bin>openssl genrsa -out ca/ca-key.pem 1024  
2.創建證書請求 : 
C:\OpenSSL\bin>openssl req -new -out ca/ca-req.csr -key ca/ca-key.pem  
----- 
Country Name (2 letter code) [AU]:cn 
State or Province Name (full name) [Some-State]:zhejiang 
Locality Name (eg, city) []:hangzhou 
Organization Name (eg, company) [Internet Widgits Pty Ltd]:skyvision 
Organizational Unit Name (eg, section) []:test 
Common Name (eg, YOUR name) []:root 
Email Address []:sky 
3.自簽署證書 : 
C:\OpenSSL\bin>openssl x509 -req -in ca/ca-req.csr -out ca/ca-cert.pem -signkey ca/ca-key.pem -days 3650 
4.將證書導出成瀏覽器支持的.p12格式 : 
C:\OpenSSL\bin>openssl pkcs12 -export -clcerts -in ca/ca-cert.pem -inkey ca/ca-key.pem -out ca/ca.p12  
密碼:changeit       
.生成server證書。  
1.創建私鑰 : 
C:\OpenSSL\bin>openssl genrsa -out server/server-key.pem 1024  
2.創建證書請求 : 
C:\OpenSSL\bin>openssl req -new -out server/server-req.csr -key server/server-key.pem  
----- 
Country Name (2 letter code) [AU]:cn 
State or Province Name (full name) [Some-State]:zhejiang 
Locality Name (eg, city) []:hangzhou 
Organization Name (eg, company) [Internet Widgits Pty Ltd]:skyvision 
Organizational Unit Name (eg, section) []:test 
Common Name (eg, YOUR name) []:192.168.1.246   註釋:一定要寫伺服器所在的ip地址 
Email Address []:sky 
3.自簽署證書 : 
C:\OpenSSL\bin>openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey server/server-key.pem -CA ca/ca-cert.pem -CAkey ca/ca-key.pem -CAcreateserial -days 3650  
4.將證書導出成瀏覽器支持的.p12格式 : 
C:\OpenSSL\bin>openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey server/server-key.pem -out server/server.p12  
密碼:changeit 
.生成client證書。  
1.創建私鑰 : 
C:\OpenSSL\bin>openssl genrsa -out client/client-key.pem 1024  
2.創建證書請求 : 
C:\OpenSSL\bin>openssl req -new -out client/client-req.csr -key client/client-key.pem 
----- 
Country Name (2 letter code) [AU]:cn 
State or Province Name (full name) [Some-State]:zhejiang 
Locality Name (eg, city) []:hangzhou 
Organization Name (eg, company) [Internet Widgits Pty Ltd]:skyvision 
Organizational Unit Name (eg, section) []:test 
Common Name (eg, YOUR name) []:sky 
Email Address []:sky      註釋:就是登入中心的用戶(本來用戶名應該是Common Name,但是中山公安的不知道為什麼使用的Email Address,其他版本沒有測試) 
Please enter the following 'extra' attributes 
to be sent with your certificate request 
A challenge password []:123456 
An optional company name []:tsing  
3.自簽署證書 : 
C:\OpenSSL\bin>openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey client/client-key.pem -CA ca/ca-cert.pem -CAkey ca/ca-key.pem -CAcreateserial -days 3650  
4.將證書導出成瀏覽器支持的.p12格式 : 
C:\OpenSSL\bin>openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey client/client-key.pem -out client/client.p12  
密碼:changeit 

== End 參考==

請一定嚴格根據裡面的步驟來,待實驗成功後,修改你自己想要修改的內容。我就是一開始沒有安裝該填寫的來,結果生成的證書就無法配對成功。

 

3. C++實戰例子

參考:http://hoytluo.blog.51cto.com/1154435/564822/

 

== Begin 參考==

近來研究如何使用openssl進行編程,下麵是一些概要。

1.使用相同的ca生成兩個證書,一個是server.cer,一個是client.cer,註意生成server.cer的時候必須指明證書可以用於服務端的。

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 瞭解 "structc https://github.com/wangzhione/structc" structc 是 C 構建基礎項目框架. 不是太驚艷, 但絕對是 C 簡單項目中一股清流. 它的前身是 simplec 框架. "simplec https://github.com/wangzh ...
  • STM32F103C8T6工程模板 https://pan.baidu.com/s/1jAgJQCUmFg7NtpX5bOkCWQ STM32F103ZET6工程模板 ...
  • lASP.NET MVC系列文章 【01】淺談Google Chrome瀏覽器(理論篇) 【02】淺談Google Chrome瀏覽器(操作篇)(上) 【03】淺談Google Chrome瀏覽器(操作篇)(下) 【04】淺談ASP.NET框架 【05】淺談ASP.NET MVC運行過程 【06】淺 ...
  • 1.引言 2.位運算基礎 3.位運算在角色許可權設計中的應用 4.為什麼in32的範圍是-2^31 ~ 2^31-1 ? 5.同餘的概念 6.模的概念幫助理解補數和補碼。 一、引言 這周在做一個新增角色許可權需求時,遇到下麵這樣一行代碼,這篇文章將圍繞這行代碼展開。 二、位運算基礎 關於位運算的基礎知識 ...
  • C 語言特性發展史 Intro 本文主要總結介紹C 每個版本帶來的不同的語言特性。 C ,讀作C Sharp,是微軟推出的一種基於.NET平臺的、面向對象的高級編程語言。是微軟公司在2000年發佈的一種新的編程語言,主要由安德斯·海爾斯伯格(Anders Hejlsberg)主持開發,它是第一個面向 ...
  • 近期想對自己的項目增加自動編譯並生成nuget包,網上資料不少。但總還有迷糊的時候。首先:此解決方案包含多種版本的項目,如:有編譯必須是x86平臺,以及還有傳統的.net foramework項目,以及多版本的.net core項目等。找到通用的解決方案還是用了不少的時間。本文章就對此做下自我總結。... ...
  • 1. NetCore ZKweb 在我第一次繪製圖形驗證碼時是採用的ZKweb的繪製庫,奉上代碼參考 這個開始用的還不錯,但是今天更新了VS到15.7版這個就產生了一個很噁心的問題,ZKweb的引用庫和項目自帶的Core.All好幾個dll衝突,這兩個一個是ZKweb的依賴庫一個是項目的依賴庫 都沒 ...
  • 新的業務來了,需要使用linux環境部署web服務,作為一個C#的懶惰程式員,就這麼上了車【狗臉】,廢話不多說,跟我一樣的小白請看,大神請繞路。 站點暫時沒有使用Docker部署,為什麼呢,因為我還沒搞清楚哇,攤手~ 目標 VS2017+Core2.0+bootstrap+vue+ubuntu14. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...