SSL雙向認證的實現

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

?環境

系統:archlinux/centOS

nginx:nginx/1.12.2

瀏覽器:火狐firefox

?前提:1.安裝nginx。

   ? ? 2.安裝openssl。

生成證書

新建工作目錄

 首先建立一個工作目錄,這里以我的工作目錄為例。(/home/yinghui/ssl/demoCA-my/),然后執行如下命令。建立生成證書的路徑文件結構,這是由openssl的默認配置文件決定的。你可以修改配置。

mkdir demoCA-my
cd demoCA-my
touch ./{serial,index.txt}
echo '01'  > serial
mkdir ./newcerts

配置 openssl.cnf

????拷貝配置文件到工作目錄。當然前綴路徑要換成你自己的。

cp /usr/local/ssl/openssl.cnf   ./

 修改配置文件。編輯openssl.cnf中的一些選項。

  unique_subject? = no ? (這樣一個CA可以同時簽多張證書)

  countryName = optional(把這些參數的匹配規則改為可選)

  stateOrProvinceName = optional

  organizationName? = optional

  organizationalUnitName? = optional

效果:

??a0b2115381a5d8bef9b2386029f2ab5dd50.jpg

修改dir配置:注意是CA_default 下面的dir

?246834e8a3c7d3d68fd1b339f1622bec835.jpg

生成CA跟證書? ?

?現在我們來生成自己的CA跟證書

openssl req -days 365 -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf

  生成會話會讓你填入一些參數,根據實際情況填寫。執行完會發現工作目錄下會有ca.crt? ca.key兩個文件。截圖如下:

204903253925f765be1c27f06078fbe17f7.jpg

????大概說明一下上面各項的意思:?

輸入項解釋
AU國籍cn
state or province州 省份beijing
Lcality Name城市bj
O name(簡寫)公司jinxi
O ?U name(簡寫)組織jinxi360
common name通用名網址或者你的名字
Email你的郵箱

結果多了兩個文件:

5d1fc95315d7e0ff9e2f1b1ca66fd511cef.jpg ? ????

生成server端證書

  首先生成server端私鑰。執行后會要求輸入解析私鑰文件的密碼。生成server.key。

openssl genrsa -des3 -out server.key 1024

3fc8951670d6ad30c1e011e5118d90180c8.jpg  

生成證書請求

????生成會話會提示輸入一些請求信息,成功后生成server.csr

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

8c012c6f008d1d129a7fbf99d6bf705d6ff.jpg

  注意上圖中畫線的一行,這行輸入server端的域名(或者IP地址),這里是https://192.168.1.100 。否則簽發的服務端證書會被瀏覽器視為不是本站點的證書,最后兩項我這里直接回車。其他參考上面的解釋。

? ?????執行后多出一個文件server.csr

?8041f2aadebd14e1bc6c9ca31e8ede99758.jpg

  現在用生成的CA給證書請求(server.csr)簽發證書(crt文件)。根據提示輸入相關密碼(之前設置好的)和兩個 y(yes)回車,成功后生成證書server.crt

openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf

 生成的服務端證書文件: 

????1617c1d588d0c9ba6e325634e4bb50533bf.jpg

????????到這里,我們已經可以做單項認證了,來試試。

驗證單向認證

????????????配置nginx:vi /usr/local/nginx/conf/nginx.conf修改配置如下圖(注意證書和CA的路徑是我的工程路徑):

