您的位置:首页 > 运维架构

20150920 加密和解密原理 Open SSL OPEN SSH使用

2015-09-30 19:54 507 查看
第一部分:加密算法和原理
第一、基础知识
1)数据加密:
SSL: Secure Socket Layer
2)NIST: (该组织评价网络安全)
保密性:
数据保密性
隐私性
完整性: (不能被修改)
数据完整性
系统完整性
可用性:
3)OSI: x.800 (OSI国际标准组织定义x.800标准)
安全攻击: (第一层面)
被动攻击:监听 (网络监听)
主动攻击:伪装、重放、消息篡改、拒绝服务 (导致服务无法进行)
安全机制: (第二层面)
加密/解密、数字签名、访问控制、数据完整性、认证交换、流量填充、路由控制、公证
(数字签名,说明发送的信息是发送人发送的)
安全服务:
认证
访问控制
数据保密性
连接保密性
无连接保密性
选择域保密性
流量保密性
数据完整性
不可否认性(用于网络交易等)
PKI:public Key Infrastructure(现代互联网机制)
4)密码算法和协议:
对称加密 (加密与解密同一个密钥)
公钥加密 (配对使用,公钥需要私钥解密)
单向加密 (只加密不能够解密)
认证协议
第二:加密算法介绍
1)加密算法和协议:
AA:对称加密:
加密和解密使用同一个密钥;速度对
依赖于:算法和密钥;
安全性依赖于密钥,而非算法;
常见算法:
DES:Data Encryption Standard, 56bits(已破解)
3DES:
AES: Advanced Encrpytion Standard, (128bits, 192, 256, 384, 512bits)
Blowfish
Twofish
IDEA
RC6
CAST5
特性:
1、加密、解密使用同一密钥;
数据输入后再输入密钥,接收到再使用密钥还原数据原来的样子)
2、将明文分隔成固定大小的块,逐个进行加密;
缺陷:
1、密钥过多;
2、密钥分发;
一个人与多个人通信需要维护多个密钥。不适合分布式使用。
BB:非对称加密:公钥加密
密钥对儿:私钥和公钥配对使用
私钥:secret key,仅允许个人使用(不能够公开);
公钥:public key,公开给所有获取;
公钥从私钥中提取而来;使用公钥加密的数据,只能使用与此公钥配对
的私钥解密;反之亦然;
用处:
身份认证:私钥拥有者用自己的私钥加密的数据,只要用其公钥能解
密,即可认证其身份;
密钥交换:与被通信方通信之前,首先获取到对方的公钥,自己生成
一个加密密码,用对方的公钥加密,并发送给对方;
数据加密:
算法:
RSA (三个人名字的简写)
DSA (数据签名标准)
ELGamal
特性:
1、密钥长度较大,例如512bits, 2048bits, 4096bits
2、加密解密分别使用密钥对儿中的密钥相对进行;
3、常用于数字签名(DSA)和密钥交换;
2)单向加密:提出数据的特征码;
特性:
1、定长输出:无论原来的数据是多大级别,其加密结果长度一样;
2、雪崩效应:原始数据微小改变,将会导致结果巨大变化;
3、不可逆:
算法:
MD5:128bits定长输出;
SHA1:160bits定长输出;
SHA256
SHA384
SHA512:
CRC32(循环冗余校验码)
/etc/shadow: ( entos 6.7使用sha512加密)
$#$#######$#############################
用处:
1、数据完整性;
3):数字签名:
4):密钥交换:IKE (Internet Key Exchange)



双方初次通信时用对方公钥加密,然后对方利用自己的私钥进行解密
这样双方即可安全通信。称为密钥交换。(密钥加密后存放)
针对上面IKE方式存在破解可能,利用DH算法进行加密。双方通信之前
生成一个对称密钥,不需要网上传输



这时双方知道各个需要的密钥。双方通信过程如下:

DH (Deffie-Hellman)
A:P,G (质数、生成器是公开的A与B都知道)
X(A生成加密数据)
P^X%G(取模计算发给B)
从B拿到:(P^Y%G)^X=P^XY%G
B:
公开:P,G
私有:Y(B生成加密数据)
P^Y%G(取模计算发给A)
从A拿到:(P^X%G)^Y=P^XY%G
5)一次加密通信过程
发送者:
1、使用单向加密算法提取生成数据的特征码;
2、使用自己的私钥加密特征码附加在数据后面;
3、生成用于对称加密的临时密钥;
4、用此临时密钥加密数据和已经使用私钥加密后的特征码;
5、使用接收方的公钥加密此临时密钥,附加在对称加密后的数据后方;
接收方:
1、使用自己的私钥解密加密的临时密钥;从而获得对称密钥;
2、使用对称密钥解密对称加密的 数据和私钥加密的特征码密文;
从而获得数据和特征码密文;
3、使用发送方的公钥解密特征码密文,从而获得从计算生成的特征码;
4、使用与对方同样的单向加密算法计算数据的特征码,并与解密而来的进行比较;
使用对称加密、公钥加密、单向加密、密钥交换保证通信安全,频繁使用对方公钥
公钥的签方方法使用CA证书。
示意图:



