CA和證書
安全協議(SSL/TLS)
OpenSSH
一、CA和證書
(一) PKI(Public Key Infrastructure) 公鑰基礎設施
定義:支持公開密鑰管理并能支持認證、加密、完整性和可追究性服務的基礎設施
-
主要組成部分:
- 簽證機構:CA (Certificate Authority)
- 注冊機構:RA (Registration Authority)
- 證書吊銷列表:CRL (Certificate Revocation List)
- 證書存取庫
-
X.509:定義了證書的結構以及認證協議標準
- 內容:版本號、序列號、簽名算法、頒發者、有效期限、主體名稱、主體公鑰、CRL分發點、擴展信息、發行者簽名
(二)證書獲取的方法:
- 證書授權機構簽發的證書:由CA簽發申請者的公鑰
- 第1步:生成簽名請求(csr)
- 第2步:將csr發送給CA
- 第3步:從CA處接受簽名
- 自簽名的證書:自己簽發自己的公鑰
二、安全協議(SSL/TLS):
(一)協議歷史、功能
-
發展歷程:
- SSL(Secure Socket Layer):安全套接字
- 由Netscape公司于1995年發布SSL 2.0
- TLS(Transport Layer Security) 安全傳輸層協議1.1:
- TLS 1.1:IETF(Internet工程任務組) 于2006年將其定義為國際標準RFC 4346
- TLS 1.2:當前使用最廣泛的標準,2008年發布
- TLS 1.3:最新標準,2015年發布
- SSL(Secure Socket Layer):安全套接字
提供功能:機密性、認證、完整性、重放保護
位于TCP/IP模型傳輸層之上,應用層之下
(二)協議工作原理
-
SSL/TLS協議是兩階段協議,分為握手階段和應用階段
- 握手階段(協商階段)客戶端和服務器端認證對方身份(依賴于PKI體系,利用數字證書進行身份認證),并協商通信中使用的安全參數、密碼套件以及主密鑰。后續通信使用的所有密鑰都是通過MasterSecret生成。
- 應用階段:在握手階段完成后進入,在應用階段通信雙方使用握手階段協商好的密鑰進行安全通信
-
相關協議:
- 握手階段:Handshake, ChangeCipherSpec, Alert協議
- 應用階段:Record協議
HTTPS協議:就是“HTTP” 協議”和“SSL/TLS 協議”的組合。HTTP over SSL”或“HTTP over TLS”,對http協議的文本數據進行加密處理后,成為二進制形式傳輸
(三)OpenSSL
開源項目:可以實現對稱加密、公鑰加密、秘鑰管理等豐富功能
-
對稱加密:openssl enc工具實現
- 幫助:
man enc
- 語法:
// 加密 openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
// 解密 openssl enc -d -des3 -a -salt -in testfile.cipher -out testfile
- 幫助:
-
公鑰加密:openssl rsautl工具實現
- 幫助:
man rsautl
- 語法:
// 生成私鑰 openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS // 私鑰需要謹慎保管,權限應設置為600 // 執行umask 066,為避免umask設置影響今后操作,將umask和后續生成私鑰命令用小括號括起 // 例如以下命令(-des: 私鑰添加口令) (umask077; openssl genrsa -out test.key -des 2048) //從私鑰中提取出公鑰 openssl rsa -in PRIVATEKEYFILE -pubout -out PUBLICKEYFILE //例如以下命令 openssl rsa -in test.key -pubout -out test.key.pub
- 幫助:
-
單項加密:openssl dgst工具實現
- 幫助:
man dgst
- 語法:
openssl dgst -md5 [-hex] /PATH/SOMEFILE //-hex 默認設置為16進制顯示 openssl dgst -md5 testfile
- 幫助:
-
生成密碼:openssl sslpasswd工具實現
- 幫助:
man sslpasswd
- 語法:
openssl passwd -1 -salt SALT(最多8位) //-1指MD5加密 openssl passwd -1 -salt centos
- 幫助:
-
生成隨機數:openssl sslrand工具實現
- 幫助:
man sslrand
- 幫助:
openssl rand -base64|-hex NUM NUM: 表示字節數;-hex時,每個字符為十六進制,相當于4位二進制,出現的字符數為NUM*2
- 幫助:
(四)OpenSSL實現創建CA并申請、管理證書
- 配置文件
- openssl的配置文件:/etc/pki/tls/openssl.cnf
配置文件關鍵信息:
- openssl的配置文件:/etc/pki/tls/openssl.cnf
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自簽發或由上級簽發的證書路徑,名稱必須為"cacert.pem"
serial = $dir/serial //下一個簽發證書的序號,一般從16位數字00開始
crlnumber = $dir/crlnumber //下一個證書吊銷列表的序號,一般從16位數字00開始
crl = $dir/crl.pem //證書吊銷列表的存放路徑
private_key = $dir/private/cakey.pem //私鑰的存放路徑
countryName = match //國家信息必須匹配
stateOrProvinceName = match //州或省信息必須匹配
organizationName = match //域名信息必須匹配
organizationalUnitName = optional //部門名稱
commonName = supplied //申請證書的主機名稱
emailAddress = optional //郵箱
-
申請信息的三種策略:匹配、支持和可選
- 匹配:申請填寫的信息跟CA設置信息必須一致
- 支持:必須填寫這項申請信息
- 可選:可有可無
-
第1步,創建私有CA,生成私鑰
// 創建所需要的文件 touch /etc/pki/CA/index.txt //生成證書索引數據庫文件 echo 01 > /etc/pki/CA/serial //指定第一個頒發證書的序列號 // CA生成私鑰,注意名稱必須為cakey.pem (umask066; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
-
第2步,生成自簽名證書
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out /etc/pki/CA/cacert.pem // -new 生成新證書簽署請求 // -x509 專用于CA生成自簽證書 // -key 生成請求時用到的私鑰文件 // -days n 證書的有效期限 // -out /PATH/TO/SOMECERTFILE: 證書的保存路徑
-
第3步,頒發證書,一般將私鑰和CA簽發的證書保存在應用的目錄中
// 1. 生成證書請求csr // 生成私鑰 (umask066; openssl genrsa -out /etc/pki/tls/private/test.key 2048) 生成證書申請文件 openssl req -new -key /etc/pki/tls/private/test.key -out etc/pki/tls/test.csr // 2. 將證書請求文件傳輸給CA // 3. CA簽署證書,并將證書頒發給請求者 openssl ca -in /tmp/test.csr -out /etc/pki/CA/certs/test.crt -days 365 注意:默認國家,省,公司名稱三項必須和CA一致 // 4. 查看證書中的信息: openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|issuer|subject|serial|dates // 查看指定編號的證書狀態 openssl ca -status SERIAL
-
第4步,吊銷證書
// 1. 在客戶端獲取要吊銷的證書的serial openssl x509 -in /PATH/FROM/CERT_FILE -noout -serial -subject // 2. 在CA上,根據客戶提交的serial與subject信息,對比檢驗是否與index.txt文件中的信息一致,吊銷證書 openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem // 指定第一個吊銷證書的編號 注意:第一次更新證書吊銷列表前,才需要執行 echo 01 > /etc/pki/CA/crlnumber // 3. 更新證書吊銷列表 openssl ca -gencrl -out /etc/pki/CA/crl/crl.pem // 查看crl文件: openssl crl -in /etc/pki/CA/crl/crl.pem -noout -text
實驗:建立根CA,子CA,并實現根CA簽發自身證書、根CA給子CA簽發證書、子CA給申請者簽發證書,最后吊銷子CA簽發給申請者的證書,并生成證書吊銷列表
環境設置:
根CA的ip地址:192.168.136.230,命令提示符顏色:紫色
子CA的ip地址:192.168.136.229,命令提示符顏色:黃色
申請主機的ip地址:192.168.136.224,命令提示符顏色:藍色
密鑰、證書申請、簽發的證書存儲位置,如下圖:
第1步:建立根CA,根CA簽發自身證書(根CA上操作)
建立證書索引庫文件index.txt,指定證書序列號
touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial
生成私鑰文件cakey.pem,存儲在/etc/pki/CA/private目錄下
(umask 066; openssl genrsa -out /etc/pki/CA/private/cakey.pem -des3 2048)
自已簽發自己的證書cacert.pem,存儲在/etc/pki/CA目錄下,過程中設置:countryName, stateOrProvinceName, organizationName, organizationalUnitName, commonName, emailAddress等信息,前三項一定要注意,之后簽發的證書信息務必要與本次設置的信息相同
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 7300
第2步,建立子CA,子CA向根CA申請證書,根CA簽發證書(子CA上操作)
建立證書索引庫文件index.txt,指定證書序列號
touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial
生成私鑰
(umak 066; openssl genrsa -out /etc/pki/CA/private/cakey.pem -des3 2048)
生成證書申請文件
openssl req -new -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.csr
將證書申請文件傳送給根CA,根CA簽發證書并將證書傳送回子CA,存儲至子CA的/etc/pki/CA目錄下
scp /etc/pki/CA/cacert.csr 192.168.136.230:/tmp
發送證書申請文件至根CA
openssl ca -in /tmp/cacert.csr -out /etc/pki/CA/certs/cacert.pem -days 3650
根CA簽發證書(此命令在根CA上操作)
查看簽發的證書內容,可以看到證書序列號按照/etc/pki/CA/serial文件中的01編號,根CA和子CA的關鍵信息相同(此命令在根CA上操作)
使用openssl x509 -in /etc/pki/CA/certs/cacert.pem -noout -text|issuer|suject|serial|dates
命令查看證書信息,紅框中可以看到時間期限確實為簽發證書指定的約10年(-days 3650)(此命令在根CA上操作)
使用openssl ca -status 01
命令,查看指定編號的證書狀態(此命令在根CA上操作)
scp /etc/pki/CA/certs/cacert.pem 192.168.136.229:/etc/pki/CA/
發送簽發的證書至子CA(此命令在根CA上操作)
第3步,申請主機向子CA發起證書簽發申請,子CA簽發證書(申請主機上操作)
生成密鑰
(umask 066; openssl genrsa -out /etc/pki/tls/private/hello.key -des3 2048)
生成證書申請文件
openssl req -new -key /etc/pki/tls/private/hello.key -out /etc/pki/tls/hello.csr
將證書申請文件傳送給子CA,子CA簽發證書并將證書傳送回申請主機,存儲至申請主機的/etc/pki/tls目錄下
scp /etc/pki/tls/hello.csr 192.168.136.229:/tmp
發送證書申請文件至子CA
openssl ca -in /tmp/hello.csr -out /etc/pki/CA/certs/hello.crt -days 730
子CA簽發證書(此命令在子CA上操作)
scp /etc/pki/CA/certs/hello.crt 192.168.136.224:/etc/pki/tls/
發送簽發的證書至子CA(此命令在子CA上操作)
將根CA證書、子CA證書、申請主機證書都傳至windows,可以在證書頁面看到清晰的證書繼承關系
第4步,吊銷子CA給申請主機的證書,創建證書吊銷列表(子CA上操作)
環境設置:在子CA上再簽發兩個證書
修改/etc/pki/CA/index.txt.attr文件,內容改為"unique_subject = no",這樣可以為相同證書申請簽發多次證書
openssl ca -in /tmp/hello.csr -out /etc/pki/CA/certs/hello1.crt -days 300
openssl ca -in /tmp/hello.csr -out /etc/pki/CA/certs/hello2.crt -days 500
查看想要吊銷證書的序列號,查看目前所有證書的狀態,V表示可用狀態
openssl x509 -in /etc/pki/CA/certs/hello1.crt -noout -serial -subject
openssl x509 -in /etc/pki/CA/certs/hello2.crt -noout -serial -subject
cat /etc/pki/CA/index.txt
``
吊銷序列號為02和03的兩個證書:
openssl ca -revoke /etc/pki/CA/newcerts/02.pem
openssl ca -revoke /etc/pki/CA/newcerts/03.pem
cat /etc/pki/CA/index.txt
查看索引數據庫,發現被吊銷的證書狀態為R
生成證書吊銷列表
echo 01 > /etc/pki/CA/crlnumber
指定首個證書吊銷列表的序列號
openssl ca -gencrl -out /etc/pki/CA/crl/crl.pem
生成證書吊銷列表
查看證書吊銷列表內容
openssl crl -in /etc/pki/CA/crl/crl.pem -noout -text
三、OpenSSH
(一)SSH協議
- ssh: secure shell,TCP連接,默認端口號22,安全的端口登錄
- 軟件實現:OpenSSH, dropbear
- 協議版本:當前使用ssh v2,基于DH算法做密鑰交換,基于RSA或DSA實現身份認證
- 登錄認證方式:基于password和基于key兩種方式
(二)OpenSSH
-
基于C/S結構
- client: ssh, scp, xshell, securecrt
- server: sshd
-
ssh客戶端:
- 路徑:/etc/ssh/ssh_config
- 配置項:
StrictHostKeyChecking 首次登錄檢查Key,默認為"ask"提示,設為"no"不提示 - 語法:
ssh [user@]host [COMMAND] 默認以當前本機登錄用戶名登錄遠程主機
ssh [-l user] host [COMMAND] -l 指定用戶登錄遠程主機
選項: -p port:遠程服務器監聽的端口 -b:指定連接的源IP -v:調試模式 -C:壓縮方式 -X:支持x11轉發 -Y:支持信任x11轉發 -t:強制偽tty分配 //通過ssh直連remoteserver1實現間接連接至remoteserver2 ssh -t remoteserver1 ssh remoteserver2
(三)OpenSSH遠程驗證
openssh實現遠程主機驗證的方式:
當用戶遠程連接ssh服務器時,會復制ssh服務器/etc/ssh/ssh_host*key.pub文件中的公鑰到客戶機的~./ssh/know_hosts中。下次連接時,會自動匹配相應私鑰,不能匹配,將拒絕連接-
ssh服務登錄驗證:基于用戶/口令和基于密鑰兩種方式
-
基于用戶/口令登錄
- step 1 客戶端發起ssh請求,服務器會把自己的公鑰發送給用戶
- step 2 用戶會根據服務器發來的公鑰對密碼進行加密
- step 3 加密后的信息回傳給服務器,服務器用自己的私鑰解密,如果密碼正確,則用戶登錄成功
-
基于密鑰登錄
- step 1 首先在客戶端生成一對密鑰
- step 2 并將客戶端的公鑰拷貝到服務端
- step 3 當客戶端再次發送一個連接請求,包括ip, 用戶名
- step 4 服務端得到客戶端的請求后,會到authorized_keys中查找,如果有響應的IP和用戶,就會隨機生成一個字符串,例如:acdf
- step 5 服務端使用客戶端拷貝過來的公鑰進行加密,然后發送給客戶端
- step 6 得到服務端發來的消息后,客戶端會使用私鑰進行解密,然后將解密后的字符串發送給服務端
- step 7 服務端接受到客戶端發來的字符串后,跟之前的字符串進行對比,如果一致,就允許免密碼登錄
-
實現基于密鑰登錄
- 在客戶端生成密鑰對,-P '':私鑰不設置密碼
ssh-keygen -t rsa [-P ''] [-f "~/.ssh/id_rsa"]
- 把公鑰文件傳輸至遠程服務器對應用戶的家目錄
ssh-copy-id [-i [identity_file]] [user@]host
- 修改私鑰的密碼
ssh-keygen -p
- 使用驗證代理,只需要輸入一次密碼,之后所有的ssh連接輸入私鑰密碼的工作由代理完成。bash進程結束,代理工作結束;下次登錄時,重新啟動代理。
ssh-agent agent
啟用代理
ssh-add
密碼添加給代理
- 在客戶端生成密鑰對,-P '':私鑰不設置密碼
-
(四)加密文件傳輸工具:scp, rsysc, sftp, pssh
(1)scp工具
來源于openssh-clients軟件包
scp遇到相同文件直接覆蓋操作
語法:
scp [options] SRC... DEST/
scp [options] [user@]host:/sourcefile /destpath:將遠程主機文件復制到本地
scp [options] /sourcefile [user@]host:/destpath:將本地文件復制到遠程主機常用選項:
-C: 壓縮數據流
-r: 遞歸復制
-p: 保持原文件的屬性信息
-q: 靜默模式
-P PORT: 指明remote host的監聽端口
(2)rsync工具
基于ssh和rsh服務實現高效率的遠程系統之間復制文件
使用安全的shell連接做為傳輸方式
比scp更快,只復制不同的文件
語法:
rsync -av /etc server1:/tmp:復制目錄和目錄下文件
rsync -av /etc/ server1:/tmp:只復制目錄下文件選項:
-n 模擬復制過程
-v 顯示詳細過程
-r 遞歸復制目錄樹
-p 保留權限
-t 保留時間戳
-g 保留組信息
-o 保留所有者信息
-l 將軟鏈接文件本身進行復制(默認)
-L 將軟鏈接文件指向的文件復制
-a 存檔,相當于–rlptgoD,但不保留ACL(-A) 和SELinux屬性(-X)
(3)sftp工具
- 交互式文件傳輸工具
- 用法和傳統的ftp工具相似
- 利用ssh服務實現安全的文件上傳和下載
- 使用
ls
cd
mkdir
rmdir
pwd
get
put
等指令,可用?
或help
獲取幫助信息
(4)pssh工具
pssh是一個python編寫可以在多臺服務器上執行命令的工具,也可實現文件復制
選項如下:
--version:查看版本
-h:主機文件列表,內容格式"[user@]host[:port]"
-H:主機字符串,內容格式"[user@]host[:port]"
-l:登錄使用的用戶名
-o:輸出的文件目錄
-O:SSH的選項
-v:詳細模式
-A:手動輸入密碼模式
-x:額外的命令行參數使用空白符號,引號,反斜線處理
-X:額外的命令行參數,單個參數模式,同-x
-i:每個服務器內部處理信息輸出
-P:打印出服務器返回信息
(五)SSH端口轉發(又名“隧道”):
(1)SSH 端口轉發的功能
- SSH端口轉發:SSH將其他TCP 端口的網絡數據通過SSH 鏈接來轉發,并且自動提供了相應的加密及解密服務
- SSH端口轉發又名隧道(tunneling),SSH為其他TCP協議提供了一個安全的傳輸通道。
- 功能:
- 加密SSH Client 端至SSH Server 端之間的通訊數據
- 突破防火墻的限制完成一些之前無法建立的TCP 連接
(2)SSH本地轉發
語法:
ssh -L local_port:remote_host:remote_host_port ssh_server
local_port:本地端口(防火墻外)
remote_host:遠程主機IP(防火墻內)
remote_host_port:遠程主機不安全的TCP協議端口(防火墻內)
ssh_server:充當跳板機的ssh服務器IP(防火墻內)選項:
-f 后臺啟用
-N 不打開遠程shell,處于等待狀態
-g 啟用網關功能網絡連接狀態如圖所示:
-
示例:
-
ssh -L 2009:telnetsrv:23 -Nf sshsrv
建立從本機到telnet服務器23端口的連接,監聽本機2009端口,以sshsrv服務器為跳板 -
telnet 127.0.0.1 2009
當訪問本機的2009的端口時,被加密后轉發到sshsrv的ssh服務,再解密被轉發至telnetsrv的23端口 - 信息在端口間的流向:
data <<==>> local_host:2009 <<==>> local_host:XXXXX <<==>> ssh_srv:22 <<==>> ssh_srv:YYYYY <<==>> telnet_srv:23
-
-
實驗:建立SSH本地轉發
建立從本機192.168.136.230到telnet服務器192.168.136.224的連接,中間將ssh服務器192.168.136.229作為跳板,本地轉發端口2009
ssh -L 2009:192.168.136.224:23 -Nf 192.168.136.229
本地建立連接
telnet 127.0.0.1 2009
本地轉發連接遠程telnet服務器本地主機端口連接情況:本機連接至跳板機的ssh服務22端口
跳板機端口連接情況:跳板機一方面與本機以ssh服務22端口連接,一方面與遠程服務器以telnet服務23端口連接
遠程telnet服務器端口連接情況:跳板機連接至遠程服務器的telnet服務23端口
數據流向為:data <<==>> 127.0.0.1:2009 <<==>> 192.168.136.230:56160 <<==>> 192.168.136.229:22 <<==>> 192.168.136.229:51488 <<==>> 192.168.136.224:23
(3)SSH遠程轉發
語法:
ssh -R ssh_server_port:remote_host:remote_host_port ssh_server
ssh_server_port:(防火墻外)
remote_host_port:(防火墻內)
remote_host_port:(防火墻內)
ssh_server:(防火墻外)網絡連接狀態如圖所示:
-
示例:
ssh -R 2010:telnetsrv:23 -Nf sshsrv
建立從ssh服務器到telnet服務器23端口的連接,監聽ssh服務器2010端口,以ssh客戶端為跳板telnet sshsrv 2010
當訪問本機的2010端口時,將加密信息通過ssh服務轉發請求到本機ssh客戶端,再由本機解密后轉發到telnetsrv的23端口信息在端口間的流向:
Data <==> ssh_srv:2010 <==> ssh_srv:22 <==> local_host:XXXXX <==> local_host:YYYYY <==> telnet_srv:23
-
實驗:建立SSH遠程轉發
建立從ssh服務器192.168.136.230到telnet服務器192.167.136.224的連接,中間將本機192.168.136.229作為跳板,遠程轉發端口2010
ssh -R 2010:192.168.136.224:23 -Nf 192.168.136.230
本機建立連接telnet 127.0.0.1 2010
遠程ssh服務器連接遠程telnet服務器ssh服務器端口連接情況:ssh服務器的22端口與主機相連
主機端口連接情況:一方面作為客戶機與防火墻外的ssh服務器連接,另一方面與防火墻內的telnet服務器的23端口連接
telnet服務器端口連接情況:telnet服務器的23端口與主機相連
(4)SSH端口轉發
當用瀏覽器訪問internet時,本機的1080端口做為代理服務器,瀏覽器的訪問請求被轉發到ssh_server上,由ssh_server替之訪問internet
-
示例:
ssh -D 1080 root@sshserver
建立本地1080端口至ssh_server的ssh連接在瀏覽器設置代理本地代理:ip:127.0.0.1 port:1080
實驗:建立SSH端口轉發
通過本機(192.168.136.224)1080端口轉發請求至192.168.136.230的ssh服務器,由ssh服務器訪問192.168.136.229的httpd服務
(六)SSH的X協議轉發:
- X協議:C/S結構,Client程序向Server發出請求,Server響應請求并展現相關圖形界面
- 所有的圖形應用程序都是X客戶程序
- 能夠通過TCP/IP連接遠程X服務器
- 數據沒有加密機制,可以通過ssh連接隧道安全傳輸
- OpenSSH的實現:
ssh -X user@remotehost COMMAND