server {listen 443;#server_name abc.jinxi360.com;ssl                  on; ssl_certificate       /home/yinghui/ssl/demoCA-my/server.crt;  #服務端證書ssl_certificate_key   /home/yinghui/ssl/demoCA-my/server.key;  #服務端私鑰ssl_client_certificate /home/yinghui/ssl/demoCA-my/ca.crt;     #跟CA證書ssl_session_timeout  5m;ssl_verify_client on;  #開戶客戶端證書驗證ssl_prefer_server_ciphers   on;#add_header Strict-Transport-Security 'max-age=31536000';#access_log /var/log/nginx/adm_access.log;#error_log /var/log/nginx/adm_error.log;location / {root html;index  index.html index.htm;}  }

保存后驗證 nginx.conf配置文件:

8e375dd6775d929b3ae45176b9b4a1d0881.jpg  

啟動nginx

會要求輸入server端私鑰文件解析密碼,輸入生成時設置的密碼。

b63dbbbbfac56f2ef4c73a4afb546f4c602.jpg

???在windows下打開firefox輸入https://192.168.1.100回車。

df6325db7873a7e4f0e6474c68804eedba3.jpg

  這說明nginx已經向瀏覽器發送了自己的證書,但是這個證書不受信任。別急,現在我們把之前自己的CA導入瀏覽器。

  打開 選項->高級->查看證書->證書機構->導入。先擇CA后根據提示導入證書。成功后如下:

47214937fcbf196731a56d732fdf26d1bd6.jpg

  再次輸入https://192.168.1.100回車。

 1ad858433355316ca2739ee50ca763891e2.jpg

  看見中間那行提示了嗎?中式英語翻譯過來就是-->沒有要求的ssl證書來發送。也就是說,client已經成功認證了server端的證書,但是我們配置nginx為雙向認證,所以nginx要求瀏覽器出示證書,而瀏覽器沒有證書。

  說明單項認證已經OK,現在為client生成證書。

生成client證書

  首先生成client端私鑰,執行后會要求輸入解析私鑰文件的密碼,根據個人喜好設置。生成client.key。

openssl genrsa -des3 -out client.key 1024

0c893e3e017a987595381a0c3ab8fb2af25.jpg????

????生成證書請求。生成會話會提示輸入一些請求信息,成功后生成client.csr。

openssl req -new -key client.key -out client.csr -config openssl.cnf

ffd2268951a86e92a72581ca8386eaf55ed.jpg

????? ? 上圖中畫線的是證書在瀏覽器中顯示的名字,這里使用域名地址作為證書的名稱,上面最后兩項我直接回車。

生成客戶端crt證書:  

現在用之前生成的CA給證書請求(client.csr)簽發證書。根據提示輸入相關密碼(之前設置好的)和y(yes),成功后生成證書client.crt

openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cnf

生成p12證書:? ?

firefox要求客戶端的證書格式是p12格式,所以我們把client.crt轉化為client.p12格式

openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12

?  轉pem格式

cat ca.crt ca.key > ca.pem
cat server.crt server.key > server.pem
cat client.crt client.key > client.pem

????最后一步,把client.p12導入瀏覽器。

  打開 選項->高級->查看證書->您的證書->導入。根據提示導入,導入成功后如圖:

3cb3ebced632c852dc3777c8daf3917db58.jpg

查看證書信息:

9b35a2006588619cb619b8825d58ab64407.jpg

  輸入https://192.168.68.173:8080回車。

?

   OK!!!

go go go!

?

附:

? ? 最終目錄下的文件列表:

75da7c3cca902ef1496a94cddfa123914ac.jpg

?

?

轉載于:https://my.oschina.net/iyinghui/blog/1832914

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254296.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254296.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254296.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

partial 分部類-龐大類的瘦身計劃

文章目錄使用情況語法博主寫作不容易,孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 一般來說,一個類、結構或者接口位于一個源文件中,但是某些情況,比如大型項目、特殊部署時,可能需要把一個類、結構或者接口放…

scroll-view——小程序橫向滾動

這是官方給的布局代碼 <view class"section"><view class"section__title">vertical scroll</view><scroll-view scroll-y style"height: 200px;" bindscrolltoupper"upper" bindscrolltolower"lower"…

二期設計

電子鎖管理 設備管理 設備管理 1 信息編輯;回收電子鎖發放 電子鎖初始化&#xff0c;發放 4 記錄車輛在發車時使用的電子鎖電子鎖開鎖聯系人管理 電子鎖開鎖聯系人管理 1 根據訂單路線中的投點&#xff0c;設置每個投遞點的開鎖聯系人&#xff0c;通過短信的方式下發給你開…

音視頻同步系列文章之------時間戳與時間尺度(time scale)

根據一些文章我自己推敲了一下幾個概念如下&#xff1a; 采樣頻率是每秒鐘抽取聲波幅度樣本的次數。8000 幀率是每秒顯示幀數。 20 時間戳單位&#xff1a;時間戳計算的單位不為秒之類的單位&#xff0c;而是由采樣頻率所代替的單位&#xff0c;這…

30秒無需編碼完成一個REST API服務

JSON Server 30秒內無需編碼快速完成一個模擬的REST API服務。 這個服務主要是給那些需要快速的模擬原型后端接口的前端人員使用的 GitHub&#xff1a;github.com/typicode/js… 安裝 $ npm install -g json-server 復制代碼Example 新建一個 db.json 文件 {"posts":…

namespace-C#命名空間

博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 C#程序是利用命名空間組織起來的。命名空間既做程序的內部組織系統&#xff0c;又用做外部組織系統。就像一個國家為了便于管理&#xff0c;分成多個省份一樣。 聲明命名空間 命名空間是.NET …

NKU 專題一 題解

A - Flip Game 總的情況數只有2^16次方種&#xff0c;顯然直接bfs就可以了 1 #include<iostream>2 #include<queue>3 #include<cstring>4 using namespace std;5 int W,B,start;6 bool have[1000000];7 struct plot{8 int n,step;9 }; 10 void input(int…

僵尸進程(轉)

前面的文章中&#xff0c;我們已經了解了父進程和子進 程的概念&#xff0c;并已經掌握了系統調用exit的用法&#xff0c;但可能很少有人意識到&#xff0c;在一個進程調用了exit之后&#xff0c;該進程并非馬上就消失掉&#xff0c;而是留下一個稱為僵尸進 程&#xff08;zomb…

ComblockEngine 引擎實踐

comblockEngine 參考資料 官方網址 學習備注 熟悉內容 1.python 的字符串操作 2.flags 屬性的作用域 flags等 問題每天 1 1.基本數據類型 基本類型 2.數據庫表的操作 操作1 3.屬性的定義在.def中。self.出來之后&#xff0c;在繼承多個類的時候會不會重復。應該是子類的屬性覆蓋…

王陽明詩歌集

此心光明&#xff0c;夫復何求。&#xff08;王陽明死前對弟子的遺言&#xff09; 0. 非常少年、非常父子 山近月遠覺月小&#xff0c;便道此山大于月。若人有眼大如天&#xff0c;當見山高月更闊。—— 《蔽月山房》&#xff0c;作于12歲&#xff1b;1. 中秋 吾心自有光明月&a…

子承父業-C#繼承

文章目錄繼承的定義和使用實例繼承的特性繼承的可傳遞性繼承的單一性繼承中的訪問修飾符base和this關鍵字basethis實例博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 繼承是軟件復用的一種形式。使用繼承可以復用現在類的數據和行為&#xff…

MAVEN創建并打包web項目

maven項目是由一個maven project和多個maven module組成的&#xff0c;以下簡介一下maven webapp的創建和打包&#xff0c;前提是你已經安裝配置好maven了。打開eclipse。依照例如以下操作&#xff1a; 我們首先當然要先創建一個project。如上圖選擇。 如今maven project已經創…

GNU gcc的編譯工具用法(轉)

對大多數不從事Linux平臺C語言開發的人來說&#xff0c;GNU gcc的一套工具和Linux平臺的共享庫的使用還是十分陌生的&#xff0c;其實我也不太熟悉&#xff0c;姑且寫點基礎知識&#xff0c;權當做備忘吧。 一、GNU gcc的編譯工具用法 我們先來寫一個簡單的C程序&#xff1a;…

學界 | CVPR 2018頒布五大獎項,何愷明獲年輕學者獎

年度計算機視覺和模式識別盛會CVPR&#xff08;Conference on Computer Vision and Pattern Recognition&#xff09;在美國鹽湖城開幕啦&#xff01; 據統計&#xff0c;本屆大會有超過3309篇大會論文投稿&#xff0c;接收979篇論文。 面對如此多的論文評審任務&#xff0c;CV…

virtual、override-蝌蚪和青蛙-C#多態

文章目錄多態的概念多態的實現方法重載、重寫、隱藏重載重寫隱藏博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 多態的概念 什么是多態&#xff1f; 多態一次最早用于生物學&#xff0c;指同一種族的生物具有不同的特性。比如青蛙小時候是蝌…

jvm--3.內存管理

5.JVM內存管理 JAVA虛擬機在執行java程序的過程中&#xff0c;會把它管理的內存分成若干個不同的數據區域。 ------------------------------------------------------------------------------------— | 運行時數據區 | | ----------- -------- ----------------- | | | 方法…

[BZOJ2458][BeiJing2011]最小三角形

題目描述 Description Xaviera現在遇到了一個有趣的問題。平面上有N個點&#xff0c;Xaviera想找出周長最小的三角形。由于點非常多&#xff0c;分布也非常亂&#xff0c;所以Xaviera想請你來解決這個問題。為了減小問題的難度&#xff0c;這里的三角形也包括共線的三點。 輸…

Makefile中的變量

Makefile中的變量 2007-11-03 12:03Makefile中變量有以下幾個特征&#xff1a; 1. Makefile中變量和函數的展開&#xff08;除規則命令行中的變量和函數以外&#xff09;&#xff0c;是在make讀取makefile文件時進行的&#xff0c;這里的變量包括了使用“”定義和使用指示符“d…

小技巧集錦

2019獨角獸企業重金招聘Python工程師標準>>> jackson JsonDeserialize 使用方法&#xff1a; 實現方法注解寫在set方法上。 public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {private SimpleDateFormat datetimeFormat new SimpleD…

interface-C#接口-統一的標準

文章目錄接口的定義接口的實現實例1實例2接口的繼承博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 接口是面向對象編程的一個重要技術&#xff0c;在C#中負責實現多重繼承。一個接口定義一個協定&#xff0c;實現接口類或結構體必須遵守其協定…