第一步:单向加密生成数据指纹
第二步:使用自己的私钥加特征码附加到数据后
第三步:再生成一次性对称密钥,将整个数据加密,
第四步:使用对方的公钥再次将数据加密附加到数据后面。
左则数据进行加次附加1次私钥和特征骊,另一次对方公钥
第五步:文件发送到对方,用自己私钥解密。此时获得签名信息
第六步:使用对方公钥进行解密,能够解密说明是对方的签名。发送者为对方
第七步:解密后是特征码,再比较特征码一致保证完整性

第二部分:OpenSSL
第一:基础知识
1)SSL的历史
SSL网景公司研发协议,应用层以加密的形式发送。
(在传输层与应用层之间的半层协议)
SSL通信过程:Secure socket layer(三版)
sslv1, sslv2, sslv3
目前由 IETF组织维护,定义tls(transport layer securty) v1.0相当sslv3
IETF:tls 1.0,tls v1.1,tls v1.3(目前为常用1.2版本)
http --> ssl --> https (443)
2)SSL的工作过程:
工作过程如下:
@1:客户端浏览器与服务端进行三次握手,
创建虚拟链路,然后SSL握手协议。



@2:向服务器发送多种算法,web server收到请求二者都支持的加密算
法,同时客户端向服务器请求数字证书(包括使用者的公钥)。



@3:同时服务端向客户端反馈支持的加密算法和数字证书。这里客户端
验证服务端的证书是否有效,验证后客户端接受服务端证书
@4:客户端用接受服务器端的证书保存的公钥信息,加密生成临时的一次性
会话密钥。发送到服务端



@5:服务端这请把客户端请求的网页等内容以加密的形式返回给客户端。



@6:如果有长链接方式,中间会有不断的数据通信



@7:断开SSL,然后TCP



https与http的区别在于创建虚拟链路后进行SSL握手。
握手完成后http请求和报文,这里发送信息为加密的。
客户端发送对称加密密钥给服务端。服务端用加密
信息反馈给客户端。浏览器自动解密予以显示。同时用
密钥加密请求给服务端,服务端加密响应给客户端。
最后先断开ssl联接,然后断开tcp链接(四次)




第二: 数字证书:
证书是持有者的详细信息,证书有公钥。包括名称、公钥信息等
针对证书的防伪信息叫做签名。



1)CA:签证机构 (签发证书的机构)
功用:保证公钥信息安全分发;
2)数字证书的格式(x.509 v3):
版本号(version)
序列号(serial number):CA用于惟一标识此证书;
签名算法标志(Signature algorithm identifier)
发行者的名称:即CA自己的名称;
有效期:两个日期,起始日期和终止日期;
证书主体名称:证书拥有者自己的名字
证书主体公钥信息:证书拥有者自己的公钥;
发行商的惟一标识: CA标识号
证书主体的惟一标识:
扩展信息:
签名:CA对此证书的数字签名;(防伪信息)
用单向加密算法,有CA自己的私钥加密特证码后附加到证书后面,
接受者用判断时用CA的公钥解密这段签名,如果认可说明是用效的。
同时用单向验证是否有效(加密前与解密是否一致)
3)证书通常有两类用途:
用户证书 :用户与用户之间
主机证书(httpd):服务器进程之间
撤消证书:(证书颁发机构要维护证书吊销列表)
4)PKI: Public Key Infrastructure (公钥基础设施)
签证机构:CA 用来发证
注册机构:RA 只接受注册申请
证书吊销列表:CRL
证书存取库:
私有CA
5)openssl的组成部分: (openSSL协议,加密解密SSL协议的实现)
libcrypto:加密、解密库文件;
libssl: ssl协议实现
openssl:多用途命令行工具,每种功能都使用专用的子命令来实现
前二个是库文件是开发程序可直接调用,后一个是命令工具。
6)gpg: GNU Privarcy Guard
是pgp规范的实现;
OpenPGP encryption and signing tool
7)openssl:可创建私有CA
子命令分类:
标准命令
消息摘要命令
加密、解密相关的命令
openssl ? #显示支持的命令



