天天看點

Openssl、加密、解密和私有CA的實作過程

在網際網路資料傳輸過程中,資料的安全私密性是及其重要的,是以就有資料的加密和解密過程;

加密方式

一、對稱加密:

特性:

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 &gt; 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,如需轉載請自行聯系原作者

繼續閱讀