本文僅個人筆記,大神部落格參考:https://my.oschina.net/liting/blog/372488
1.ssl 與tls的差別:參考http://kb.cnblogs.com/page/197396/
簡而言之,ssl和tls都是介于tcp/ip(網絡層)與http(應用層)的之間,也就是它們的中間層。ssl出現比較早,後來人們在它的基礎上制定了tls協定。tls 1.0相當于ssl 3.0,但是又各有差異。各種應用層協定,如果想進行安全加密傳輸,需要把資料多經由ssl這個中間層加密,比如http經由ssl層則變成https協定,smtp經由ssl層變成smtps協定等。而且它們的會話建立過程也需要多幾個步驟,拿https來說,當tcp三次握手完成以後,用戶端和服務端還需要類似以下操作(簡要寫法,詳細資料參考http://www.cnblogs.com/jifeng/archive/2010/11/30/1891779.html):
1.用戶端發起建立安全會話請求
2.用戶端和服務端協商使用的中間層協定(ssl或tls)、加密算法等資訊
3.服務端向用戶端發送服務端證書
4.用戶端向信任CA驗證證書,并提取公鑰
5.用戶端與伺服器端協商密鑰,并開始正常通信
之是以要協商加密算法,是因為加密算法有很多類型,主要有如下幾種:
對稱加密:
DES:Data Encrption Standard
3DES:在DES的基礎上再進行加密,重複3次
AES:Adanced Encrption Standard (改進版對稱加密标準,安全性較高,目前比較常用)
Blowfish
單向加密:
MD4
MD5
SHA1
CRC-32:循環備援校驗碼,與普通單向加密不通的是,一般的單向加密不同的輸入輸出的結果都是不一樣的,但是CRC-32可能會一樣,一般用在資料傳輸過程中進行校驗并糾錯。
非對稱加密:
RSA:可以進行驗證身份、加密和解密
DSA:僅用于驗證身份。之是以不能加密解密的原因在于它的加密過程中使用到了單向加密,而單向加密的特點之一是結果不可逆性,詳見:http://zhiqiang.org/blog/it/das-and-ecdsa-rsa.html
2.ssl的開源實作:openssl
openssl主要這個套件主要包含三個部分:(Centos下rpm -ql openssl檢視)
libcrypto:這是個加密庫,裡面包含各種加密算法的實作源碼
libssl:這個是ssl/tls層協定的實作庫,,基于會話的,實作了身份認證、、資料機密性和會話完整性的TLS/SSL庫
openssl:多用途指令行工具,可以進行CA憑證的頒發

openssl:
speed #:測試評估系統對加密算法的性能 (openssl speed des)
enc:加密算法
例子:
openssl enc -des3 -salt -a -in inittab -out inittab.des3 :加密資料
openssl enc -des3 -d -salt -a -in inittab.des3 -out inittab:解密資料
openssl dgst -sha1 inittab:計算資料的特征碼(摘要)
openssl passwd –l 密碼 :輸入密碼即可顯示加密後的密碼
openssl passwd -1 -salt 資料:加密的時候指定salt
openssl rand -base64 100:生成随機數
OpenSSL openssl實作私有CA具體步驟
第一步,建立CA機構
修改配置檔案
自己生成一對密鑰 (私鑰加密http公鑰)
生成自簽證書
第二步,用戶端
生成一對密鑰
生成證書頒發請求---.csr
将請求發給CA
第三步,CA機構
簽署此證書
傳送給用戶端
(5). CA配置檔案:/etc/pki/tls/openssl.cnf (隻講解重要部分)
[ CA_default ]
dir = /etc/pki/CA #工作目錄 ,此處需要指定,不然給客戶到簽證的時候必須在特定的目錄下才能實作。
certs = $dir/certs #用戶端證書目錄
crl_dir = $dir/crl #證書吊銷清單
database = $dir/index.txt #證書記錄資訊
new_certs_dir = $dir/newcerts #新生成證書的目錄
certificate = $dir/cacert.pem #CA自己的證書位置
serial = $dir/serial #序列号
crlnumber = $dir/crlnumbe #證書吊銷清單序列号
crl = $dir/crl.pem #證書吊銷清單檔案
private_key = $dir/private/cakey.pem #CA自己的私鑰
RANDFILE = $dir/private/.rand #随機數檔案
(6). CA機構 先生成一對密鑰,然後生成自簽證書
a. 生成密鑰
指令格式:openssl genrsa -out /PATH/TO/KEYFILENAME NUMBITS #NUMBITS:密鑰長度,預設是128位的
(umask 077;openssl genrsa -out server.key 1024) #生成後直接為700權限的key
指令格式:openssl rsa -in /PATH/TO/KEYFILENAME –pubout #讀入密鑰檔案并輸出公鑰檔案(提取公鑰)
openssl rsa –in server.key –pubout
b. 生成證書
openssl req -new -x509 -key server.key -out server.crt -days 365 #(-days:證書的有效期限),然後輸入相關的資訊即可生成證書
注意:主機名稱:至關重要,與主機名稱保持一緻,DNS主機名稱,通信的唯一憑證
openssl x509 -text -in server.crt #檢視新生成的CA憑證
16. 建立私有CA 頒發機構
(1). 修改配置
vim /etc/pki/tls/openssl.cnf
x509_extensions = usr_cert
(2). 把自身伺服器做成CA
cd /etc/pki/CA
(umask 077; openssl genrsa -out private/cakey.pem 2048) #生成證書
openssl req -new -x509 -key private/cakey.pem -out cacert.pem #生成自簽證書
mkdir certs newcerts crl #建立相關的目錄
touch index.txt
touch serial #建立序列号檔案
echo 01 > serial #寫入起始序列号
(3). 配置httpd使用證書
cd /etc/httpd #web伺服器的配置目錄
mkdir ssl
cd ssl #每一種服務要想使用證書,必須有私鑰,每一種應用都需要自己的證書
(umask 077; openssl genrsa -out http.key 1024)#給自己生成密鑰
openssl req -new -key httpd.key -out httpd.csr #證書簽署請求檔案,機構和其他名字必須和CA頒發機構上的一樣
在簽名時,如果報“The stateOrProvinceName field needed to be the same in the CA certificate”,是因為在openssl.cfg中的policy_match裡面的前三個都選了match,修改成
stateOrProvinceName = optional
organizationName = optional
openssl ca -in httpd.csr -out httpd.crt -days 365 #CA簽名,簽名以後才可以使用
個人寫的建立CA腳本:
<code>#!/bin/bash</code>
<code>export</code> <code>PATH=</code><code>/usr/local/sbin</code><code>:</code><code>/usr/local/bin</code><code>:</code><code>/sbin</code><code>:</code><code>/bin</code><code>:</code><code>/usr/sbin</code><code>:</code><code>/usr/bin</code><code>:</code><code>/root/bin</code>
<code>[ ! -f </code><code>/etc/pki/CA/index</code><code>.txt ] && </code><code>touch</code> <code>/etc/pki/CA/index</code><code>.txt</code>
<code>[ ! -f </code><code>/etc/pki/CA/serial</code> <code>] && </code><code>echo</code> <code>"00"</code> <code>> </code><code>/etc/pki/CA/serial</code>
<code>(</code><code>umask</code> <code>077; openssl genrsa -out </code><code>/etc/pki/CA/private/cakey</code><code>.pem 2048)</code>
<code>echo</code> <code>"CN</code>
<code>fujian</code>
<code>xiamen</code>
<code>meihe</code>
<code>Tech</code>
<code>www.DamnSingle.com</code>
<code>test</code><code>@163.com</code>
<code>"|openssl req -new -x509 -key </code><code>/etc/pki/CA/private/cakey</code><code>.pem -out </code><code>/etc/pki/CA/cacert</code><code>.pem</code>
<code></code>
本文轉自biao007h51CTO部落格,原文連結:http://blog.51cto.com/linzb/1870944 ,如需轉載請自行聯系原作者