8)加密文件(对称加密):
工具:openssl enc, gpg
算法:des, 3des, aes, blowfish, twofish, idea, cast5
enc工具:
# openssl enc -e -CIPHERNAME -a -salt -in /PATH/FROM/SOMEFILE –out
/PATH/TO/SOMECIPHERFILE
-e表示加密 -CIPHERNAME 表示算法 3des使用des3算法(支持多种采用默认值)
-a 表示以文本输出 否则是二进制数 -salt表示加些随机数 -in+文件 加密那个文件
-out 文件 表示输出放到那个文件当中
示例:
@1:备份文件
openssl enc -e -des3 -a -salt -in fstabtest -out fstabtest.cert
根据提示输入二次密码



@2:生成fstabtest.cert,利用cat 查看,为加密后文件



# openssl enc -d -CIPHERNAME -a -salt -in /PATH/FROM/SOMECIPHERFILE –out
/PATH/TO/SOMEFILE
-d表示解密
示例:@1 将原文件fstabtest删除
@2:利用fstabtest.cert还原文件
openssl enc -d -des3 -a -salt -in fstabtest.cert -out fstabtest.new



9)单向加密:
算法:md5, sha1
工具:openssl dgst, md5sum, sha1sum, sha224sum, sha256sum, sha384sum,
sha512sum
# openssl dgst -CIPHER /PATH/TO/SOMEFILE... #dgst为单向加密算法
MAC: 消息认证码,单向加密的一种延伸应用,用于实现在网络通信中保证所传
输的数据的完整性;
机制:
CBC-MAC
HMAC:使用md5或sha1算法
示例:用md5sum /filepath/filename 提取文件特征码



方法2:使用openssl计算
openssl dgst –md5 /etc/fstab(二种方法计算一致)



10)生成用户密码: (-1表示md5单向加密)
# openssl passwd -1 -salt 8bits随机数
示例:openssl passwd -1 -salt $(openssl rand -hex 4)
表示生成用户密码为md5加密的8位16进制数




11)生成随机数:
# openssl rand -hex|-base64 NUM
-hex表示以16进制输出 -base64表示编码格式 NUM表示字节数
示例:openssl rand –hex 4(



每四位一个16进制数,4个四节为8位16制数 (4个字节为32位,4位1个16进制
数,这样共需要2个4位16进制数。这样输出为8个16进制数) rand表示随机数
也可用以使用-base64 (包括==主要作用对齐格式)有效为前6个



12)公钥加密:(二个主要功能是数字签名与密钥交换)
用公钥加密是和于密钥交换 用私钥交换用于身份验证
工具:gpg, openssl rsautl(工具)
数字签名:RSA, DSA, ELGamal
DSA: Digital Signature Algorithm
DSS: Digital Signature Standard
密钥交换:
公钥加密、DH
生成密钥对儿:
操作过程:生成私钥,从私钥中提取公钥;
-out保存到那里 NUM_bit保留多少位
# openssl genrsa -out /PATH/TO/PRIVATE_KEYFILE NUM_BITS
注意:在bash命令行上放在小括号中执行的命令,其实是通过打开一个子shell进程进行的;
#(umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEYFILE NUM_BITS)
生成文件权限为600(666-077)定义只对当前shell有效
示例:
(umask 077;openssl genrsa -out test.key 1024)



从私钥中手动提取公钥:
# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE –pubout
示例:从test.key文件中提取公钥
openssl rsa -in test.key –pubout



13)随机数生成器:
random, urandom
熵池(内存中):保存硬件中断产生的随机数,在熵池中供使用。
/dev/random:仅从熵池中返回随机数,当熵池中的随机数耗尽时,取随机数的进程将会被阻塞;
/dev/urandom:先从熵池中取随机数,当熵池中的随机耗尽时,就通过伪随机数生成器生成随机数;
伪随机数就是软件(不安全)
14)X.509 v3数字证书的格式:
获取证书的方法:
向RA注册申请
建立私有CA:
OpenSSL
OpenCA
15)使用OpenSSL构建私有CA:
1、生成私钥; (Winodws安全完成后自带)
2、生成自签署证书;(公司范围内使用)
(1) 私钥用于签发证书时,向证书添加数字签名使用;
(2) 证书:每个通信方都导入此证书至“受信任的证书颁发机构”;
配置文件:/etc/pki/tls/openssl.cnf
cat /etc/pki/tls/openssl.cnf文件



