一、前言
進入21世紀,人們的生活已經嚴重依賴于網際網路,衣、食、住、行,網際網路已經滲透到生活的第一個角落,這也給某些不良網民們提供了一個絕佳的環境去竊取我們的資訊,讓我們的資訊不再安全。為了應對這些hacker和script boys,我們的白帽們也一直在努力,從沒松懈過。
因為我還距白帽的能力有些差距,是以這裡就簡單介紹一下網際網路的加密、解密方式、openssl的基本應用及CA的實作過程。
二、加密方式
1、對稱加密
對稱加密是基于加密算法+密碼的,它主要有兩個特性:
1)、加密方、解密方使用同一個密碼
2)、将原文分割成固定大小的塊,對這些塊進行加密
在加密資料時,由于逐字元加密速度實在是太慢了,是以就選擇了對其按塊進行加密,而且在加密時通常把第一個塊加密以後,再把第二個塊加密,将第一個塊加密後的結果與第二個塊加密之後的結果做異或運算,然後再做為第二個塊的輸出,前後塊形成了塊鍊。是以如果想要看第一塊的内容,必須拿到前一個塊做異或運算,才能得到結果。
對于一些大的購物網站來說,它需要儲存每個使用者的密鑰,這就造成了一定的麻煩。而且在資料傳輸的過程中是很容易被竊取并篡改,然後進行字典攻擊,無法保證使用者身份認證和資料的完整性的。
一些對稱加密算法:
DES:通用加密标準,56bits密鑰
3DES(triple):進行3輪EDS,
AES:進階加密标準,128bits密鑰
Blowfish,Twofish,IDEA,RC6,CAST5,Serpent
2、非對稱加密
非對稱加密會在本地生成一對密鑰對兒:公鑰和私鑰。公鑰任何人都可以擁有,但私鑰隻有自己擁有,既然有了私鑰,那就可以實作身份認證了。
非對稱加密的特性
1)、密鑰交換
2)、身份認證
公鑰證書,通常簡稱為證書,是一種數字簽名的聲明,它将公鑰的值綁定到持有對應私鑰的個人、裝置或服務的辨別。證書的主要好處之一是主機不必再為單個使用者維護一套密碼,這些單個使用者進行通路的先決條件是需要通過身份驗證。相反,主機隻需在證書頒發者中建立信任。大多數普通用途的證書基于 X.509 v3 證書标準。
是以,對于伺服器而言,在與使用者進行互動的過程中,需要時直接管使用者要其公鑰就可以了,隻有其對應的私鑰才能解密,再也不需要記錄那麼多的密鑰了。在密鑰交換的過程中,依然存在密鑰被截取、僞造。
另外,就算法本身的實作來講,公鑰加密技術比對稱加密技術的速度慢上差不多3個數量級,一個數量級就是10倍,是以3個數量級不是30倍,而是1000倍。是以,在加密資料時是很少用到公鑰去加密的。同樣的,私鑰加密也會很慢。
一些非對稱加密算法:
RSA,EIGamal,ESA
3、單向加密
單向加密是提取資料的特征碼,保證了資料的完整性
特性:
1)、one-way:單向的
2)、collision-free
3)、資料完整性
就好比我們在網際網路上下載下傳東西一樣,好多網站都會提供一個MD5碼,我們把下載下傳下來的資料做一個MD5運算就會得到一個特征碼,隻要這個特征碼與網站提供的一樣,那麼就說明這個資料沒有被修改過,那如果二都不一緻,那肯定就是被修改過了的。這也就是傳說中的單向性和雪崩效應,微小的改變會導緻結果的巨大變化。
一些單向加密算法:
MD5:128bits
sha1:160bits
sha512:512bits
三、加密方式詳解
就上面三種加密方式而言,單單使用哪一種都不能保證資料的完整性和身份認證。尤其在當今網際網路上的資訊傳輸一定得保證私密性、身份認證和資料完整性。
下面用一張圖來詳解一下當今網際網路加密、解密的流程:
Bob傳送資料給Alice
<a href="http://s3.51cto.com/wyfs02/M01/22/50/wKioL1Ma6CaRvYXXAAHYqTbXyiU486.png" target="_blank"></a>
解釋:
加密過程:
1)、使用單向加密技術加密資料,生成一個特征碼。保證了資料的完整性。
2)、用Bob的私鑰對生成的特征碼進行加密。隻有Bob有其私鑰,保證了身份認證。
3)、對資料和加密過的特征碼進行對稱加密。
4)、用Alice的公鑰加密上一步得到的對稱加密密碼。
解密過程:
1)、使用Alice的私鑰先解密對稱加密密碼。
2)、用得到的對稱加密密碼去解密加密了的資料和特征碼。
3)、使用單向加密算法加密上一步解密出來的資料。
4)、使用Bob的公鑰去解密特征碼,得到在Bob發送資料的特征碼。
5)、比較3,4步中的特征碼是否一緻。
存在問題:
雖然用了這麼多步加密算法去加密整個過程,但在資料的傳輸過程中還是存在漏洞的。因為Bob和Alice的公鑰依然會在網上傳輸,是以這兩個公鑰仍然有可能被竊取、掉包。這個過程還是不完美的,這就需要一個權威的第三方認證機構CA來給他們發證。
四、openssl的基本應用
SSL是Secure Socket Layer(安全套接層)的縮寫,可以在Internet上提供秘密性傳輸。OpenSSL實作了SSL協定的SSLv2和SSLv3,支援了其中絕大部分算法協定。openssl是一個多功能指令工具,可生成密鑰、建立數字證書、手動加密解密資料。這裡先介紹openssl的基本使用,接着就使用openssl去建立CA。想要檢視openssl的指令,可以使用openssl ?。
1、标準指令:
enc,dgst,genrsa,rsautl,req,ca,rsa,passwd
2、opensll提供的算法
1)、對稱加密算法
DES 3DES AES Blowfish Twofish IDEA RC6 CAST5 Serpent
2)、非對稱加密算法
DHA RSA EIGamal DSA
3)、資訊摘要算法
MD5 SHA1 SHA512 CRC-32
4)、密鑰和證書管理
密鑰和證書管理是PKI(Public Key Infrastucture)的一個重要組成部分,OpenSSL為之提供了豐富的功能,支援多種标準。在此基礎上,OpenSSL實作了對證書的X.509标準編解碼、并提供了一種文本資料庫,支援證書的管理功能,包括證書密鑰産生、請求産生、證書簽發、吊銷和驗證等功能。OpenSSL提供的CA應用程式就是一個小型的證書管理中心(CA),實作了證書簽發的整個流程和證書管理的大部分機制。
3、使用openssl加密、解密資料
1)加密/etc/passwd,放到目前目錄下并命名為passwd.openssl。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<code>[root@nmshuishui ~]</code><code># openssl enc -des3 -a -salt -in /etc/passwd -out ./passwd.openssl</code>
<code>enter des-ede3-cbc encryption password:</code>
<code>Verifying - enter des-ede3-cbc encryption password:</code>
<code>[root@nmshuishui ~]</code><code># ls</code>
<code>anaconda-ks.cfg </code><code>install</code><code>.log </code><code>install</code><code>.log.syslog myiso </code><code>passwd</code><code>.openssl scripts soft tmp</code>
<code>[root@nmshuishui ~]</code><code># cat passwd.openssl</code>
<code>U2FsdGVkX1+oXyyFLQ034Ff6lvhFeFiYXi+2THWrHl1T5JRKq6Mvy645SpvsCVmf</code>
<code>+JCQxLdJnvGAu3YaQmIYy6biuxRR6e9TKZWt34kd5IJ7BPL71NMj</code><code>/nAbCkfdju7/</code>
<code>R479XedQRIsU2iEQJtgUbJPS08K</code><code>/gdkUlfXTBxLfOkIpxAtC/HZWcPJvIMWno6</code><code>+g</code>
<code>WnH3eh0YJymWIz9BlxzOWFyddGZZyWU3l5Qn3kOEd+2Wl</code><code>/iqAbPzEMxz/wLnxCpt</code>
<code>8pW2P7sDwixtgDPPxHnlRtfxd8+ETcit5+svAPTTt4NXLjt8ZYqK2xf+Uo20liTU</code>
<code>nYWL9S7dH0F+4hV5N0aFmySi5Lu0M5jIe96e5dctA8WiG02L0Hi9nl3JbbXF</code><code>/Fl7</code>
<code>Ns2eC</code><code>/MdqC5P362/um0BxLwamJGcTqDWTB3ltOpjbqTB2x9</code><code>+lLjxtnGKE3ZTUSjI</code>
<code>EWCbrke</code><code>/YErHnuQ35W3VmNqskCbNWs2FV1aiPraDa8C0uyElx5r5KYu2JxlSCyes</code>
<code>edXDdstk8OZKHTiKJqO2HknPMPdBZpAXbNKnM</code><code>/uKmmGOVvpJTmLzAvDACInJeNAN</code>
<code>GZ1lhP7jvNb7/+A8tLhN5Cmnz</code><code>/VK7NDppUeoxOU9ZfjSMOinTObl8R4iV738EaAw</code>
<code>pZooSxGocYA342uN9dCedrbFr7Sk3APP6MAMYXeSvPThgXPQIP9IV9hnDVEhXzqe</code>
<code>RNtuOnYUGhMql8wrlrmhGM7ye1LztTiVPHhtNSfxpxinqlGx9PEqy+UdNjgoKF2B</code>
<code>2oBX8UzFvn85I8edaKe3LUhb22FoLbAlaiPcCoFUgJb7zYfR3RF6WcOaaNy1jLc8</code>
<code>3a59Jnrf1jYgT+NQl1S5jCmQHyRtEGNdi517PlgkDSeCLbFtssZvlPcxD2rBS3HX</code>
<code>1R0HDmJME9dUq1NzY</code><code>/I4PfLbjLnIHUTsuage2PWfHxjuLmi14fUi8QotEy8qJcpo</code>
<code>LmkS3ds1t</code><code>/r9gTTldgcB/PmLKTtLNRNGQXAemMMxsVVTMrqwBcao7wtIy</code><code>+y5d6bk</code>
<code>kuonPLfmhEViSnlDq4WU7CZoSVZp+0d5VNL+y0kFExTcPLIZFOtHYUwHMzdup16L</code>
<code>YIobul9+ZFG0GnMAZ</code><code>/dqHGRwUSdswb7</code><code>+RukJyzR2mCbCwhh0sWuHL5CHeO7UH5pT</code>
<code>XyOAkuJHfx8W8s8mIrm1FN7LmpCnePZOM+sEBCbx7aibIvufn53uFT6u9vvYBxLT</code>
<code>aDPX+7H4rSx08nvx3IOxLku0aCU</code><code>/nV/hKwNqR9ycWBD/avDm</code><code>+d0RRarD3KDUwmM2</code>
<code>tRTbUwSslVR5MeXJNOr+TpSQEracAmY5OboXF6g9108kbGyKdhxgJ5nPpc6m7</code><code>/sh</code>
<code>0WnJpwfqfa+bjkJzGKcTHpbmoU2dJGuS+tMCwWj3b6sAwJIGYgJXD5VLfmTBXdfI</code>
<code>uyDcqJhqQfoxw92gqSrH4GtbxC8RVImA7Ogmv57KNIMjAcPODwsPz+8pQwGOAE8E</code>
<code>eLAFnE79VzWeqc2Xi</code><code>/J6glAy9TTuOnRDhA1wP1XV60iNUzlOxRuzzZaPRlQR6yIb</code>
<code>CWuH6Lid5i6vNIzT1J1pQwYhf</code><code>/A/dZdtB8S5/B2cFNdzG</code><code>+0rtQWdFGmhq6mb8V3R</code>
<code>wEpaVwIsxDn6TYoFmSgr3FAWin6MA8jAcewG4UYAKYtBZ2zovj0erOcoNfzd8TC6</code>
<code>dNhid3dw9EnskeHPdJoE7pNGfAFKE5vCplG5</code><code>/ooM3Ex</code><code>+mYUiJRaf0w==</code>
這個時候檢視passwd.openssl就不再是使用者資訊了,而是一堆加密過的序列。
2)passwd.openssl的解密,解密為openssl.out
<code>[root@nmshuishui ~]</code><code># openssl enc -d -des3 -a -salt -in ./passwd.openssl -out passwd.out</code>
<code>enter des-ede3-cbc decryption password:</code>
<code>anaconda-ks.cfg </code><code>install</code><code>.log </code><code>install</code><code>.log.syslog myiso </code><code>passwd</code><code>.openssl </code><code>passwd</code><code>.out scripts soft tmp</code>
<code>[root@nmshuishui ~]</code><code># cat passwd.out</code>
<code>root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>
<code>bin:x:1:1:bin:</code><code>/bin</code><code>:</code><code>/sbin/nologin</code>
<code>daemon:x:2:2:daemon:</code><code>/sbin</code><code>:</code><code>/sbin/nologin</code>
<code>adm:x:3:4:adm:</code><code>/var/adm</code><code>:</code><code>/sbin/nologin</code>
<code>lp:x:4:7:lp:</code><code>/var/spool/lpd</code><code>:</code><code>/sbin/nologin</code>
<code>sync</code><code>:x:5:0:</code><code>sync</code><code>:</code><code>/sbin</code><code>:</code><code>/bin/sync</code>
<code>shutdown</code><code>:x:6:0:</code><code>shutdown</code><code>:</code><code>/sbin</code><code>:</code><code>/sbin/shutdown</code>
<code>halt:x:7:0:halt:</code><code>/sbin</code><code>:</code><code>/sbin/halt</code>
<code>mail:x:8:12:mail:</code><code>/var/spool/mail</code><code>:</code><code>/sbin/nologin</code>
<code>uucp:x:10:14:uucp:</code><code>/var/spool/uucp</code><code>:</code><code>/sbin/nologin</code>
<code>operator:x:11:0:operator:</code><code>/root</code><code>:</code><code>/sbin/nologin</code>
<code>games:x:12:100:games:</code><code>/usr/games</code><code>:</code><code>/sbin/nologin</code>
解密後再檢視,就是原檔案的内容了。
五、使用openssl實作私有CA
1、自建CA
要使用openssl建立麼有CA,首先還是看一下openssl的配置檔案中關于CA的描述吧。配置檔案在/etc/pki/tls/openssl.cnf,這裡面主要定義了證書的存放路徑、密鑰的存放路徑、和其它一些證書相關的說明。
<a href="http://s3.51cto.com/wyfs02/M01/22/51/wKiom1MbGTShbuWrAACFNxqhe-M142.png" target="_blank"></a>
CA做為一個第三方的權威認證機構,專門是給别人發證的,要使别人信任它,需它自己有證,但現在它是一個根,是以他首先要自簽證書來證明自己的合法性,然後才能給别人頒發證書,而證書需要密鑰,是以首先要生成密鑰對兒。
1)生成密鑰對兒
公鑰是人人都可以用的,但是私鑰一定得自己儲存,不能讓别人檢視,是以當我們建立私鑰時,要讓其的權限為600,并放在子shell中去執行。這裡我們僅生成私鑰即可,不需生成公鑰,因為私鑰很長,公鑰是從私鑰中按某種格式提取出來的。
<code>[root@nmshuishui CA]</code><code># pwd</code>
<code>/etc/pki/CA</code>
<code>[root@nmshuishui CA]</code><code># ls</code>
<code>certs crl newcerts private</code>
<code>[root@nmshuishui CA]</code><code># (umask 077;openssl genrsa -out private/cakey.pem 2048)</code>
<code>Generating RSA private key, 2048 bit long modulus</code>
<code>.............................................................+++</code>
<code>.....+++</code>
<code>e is 65537 (0x10001)</code>
<code>[root@nmshuishui CA]</code><code># ls -l private/cakey.pem</code>
<code>-rw-------. 1 root root 1679 Mar 8 11:07 private</code><code>/cakey</code><code>.pem</code>
<code>[root@nmshuishui CA]</code><code>#</code>
如果想要檢視公鑰可以使用-pubout把公鑰提取出來再用-text以文本格式顯示:openssl rsa -in private/cakey.pem -pubout -text(非必要步驟)
<a href="http://s3.51cto.com/wyfs02/M02/22/52/wKioL1MbK_bDBDdsAAB5z3RZa5s705.png" target="_blank"></a>
上圖中夾在BEGIN PUBLIC KEY和END PUBLIC KEY中間的就是公鑰資訊,再上面的一些就是私鑰資訊了。
2)生成自簽證書
<a href="http://s3.51cto.com/wyfs02/M01/22/51/wKiom1MbSnbyY9vUAABc3r_O1C0024.png" target="_blank"></a>
3)建立需要的檔案
<code>[root@nmshuishui CA]</code><code># touch index.txt serial crlnumber</code>
<code>[root@nmshuishui CA]</code><code># echo 01 > serial</code>
2、用openssl實作證書申請
1)在主機上生成密鑰,儲存到應用此證書的服務的配置檔案目錄下 ,這裡應用伺服器是httpd。
<code>[root@localhost ~]</code><code># mkdir /etc/httpd/ssl</code>
<code>[root@localhost ~]</code><code># cd /etc/httpd/ssl/</code>
<code>[root@localhost ssl]</code><code># (umask 077;openssl genrsa -out httpd.key 1024)</code>
<code>Generating RSA private key, 1024 bit long modulus</code>
<code>..................++++++</code>
<code>.......++++++</code>
<code>[root@localhost ssl]</code><code>#</code>
2)生成證書簽署請求
<a href="http://s3.51cto.com/wyfs02/M02/22/51/wKiom1MbUeqAF6mQAABq-ID7dNo470.png" target="_blank"></a>
生成的.csr(cetificate signature request)是證書簽署請求。
3)将請求檔案發送CA
<a href="http://s3.51cto.com/wyfs02/M02/22/51/wKiom1MbUuPBE7H3AAAs7ghnQZo333.png" target="_blank"></a>
3、CA簽署證書
1)、簽署
<a href="http://s3.51cto.com/wyfs02/M02/22/52/wKioL1MbVEjQSq4OAACMkw_leA8744.png" target="_blank"></a>
2)、将證書傳回請求者
<a href="http://s3.51cto.com/wyfs02/M01/22/52/wKioL1MbVSOgY9u3AAAwFQAV9V8117.png" target="_blank"></a>
3)、傳回用戶端驗證檢視
<a href="http://s3.51cto.com/wyfs02/M01/22/51/wKiom1MbVbqxLKo0AAALrTSY7sk144.png" target="_blank"></a>
4、吊銷證書
吊銷後,會把吊銷的證書放到吊銷清單中。
<a href="http://s3.51cto.com/wyfs02/M02/22/51/wKiom1MbVpeTUFDCAAAhqM9Q1T8041.png" target="_blank"></a>
本文轉自 nmshuishui 51CTO部落格,原文連結:http://blog.51cto.com/nmshuishui/1370917,如需轉載請自行聯系原作者