在網際網路資料傳輸過程中,資料的安全私密性是及其重要的,是以就有資料的加密和解密過程;
加密方式
一、對稱加密:
特性:
1、加密方/解密方使用同一個密碼
2、将原文分割成固定大小的資料塊,對這些塊進行加密,資料塊前後會有關聯關系
缺陷:
1、密鑰無法交換
2、無法進行身份驗證
3、無法保證資料完整性
加密算法:
DES(56bits):資料加密标準
AES(128):進階加密标準
3DES:相當于對每個資料塊應用三次DES加密算法
工具:gpg,openssl enc
二、非對稱加密(公鑰加密)
1、密鑰交換(需要在網際網路傳輸密鑰)
2、使用者身份認證(對方的私鑰加密的隻有對方的公鑰能解密)
資料加密過程很慢
加密算法:RSA,EIGamal,DSA
密鑰交換(IKE: Internet Key Exchange)DH算法:
A,B雙方使用一個較大的質數(p)和一個生成器(g),在各自選擇一個數字A(x),B(y)
A=g^x%p B=g^y%p;二者交換結果後再對各自標明的數字進行次方取值
(g^y%p)^x = (g^x%p)^y;至此完成了密鑰交換,并且沒有直接傳輸密鑰。
工具:gpg,openssl rsautl
三、單向加密
特性:抽取資料特征碼
1、One-Way
2、Collision-free
無法保證資料私密性
MD5,SHA1,SHA512,CRC-32(無法保證資料完整性)
工具:sha1sum, md5sum, chsum, openssl dgst
CA和PKI以及證書申請驗證
CA(Certificate Authority):是負責發放和管理數字證書的權威機構,并作為電子商務交易中受信任的第三方,承擔公鑰體系中公鑰的合法性檢驗的責任。
PKI(Public Key Infrastructure):又稱公開密鑰基礎設施,PKI體系結構采用證書管理公鑰,通過第三方的可信機構CA,把使用者的公鑰和使用者的其他辨別資訊捆綁在一起,在Internet網上驗證使用者的身份,PKI體系結構把公鑰密碼和對稱密碼結合起來,在Internet網上實作密鑰的自動管理,保證網上資料的機密性、完整性。
<a href="http://s3.51cto.com/wyfs02/M02/22/54/wKiom1McJf2C-tI0AAFF1HaWefo216.jpg" target="_blank"></a>
上述圖檔大緻描述了證書申請與驗證的過程;其中申請證書方申請證書時,需要按規定填寫申請表以及生成密鑰送出申請,CA簽署後發回給申請者;CA的證書是屬于自簽證書。
在互相得到了證書後,到CA擷取公鑰進行解密,解密成功可證明對方身份,之前還需要進行核實證書的有效期限和是否被吊銷等資訊。
OpenSSL實作私有CA
OpenSSL是一款功能強大的加密工具包。為網絡通信提供安全及資料完整性的一種安全協定,囊括了主要的密碼算法、常用的密鑰和證書封裝管理功能以及SSL協定,并提供了豐富的應用程式供測試或其它目的使用。
openssl主要包括:
libcrypto:通用功能的加密庫
libssl:用于實作TLS/SSL的功能
openssl:多功能指令工具(生成密鑰、建立數字證書、手動加密解密資料...)
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
34
35
<code>[X.X.X.</code><code>73</code><code>]</code><code>#openssl -h</code>
<code>openssl:Error: </code><code>'-h'</code> <code>is</code> <code>an invalid command.</code>
<code>Standard commands</code>
<code>asn1parse ca ciphers cms </code>
<code>crl crl2pkcs7 dgst dh </code>
<code>dhparam dsa dsaparam ec </code>
<code>ecparam enc engine errstr </code>
<code>gendh gendsa genpkey genrsa </code>
<code>nseq ocsp passwd pkcs12 </code>
<code>pkcs7 pkcs8 pkey pkeyparam </code>
<code>pkeyutl prime rand req </code>
<code>rsa rsautl s_client s_server </code>
<code>s_time sess_id smime speed </code>
<code>spkac ts verify version </code>
<code>x509 </code>
<code>Message Digest commands (see the `dgst' command </code><code>for</code> <code>more details)</code>
<code>md2 md4 md5 rmd160 </code>
<code>sha sha1 </code>
<code>Cipher commands (see the `enc' command </code><code>for</code> <code>more details)</code>
<code>aes</code><code>-</code><code>128</code><code>-</code><code>cbc aes</code><code>-</code><code>128</code><code>-</code><code>ecb aes</code><code>-</code><code>192</code><code>-</code><code>cbc aes</code><code>-</code><code>192</code><code>-</code><code>ecb</code>
<code>aes</code><code>-</code><code>256</code><code>-</code><code>cbc aes</code><code>-</code><code>256</code><code>-</code><code>ecb base64 bf </code>
<code>bf</code><code>-</code><code>cbc bf</code><code>-</code><code>cfb bf</code><code>-</code><code>ecb bf</code><code>-</code><code>ofb </code>
<code>camellia</code><code>-</code><code>128</code><code>-</code><code>cbc camellia</code><code>-</code><code>128</code><code>-</code><code>ecb camellia</code><code>-</code><code>192</code><code>-</code><code>cbc camellia</code><code>-</code><code>192</code><code>-</code><code>ecb</code>
<code>camellia</code><code>-</code><code>256</code><code>-</code><code>cbc camellia</code><code>-</code><code>256</code><code>-</code><code>ecb cast cast</code><code>-</code><code>cbc </code>
<code>cast5</code><code>-</code><code>cbc cast5</code><code>-</code><code>cfb cast5</code><code>-</code><code>ecb cast5</code><code>-</code><code>ofb </code>
<code>des des</code><code>-</code><code>cbc des</code><code>-</code><code>cfb des</code><code>-</code><code>ecb </code>
<code>des</code><code>-</code><code>ede des</code><code>-</code><code>ede</code><code>-</code><code>cbc des</code><code>-</code><code>ede</code><code>-</code><code>cfb des</code><code>-</code><code>ede</code><code>-</code><code>ofb</code>
<code>des</code><code>-</code><code>ede3 des</code><code>-</code><code>ede3</code><code>-</code><code>cbc des</code><code>-</code><code>ede3</code><code>-</code><code>cfb des</code><code>-</code><code>ede3</code><code>-</code><code>ofb</code>
<code>des</code><code>-</code><code>ofb des3 desx idea </code>
<code>idea</code><code>-</code><code>cbc idea</code><code>-</code><code>cfb idea</code><code>-</code><code>ecb idea</code><code>-</code><code>ofb </code>
<code>rc2 rc2</code><code>-</code><code>40</code><code>-</code><code>cbc rc2</code><code>-</code><code>64</code><code>-</code><code>cbc rc2</code><code>-</code><code>cbc </code>
<code>rc2</code><code>-</code><code>cfb rc2</code><code>-</code><code>ecb rc2</code><code>-</code><code>ofb rc4 </code>
<code>rc4</code><code>-</code><code>40</code> <code>seed seed</code><code>-</code><code>cbc seed</code><code>-</code><code>cfb </code>
<code>seed</code><code>-</code><code>ecb seed</code><code>-</code><code>ofb zlib </code>
<code>#給了一個錯誤參數,能顯示出具體指令</code>
用openssl實作私有CA
先檢視下openssl的配置檔案:
<code>[X.X.X.</code><code>15</code><code>]</code><code>#vi /etc/pki/tls/openssl.cnf</code>
<code>[ CA_default ]</code>
<code>dir</code> <code>=</code> <code>/</code><code>etc</code><code>/</code><code>pki</code><code>/</code><code>CA </code><code># 工作目錄</code>
<code>certs </code><code>=</code> <code>$</code><code>dir</code><code>/</code><code>certs </code><code># 簽署檔案證書目錄</code>
<code>crl_dir </code><code>=</code> <code>$</code><code>dir</code><code>/</code><code>crl </code><code># 吊銷清單</code>
<code>database </code><code>=</code> <code>$</code><code>dir</code><code>/</code><code>index.txt </code><code># 資料庫索引檔案</code>
<code>#unique_subject = no #</code>
<code> </code><code>#</code>
<code>new_certs_dir </code><code>=</code> <code>$</code><code>dir</code><code>/</code><code>newcerts </code><code># 目前簽署的證書目錄</code>
<code>certificate </code><code>=</code> <code>$</code><code>dir</code><code>/</code><code>cacert.pem </code><code># CA自身的證書</code>
<code>serial </code><code>=</code> <code>$</code><code>dir</code><code>/</code><code>serial </code><code># 目前簽署的證書編号</code>
<code>crlnumber </code><code>=</code> <code>$</code><code>dir</code><code>/</code><code>crlnumber </code><code># 吊銷清單編号</code>
<code>crl </code><code>=</code> <code>$</code><code>dir</code><code>/</code><code>crl.pem </code><code># 目前使用的crl</code>
<code>private_key </code><code>=</code> <code>$</code><code>dir</code><code>/</code><code>private</code><code>/</code><code>cakey.pem</code><code># CA的私有KEY</code>
<code>RANDFILE </code><code>=</code> <code>$</code><code>dir</code><code>/</code><code>private</code><code>/</code><code>.rand </code><code># private random number file</code>
<code>x509_extensions </code><code>=</code> <code>usr_cert </code><code># The extentions to add to the cert</code>
配置檔案中可以看到定義了CA預設的屬性;了解到上述屬性後就可以手動配置CA了:
1、切換到CA的目錄下,生成密鑰對
<code>[X.X.X.</code><code>15</code><code>]</code><code>#(umask 077;openssl genrsa -out private/cakey.pem 2048)</code>
<code>Generating RSA private key, </code><code>2048</code> <code>bit </code><code>long</code> <code>modulus</code>
<code>................................................</code><code>+</code><code>+</code><code>+</code>
<code>............................................................................</code><code>+</code><code>+</code><code>+</code>
<code>e </code><code>is</code> <code>65537</code> <code>(</code><code>0x10001</code><code>)</code>
<code>[X.X.X.</code><code>15</code><code>]</code><code>#ll -l private/cakey.pem</code>
<code>-</code><code>rw</code><code>-</code><code>-</code><code>-</code><code>-</code><code>-</code><code>-</code><code>-</code> <code>1</code> <code>root root </code><code>1679</code> <code>Mar </code><code>9</code> <code>14</code><code>:</code><code>48</code> <code>private</code><code>/</code><code>cakey.pem</code>
<code>[X.X.X.</code><code>15</code><code>]</code><code>#</code>
<code>#括号是在子SHELL中執行指令,變量不會影響到父程序,由于是私有key,是以權限很重要,故;在括号内設定了umask值</code>
<code>#密鑰生成的隻有私鑰,公鑰是通過特定格式從私鑰中提取的</code>
2、生成自簽證書
<code>[X.X.X.</code><code>15</code><code>]</code><code>#openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365</code>
<code>You are about to be asked to enter information that will be incorporated</code>
<code>into your certificate request.</code>
<code>What you are about to enter </code><code>is</code> <code>what </code><code>is</code> <code>called a Distinguished Name </code><code>or</code> <code>a DN.</code>
<code>There are quite a few fields but you can leave some blank</code>
<code>For some fields there will be a default value,</code>
<code>If you enter </code><code>'.'</code><code>, the field will be left blank.</code>
<code>-</code><code>-</code><code>-</code><code>-</code><code>-</code>
<code>Country Name (</code><code>2</code> <code>letter code) [XX]:CN</code>
<code>State </code><code>or</code> <code>Province Name (full name) []:HN</code>
<code>Locality Name (eg, city) [Default City]:ZZ</code>
<code>Organization Name (eg, company) [Default Company Ltd]:Linux</code>
<code>Organizational Unit Name (eg, section) []:Centos</code>
<code>Common Name (eg, your name </code><code>or</code> <code>your server's hostname) []:ca.mage.com </code><code>#這項很重要;一般是主機名</code>
<code>Email Address []:[email protected]</code>
<code>[X.X.X.</code><code>15</code><code>]</code><code>#ls</code>
<code>cacert.pem certs crl newcerts private</code>
3、在CA下建立index.txt等檔案
<code>[X.X.X.15]</code><code>#touch index.txt serial crlnumber</code>
<code>[X.X.X.15]</code><code>#ls</code>
<code>cacert.pem certs crl crlnumber index.txt newcerts private serial</code>
<code>[X.X.X.15]</code><code>#echo 00 > serial #給一個初始号碼;否則簽署證書時會報錯</code>
<code>[X.X.X.15]</code><code>#</code>
<code>#這幾個檔案預設是沒有的,需要手動建立,否則簽署證書時會報錯</code>
用openssl實作證書申請
1、在主機上生成密鑰,儲存至應用此證書的服務的配置檔案目錄下
下面以httpd作為執行個體實驗
<code>#在httpd目錄建立一個專門存儲的目錄ssl</code>
<code>[X.X.X.</code><code>73</code><code>]</code><code>#pwd</code>
<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>ssl</code>
<code>[X.X.X.</code><code>73</code><code>]</code><code>#(umask 077;openssl genrsa -out httpd.key 1024)</code>
<code>Generating RSA private key, </code><code>1024</code> <code>bit </code><code>long</code> <code>modulus</code>
<code>..................</code><code>+</code><code>+</code><code>+</code><code>+</code><code>+</code><code>+</code>
<code>........</code><code>+</code><code>+</code><code>+</code><code>+</code><code>+</code><code>+</code>
<code>[X.X.X.</code><code>73</code><code>]</code><code>#ll</code>
<code>total </code><code>4</code>
<code>-</code><code>rw</code><code>-</code><code>-</code><code>-</code><code>-</code><code>-</code><code>-</code><code>-</code> <code>1</code> <code>root root </code><code>887</code> <code>Mar </code><code>9</code> <code>11</code><code>:</code><code>32</code> <code>httpd.key</code>
2、生成證書簽署請求檔案
<code>[X.X.X.</code><code>73</code><code>]</code><code>#openssl req -new -key httpd.key -out httpd.csr</code>
<code>Organizational Unit Name (eg, section) []:Linux</code>
<code>Common Name (eg, your name </code><code>or</code> <code>your server's hostname) []:</code><code>73.soul</code><code>.com</code>
<code>Email Address []:</code><code>73</code><code>@soul.com</code>
<code>Please enter the following </code><code>'extra'</code> <code>attributes</code>
<code>to be sent with your certificate request</code>
<code>A challenge password []:</code>
<code>An optional company name []:</code>
<code>[X.X.X.</code><code>73</code><code>]</code><code>#ls</code>
<code>httpd.csr httpd.key</code>
<code>[X.X.X.</code><code>73</code><code>]</code><code>#</code>
<code>#與CA上證書生成是差不多的,差別在于主機名和多了個密碼,密碼這裡留白</code>
<code>#由于是内部使用,前面的資訊填寫必須一緻</code>
3、請求檔案發送給CA
<code>#在CA的主機/etc/pki下建立一個檔案專門存儲稽核檔案</code>
<code>[X.X.X.</code><code>15</code><code>]</code><code>#pwd</code>
<code>/</code><code>etc</code><code>/</code><code>pki</code><code>/</code><code>sign</code>
<code>#</code>
<code>[X.X.X.</code><code>73</code><code>]</code><code>#scp httpd.csr X.X.X.15:/etc/pki/sign</code>
<code>[email protected].</code><code>15</code><code>'s password:</code>
<code>httpd.csr </code><code>100</code><code>%</code> <code>676</code> <code>0.7KB</code><code>/</code><code>s </code><code>00</code><code>:</code><code>00</code>
CA簽署證書
36
37
38
39
<code>[X.X.X.</code><code>15</code><code>]</code><code>#openssl ca -in httpd.csr -out httpd.crt -days 3655</code>
<code>Using configuration </code><code>from</code> <code>/</code><code>etc</code><code>/</code><code>pki</code><code>/</code><code>tls</code><code>/</code><code>openssl.cnf</code>
<code>Check that the request matches the signature</code>
<code>Signature ok</code>
<code>Certificate Details:</code>
<code> </code><code>Serial Number: </code><code>0</code> <code>(</code><code>0x0</code><code>)</code>
<code> </code><code>Validity</code>
<code> </code><code>Not Before: Mar </code><code>9</code> <code>07</code><code>:</code><code>19</code><code>:</code><code>50</code> <code>2014</code> <code>GMT</code>
<code> </code><code>Not After : Mar </code><code>11</code> <code>07</code><code>:</code><code>19</code><code>:</code><code>50</code> <code>2024</code> <code>GMT</code>
<code> </code><code>Subject:</code>
<code> </code><code>countryName </code><code>=</code> <code>CN</code>
<code> </code><code>stateOrProvinceName </code><code>=</code> <code>HN</code>
<code> </code><code>organizationName </code><code>=</code> <code>Linux</code>
<code> </code><code>organizationalUnitName </code><code>=</code> <code>Linux</code>
<code> </code><code>commonName </code><code>=</code> <code>73.soul</code><code>.com</code>
<code> </code><code>emailAddress </code><code>=</code> <code>73</code><code>@soul.com</code>
<code> </code><code>X509v3 extensions:</code>
<code> </code><code>X509v3 Basic Constraints:</code>
<code> </code><code>CA:FALSE</code>
<code> </code><code>Netscape Comment:</code>
<code> </code><code>OpenSSL Generated Certificate</code>
<code> </code><code>X509v3 Subject Key Identifier:</code>
<code> </code><code>B1:</code><code>4A</code><code>:</code><code>39</code><code>:</code><code>93</code><code>:C1:</code><code>9A</code><code>:</code><code>10</code><code>:C7:</code><code>81</code><code>:</code><code>67</code><code>:</code><code>74</code><code>:E2:</code><code>4D</code><code>:</code><code>97</code><code>:C3:A1:</code><code>0A</code><code>:AD:</code><code>1F</code><code>:</code><code>62</code>
<code> </code><code>X509v3 Authority Key Identifier:</code>
<code> </code><code>keyid:B5:</code><code>12</code><code>:</code><code>83</code><code>:</code><code>5A</code><code>:</code><code>54</code><code>:B0:</code><code>1B</code><code>:</code><code>98</code><code>:</code><code>34</code><code>:</code><code>4E</code><code>:D9:A6:</code><code>31</code><code>:</code><code>95</code><code>:</code><code>5F</code><code>:</code><code>14</code><code>:BB:</code><code>61</code><code>:D9:EF</code>
<code>Certificate </code><code>is</code> <code>to be certified until Mar </code><code>11</code> <code>07</code><code>:</code><code>19</code><code>:</code><code>50</code> <code>2024</code> <code>GMT (</code><code>3655</code> <code>days)</code>
<code>Sign the certificate? [y</code><code>/</code><code>n]:y</code>
<code>1</code> <code>out of </code><code>1</code> <code>certificate requests certified, commit? [y</code><code>/</code><code>n]y</code>
<code>Write out database with </code><code>1</code> <code>new entries</code>
<code>Data Base Updated</code>
<code>[X.X.X.</code><code>15</code><code>]</code><code>#scp httpd.crt X.X.X.73:/etc/httpd/ssl</code>
<code>[email protected].</code><code>73</code><code>'s password:</code>
<code>httpd.crt </code><code>100</code><code>%</code> <code>3803</code> <code>3.7KB</code><code>/</code><code>s </code><code>00</code><code>:</code><code>00</code>
<code>httpd.crt httpd.csr httpd.key </code><code>#對方主機以收到</code>
至此一個簡單的CA以及申請和簽署步驟已完成。
還有一個可以吊銷證書的指令:
<code>openssl ca </code><code>-</code><code>revoke </code><code>/</code><code>path</code><code>/</code><code>to</code><code>/</code><code>somefile.crt</code>
這裡就不在測試。證書吊銷需要在使用者申請或者使用者未付款的情況下。
正常狀态下是不能操作的。
這種CA一般應用于内部區域網路,如大範圍使用或專業使用,建議使用OpenCA或者購買專業公司提供的。
本文轉自Mr_陳 51CTO部落格,原文連結:http://blog.51cto.com/chenpipi/1371371,如需轉載請自行聯系原作者