默认CA是CA_Default,第二行说明CA_default默认CA的定义
首先是目录为/etc/pki/ca



下面$dir引用 /etc/pki/ca目录,说明其cert目录下是主书
crl(吊销所在目录),签名和持有都数据文件在$dir/index.txt数据库文件中。
新生成证书目录、序列号、吊销编号、CA自己的私钥文件$dir/private/
示例:自己创建CA过程
工作目录:/etc/pki/CA/



建立私有CA:
1、生成私钥文件: /etc/pki/CA/private/cakey.pem
# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)



私钥保存到private目录下的cakey.pem文件
2、私钥生成自签证书
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem –out
/etc/pki/CA/cacert.pem -days 120
-new: 生成新的证书签署请求;
-key:私钥文件路径,用于提取公钥;
-days N: 证书有效时长,单位为“天”;
-out:输出文件保存位置;
-x509:直接输出自签署的证书文件,通常只有构建CA时才这么用;



提示输入国家信息等(二位缩写)CN(注意:主机名要一致)



这里生成CA自己的证书(cacert.pem)



3、提供辅助文件
# touch /etc/pki/CA/index.txt (CA提供索引文件,从01开始)
# echo 01 > /etc/pki/CA/serial



以上完成自签CA的创建,后续可发给相应程序。
4、提供给httpd服务提供证书
@1:创建ssl目录以及私钥(默认长度为1024)为httpd.key文件



@2:创建签名请求(让CA签名)



这里要求与上述httpd配置相同
@3:将要httpd证书签名请求文件发送给CA证书服务器
这里测试CA 证书服务器地址为 172.16.16.104
httpd服务器的地址为172.16.16.105
scp httpd.csr root@172.16.16.104:/tmp/



@4:为httpd证书签名请示,签证书(在CA证书服务器签发)
openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/www.uec.com.c



@5:输入y确定,同时查看index.txt数据库



01代表编号



这里在newcerts和certs目录中保存证书文件





@6:签发完成,返还给httpd服务器端



以后可以使用ssl目录下的www.uec.com.crt证书进行通信。
16)给节点发证书:
1、节点申请证书
在证书申请的主机上进行如下步骤:
(1) 生成私钥;
(2) 生成证书签署请求;
注意:
(a) 其中的subject信息部分,要与CA的保持一致;
(b) Common Name要使用此主机在通信真实使用名字;
(3) 把请求发送给CA;
2、CA签发证书
(1) 验正请求者信息
(2) 签署证书
# openssl ca -in /PATH/FROM/CSR_FILE -out /PATH/TO/CRT_FILE -days N
(3) 把签署好的证书发还给请求者
吊销证书:
1、获取吊销证书的序列号;
# openssl x509 -in /PATH/FROM/CRT_FILE -noout -serial –subject



2、实现证书吊销
(1) 吊销证书
# openssl ca -revoke /PATH/FROM/CRT_FILE



(2) 生成吊销证书的编号
echo 01 > /etc/pki/CA/crlnumber



(3) 更新证书吊销列表
# openssl ca -gencrl -out /etc/pki/CA/crl/aalist.crl



查看更新列表
openssl crl -noout -text -in /etc/pki/CA/crl/aalist.crl



总结:子命令genrsa, req, ca, x509, crl
博客作业:加密、解密,以及OpenSSL建立私有CA;
回顾过程
步骤1:tcp创建虚拟链路以后,进行ssl 握手认证
步骤2:客户端发送自己支持的各个加密算法并向服务端索取
服务端证书
步骤3:服务端收到请求,在众多加密算法中也支持,同时认为比较
安全的发还给客户端。同时将自己证书发给客户端
步骤4:客户端验证是那台服务器(拥有私钥的只有自己的服务器)
A: 服务器的名称与证书中一致、否则拒决
B:一致判断是否是信息的CA所发(用本地缓存的信任的CA的公钥,
解密证书后的签名,如果能够解密说明是信任的CA所签发)否则拒绝
C:再次验证证书的内容是否被篡改过,用单向加密算法计算特征码,与
解密的特征码是否一致,说明证书内容可接受
D:检查证书是否在有效期内
E:检查证书是否被吊销?
F:经过以上认证是说明证书是有效的
请求---》响应--》验证完整
步骤5:客户端从服务器取得公钥,于是生成对称加密密钥,有公钥加密后
再次发给服务端
步骤6:服务端拥有的对称密钥,称为密钥交换
步骤7:双方使用对称密钥进行通信




第二部分:OpenSSH
加密、解密的示例
1、原理及定义
1)telnet配置
telnet为明文,传输和密码等过程都为明文,由xinetd超级守护进程管理
AA:在centos 7中安装需要安装xinetd和telnet-server二个包



BB:telnet启用和重启xinetd守护进程
(左则为centos 6,右则为 centos 7)





CC:ss –tnl 确定tcp 23端口处于listen状态



DD:centos默认不支持telnet root用户登陆,使用其它用户登陆即可。但可以
通过su切换至root用户(iptabls –F 清除防火墙)
2)ssh 简介
ssh: secure shell (监听端口22/tcp) 代替telnet (23/tcp), rcp, rlogin协议
ssh protocol: (
v1, v2(目前v2)
3)两种方式的用户认证:
基于口令
基于密钥:基于公钥加密技术,密钥成对出现,用公钥加密私钥解密。
公钥不公开,放到服务器端。私钥在本地端。登陆时用私钥加密数据,用
服务端存储的存储的公钥解密,说明二者是配对的。基于此种方式进行认证。
这样可以不需要输入口令进行认证。openssh是基于DH算法进行密钥交换的,
基于rsa或dsa进行身份认证。
4)SSH简单通信模型



第一步:客户端连接服务端时进行验证,这里服务端将证书发给客户端
客户端通过证书确定是要连接的服务器,服务端自己的身份信息给客户端。
第二步:客户端接收服务端发过来的信息,这时双方通信完成,但安全性不高
安全做法:是在服务器初次部署时产生的公钥,在客户端部署时导入公钥信息。
客户端在连接时导入。这种为安全做法。
第三步:以上二步完成连接认证,通过DH完成密钥交换,这里客户端与服务端
有对称密钥。
第四步:服务端给客户端一个login in登陆认证界面。
第五步:客户端输入信息发给服务端(这里双方利用加密的对称密码进行通信)
第六步:服务端解密确定OK,然后客户端将密码加密再次给服务端
后续所有通信都为加密的
6)SSH C/S架构
包括服务端与客户端
Server: sshd
Client:
Linux: ssh
Windows:
xshell
putty
securecrt
...
7)OpenSSH:
openssh是ssh的实现
sshd: 服务器
ssh: 客户端
scp: 安全跨主机复制工具,基于ssh协议实现;
sftp 安全的FTP功能
sshd: /etc/ssh/sshd_config 定义如何定义监听套接字提供服务,那个端口等
AllowUsers,AllowGrops,DenUsers,DenGroups,Port,Protocol
man sshd_config
ssh: /etc/ssh/ssh_config 远程登陆服务器端的选项等,在配置文件中指定
man ssh_config
AA:ssh命令行客户端:
ssh [options] [-l user] host ['COMMAND'] #user为远程主机的用户
ssh [options] [user@]host ['COMMAND'] #如果不使用-l 表示以本机用户登陆
-p PORT
示例:



示例:返回远程主机命令的执行结果



BB:基于密钥认证:
在客户端生成一对密钥,私自己留存;公钥通过私密方式保存至要登录的远程服务
某用户的家目录的专用于ssh通信的文件;(只是单向)
# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.put user@host
示例:@1 #ssh-keygen –t rsa rsa算法,默认保存在家目录隐藏目录中



@2:这里家目录下生成三个文件:id_rsa.pub为公钥,id_rsa为私钥



@3:将公钥文件id_rsa.pub复制到远程主机的家目录
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.16.105



@4:验证:利用ssh登陆远程主机



CC:scp远程复制命令:
push: scp [-rp] /path/from/somefile user@host:/path/to/somewhere
本地文件至远程主机 -r是目录, –p表示保留权限
pull: scp [-rp] user@host:/path/from/somefile /path/to/somewhere
远程文件至本机(拉文件)
-P(大写) PORT
示例:将本机/etc/fstab文件复制到远程172.16.16.105 /tmp目录



相类:拉文件至本机



DD:sshd服务器端的配置:
/etc/ssh/sshd_config
directive value (指令 值)的形式
Port 22
Protocol 2
限制可登录用户:
PermitRootLogin : 是否允许管理员直接登录;
AllowUsers user1 user2 ...
AllowGroups grp1 grp2 ...
DenyUsers user1 ...
DenyGroups grp1 ...
仅监听需要监听的IP地址:
ListenAddress 0.0.0.0
使用强密码策略:
禁用使用空密码
限制ssh连接次数
限制ssh最大密码尝试次数
登陆错误所在目录 cat /var/log/secure
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: