OpenSSL
一、概念类
传输层协议:TCP,UDP,SCTP
port:进程地址,进程向内核注册使用某端口(独占)
同一主机上的进程间通信:IPC,message queue,shm,semephor
不同主机上的进程间通信:socket(也可用于同一主机间通信),
socket=ip:port
cip:port -- sip:port,已建立连接的套结字都是一对socket
监听模式:listen(ip:port)
SSL:Secure Sockets Layer
http -> ssl ->https
安全的通信目标:
1.保密性:confidentiallity
2.完整性:integrity
3.可用性:availabilty
攻击类型:
威胁保密性攻击:窃听,通信量分析
威胁完整性攻击:更改,伪装,重放,否认
威胁可用性攻击:拒绝服务(DoS)
针对攻击的解决方案
技术:加密解密
服务:用于抵御攻击的服务,安全服务
加密和解密:
传统加密方法:替代加密方法,置换加密方法
现代加密方法:现代块加密方法,
服务:
认证机制
访问控制机制
二、密钥算法和协议
密钥算法和协议
对称加密
公钥加密
单向加密
密钥交换
对称加密:加密和解密使用同一个密钥,(解决保密性问题)
DES(data encryption standard)des算法_百度百科 (baidu.com)
3DES:Triple DES,三轮DES加密
AES:Advanced Encryption Standard(密钥长度128bit,192bit,256bit)
特性:
1.加密解密使用同一个密钥
2.将原始数据分割为固定大小的块,逐个进行加密
缺陷:
1.密钥过多
2.密钥分发困难
公钥加密(非对称加密),身份认证,密钥交换,数据加密(比对称加密慢3个数量级,10的3次幂)
密钥成对出现,密钥分为:公钥,私钥
公钥:可以公开给所有人,pubkey,公钥从私钥中提取产生
私钥:通过工具创建,使用者自己留存,必须保证其私密性,secret key,skey
特点:
用公钥加密的数据,只能使用与之配对的私钥解密,反之亦然
用途:
数字签名:主要用于接收方确认发送方身份,使用私钥对需要传输的文本的摘要进行加密,得到的密文即被称为该次传输过程的签名
密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方
数据加密:通常不用于数据加密,效率低
点对点模型示例:client A, sever B
加密过程:
1. B将data1通过<单向加密>算法,提取特征码(如MD5),通过自己私钥对特征码进行加密(数字签名,用以完成身份认证),生成数字签名,附加在数据后,称为data2,保证发送方身份和数据完整性
2.B生成一次性<对称加密>密码,将data2通过对称加密对整段数据进行加密(保密性),称为data3
3.B将data3通过A的公钥对一次性对称加密密码进行加密(密钥交换),附加在数据后,成为data4(保证其保密性),发送给A
解密过程:
1. A获取data4,先用自己的私钥对对称加密密码进行解密,获得data3+对称密码
2. A用对称密码对data3解密,获得data2和MD5
3. A用B公钥对特征码进行解密(身份认证),用MD5验证data1完整性
缺点:容易受到中间人攻击,进而需要CA
CA:保证通信双方能够拿到正确公钥的公信机构
算法:RSA,DSA,ELGamal
DSA:digital signature algorithm,仅能用于签名,而不能用于加解密
DSS:digital signature standard
RSA:即能签名也能用于加解密
单向加密:只能加密,不能解密,只能提取数据特征码md5等(保证数据完整性)
特点:
定长输出
雪崩效应(加密数据的微小改变,导致密码巨大变化)
功能:用于验证数据完整性
算法:
1.MD5:Message-Digest Algorithm 5,128bit信息摘要算法
2.sha1:Secure Hash Algorithm 1,160bit,安全散列算法
sha224,sha256,sha384,,sha512
centos6,7用户密码加密:sha512
cenots5用户密码加密:md5
密钥交换:IKE :Internet key exchange互联网密钥交换协议
RSA(公钥加密)
DH:deffie-hellman(迪菲-赫尔曼)
优势在于让双方不用发密码就可以得到密码
模型:
A:p,g
B:p,g
A:x
p^x%g==>B
A:(p^y%g)^x
B:y
p^y%g==>A
B:(p^x%g)^y
(p^y%g)^x = (p^x%g)^y
(p^x%g)^y为密码
ECDH:椭圆曲线DH
ECDH:临时椭圆曲线DH
三、实现
PKI: public key infrastructure,公钥基础设施
签证机构:CA(市公安机关)
注册机构:RA(派出所)
证书吊销列表:CRL
证书存取库:
互联网通信强依赖PKI
X.509v3:定义了证书的结构以及认证协议标准
版本号:用来区分X.509的不同版本号
序列号:由CA给予每一个证书的分配唯一的数字型编号,当证书被取消时,实际上是将此证书的序列号放入由CA签发的CRL中;这也是序列号唯一的原因。
签名算法ID:用来指定用CA签发证书时所使用的签名算法。算法标识符用来指定CA签发证书时所使用的公开密钥算法和HASH算法,须向国际指明标准组织(如ISO)注册。
发行者名称(认证机构):即发出该证书的机构唯一的CA的x.500名字;
有效期限:证书有效的时间包括两个日期:证书开始生效期和证书失效的日期和时间。在所指定的这两个时间之间有效;
主体名称:证书持有人的姓名、服务处所等信息;
主体公钥:包括被证明有效的公钥值和加上使用这个公钥的方法名称;
发行者唯一标示
主体的唯一标识
扩展
发行者签名:以确保这个证书在发放之后没有被撰改过;
CA使用模型:
Clinet C,Server S
C获取S证书,验证证书:
用CA的公钥去解密CA签名,能解密说明证书来源可靠
用同样的加密算法去加密证书取得特征码,和解密证书特征码比较,说明完整性可靠
检查证书有效期限
验证主体名称和通信人是否一致
检查证书是否被吊销
SSL:secure socket layer
安全套接层是Netscape公司率先采用的网络安全协议
v1.0(1994),v2.0,v3.0
TLS:transport layer security
安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性
IETF研发:1999
v1.0,v1.1,v1.2,v1.3
我们统称的SSL,实际是指SSL或TLS
TLS分层设计:
1.最底层:基础算法原语实现aes,rsa,md5
2.向上一层:各种算法实现
3.向上一层:组合算法实现的半成品
4.用各种组件拼装而成的各种成品密码密码学协议软件
协议开源实现:openssl
四、SSL handshake
OpenSSL由三部分组成:
1. libencrpt库:加密解密库
2. libssl库,实现SSL功能,用于通信加密的库
3. openssl:多用途命令行工具
SSL主要简化有3步:
1. 客户端向服务器端索要并验证对方证书
2. 双方协商生成会话密钥
前两部合成握手阶段,handshake
3. 双方采用会话密钥进行加密通信
4. 断开
--------ssl handshake 流程------------
第一阶段:客户端通过浏览器向服务器发出加密通信请求:
clinethello:
1. 向服务器发送自己支持的协议版本,比如TLS1.2
2. 客户端生成的随机数,稍后用于生成会话密钥
3. 支持的加密算法,比如AES,3DES,RSA
4. 支持的压缩算法
第二阶段:服务器端回应客户端
Serverhello:
1. 确认使用的通信加密协议版本,比如TLS1.2
2. 服务器端生成一个随即数,稍后用于生成会要密钥
3. 确认使用的加密算法
4. 发送服务器证书;
5. 索要客户端证书(如果需要)
第三阶段:客户端收到服务器端的回应
1. 验证服务器证书(发证机构,证书签名,证书完整性,证书持有者,证书有效期,吊销列表等等),确认无误后,取出服务器公钥
2. 发送以下信息给服务器端:
a) 一个随机数(第三个随即数),用服务器公钥对这个随机数加密
b) 编码变更通知(随后信息,用双方商定的加密算法进行发送)
c) 客户端握手结束通知
第四阶段:服务器回应
1. 收到客户端发来的第三个随机数pre-master-key,计算生成本次会话所用的“会话密钥”
2. 向客户端发送如下信息:
a) 编码变更通知,表示随后的信息都将用双方商定的加密算法和密钥发送
b) 服务器握手结束通知
---------ssl handshake-----------------
五、OpenSSL
组件:
Libcrypto,libssl主要由开发者使用
openssl:多用途命令行工具
openssl命令分类:
standard commands:标准命令
message digest:消息摘要命令
cipher commands:加密命令
标准命令:enc,ca,req,genrsa
对称加密,使用openssl完成对称加密:
工具:openssl enc
算法:3des,aes,blowfish
enc命令:
enc - symmetric cipher routines
openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P][-bufsize number] [-nopad] [-debug] [-none] [-engine id]
-e加密,-d解密,-a(-base64)文本加密
实例:
加密:
openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
解密:
openssl enc -d -des3 -a -salt -in fstab.ciphertext -out fstab
单向加密:
工具:openssl dgst,md5sum,sha1sum,sha224sum
dgst:
提取摘要
openssl dgst -md5 fstab
openssl dgst -md5 -out fstab.md5 fstab
验证摘要:
生成用户密码的命令:
工具:passwd, openssl passwd
openssl passwd:
openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}
openssl passwd -1 -salt 123456
-1(一)标示MD5加密,-salt不变,密文不变
生成随即数,salt
工具:openssl rand
openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num
openssl rand -base64 10
L4JQf3hy3RdPtQ==
使用时需要删除==
openssl rand -hex 10
f858abb49c1b72e5188d
openssl passwd -1 -salt $(openssl rand -hex 4)
$1$7d20e521$fp7jFdPa8IRTqjx1FbKHL/
公钥加密:
三种功能:
加密解密:
算法:rsa,elgamal
工具:openssl rsautl,gpg
数字签名
算法:rsa, dsa, elgamal
工具:openssl rsautl,gpg
密钥交换
算法:dh
生成密钥对
1. 生成私钥
openssl genrsa [-out filename] [-passout arg] [-aes128] [-aes192] [-aes256] [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]
openssl genrsa -out ./mykey3.private 1024
openssl genrsa 1024 > mykey.private
openssl genrsa 1024
修改为仅自己能读能写
(umask 077; openssl genrsa -out mykey4.private 1024)
使用()表示启用子shell启动进程,主进程不受影响
2. 提取公钥
openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-sgckey] [-aes128] [-aes192] [-aes256] [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-RSAPublicKey_in] [-RSAPublicKey_out] [-engine id]
openssl rsa -in mykey.private -pubout -out mykey.pub
3. linux系统上的随机数生成器:
a) /dev/random:仅从熵池中返回随机数,随机数用尽,阻塞
b) /dev/urandom:从熵池中返回随机数,随即数用尽,会利用软件生成伪随即数,非阻塞
伪随即数不安全,熵池:内核在内存中维护的一个空间,空间内存储大量随机数,
熵池中的随机数来源:
硬盘IO中断时间间隔
键盘IO中断时间间隔
如果随机数用尽,可以拷贝大数据到硬盘,产生大量IO
CA:
分为两类:
公共信任的CA,
私有CA
建立私有CA:
openssl
OpenCA(图形界面工具)
openssl命令:
其配置文件/etc/pki/tls/openssl.cnf
构建私有CA:在确定配置为CA的服务器上生成一个自签证书,并为CA提供所需的目录及文件即可
步骤:
1. 生成私钥,默认要求生成在/etc/pki/CA/private/
(umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
2. 生成自签证书,要配置在/etc/pki/CA/cacert.pem
req - PKCS#10 certificate request and certificate generating utility.
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
-new 生成新证书签署请求
-x509 生成自签格式证书,专用于创建私有CA时
-key 生成请求时用到的私有文件路径
-days 证书有效时长
-out 输出路径
3. 为CA提供所需的目录及文件
mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
touch /etc/pki/CA/{serial,index.txt}
echo 01 > /etc/pki/CA/serial
某用到证书安全通信的服务器,需要向CA请求签署证书:
步骤:以httpd为例
1. 用到证书的主机生成私钥
mkdir /etc/httpd/ssl
(umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
cd /etc/httpd/ssl
2. 生成证书签署请求
openssl req -new -key httpd.key -out httpd.csr -days 365
3. 将请求通过可靠方式发送给CA
a) 把httpd.csr拷贝给CA
cp httpd.csr /tmp/
------------以上在请求主机作,以下在CA主机---------------
4. 在CA主机签署证书
openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
查看证书信息
openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
serial=01
subject= /C=CN/ST=Liaoning/O=tianlang/OU=Ops/CN=k8s-node-02
5. CA给客户提供认证
cp certs/httpd.crt /etc/httpd/ssl/
吊销证书:
步骤:
1. 客户端获取要证书吊销的serial
openssl x509 -in certs/httpd.crt -noout -serial -subject
2. CA主机吊销证书
先根据客户提交的serial和subject信息,对比其与本机index.txt中信息是否一致
吊销:
openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
其中serial.pem要换成证书真正的序列号
3.生成吊销证书的吊销编号(第一次吊销证书执行)
echo 01>/etc/pki/CA/crlnumber
4.更新证书吊销列表
openssl ca -gencrl -out thisca.crl
查看crl文件
openssl crl -in /path -noout -text
OpenSSH 和 OpenSSL 并不是直系亲属,顶多算有共同志向的兄弟!
它们是由不同的团队开发,有不同的目的,但是都开放源码,为安全通信提供支持。
一、OpenSSH
OpenSSH 是使用 SSH 协议进行远程登录的连接工具。 它加密所有通信讯息以消除窃听、连接劫持和其他攻击。 此外,OpenSSH 提供了大量的安全隧道功能、多种身份验证方法和复杂的配置选项。
OpenSSH 包含的组件如下:
(1)ssh
OpenSSH 远程登录客户端,作为 rlogin 和 Telnet 的替代方案。
(2)scp
OpenSSH 安全文件复制,作为 rcp 的替代方案,将文件复制到其他电脑上。
(3)sftp
OpenSSH 安全文件传输,类似于 scp。
(4)sshd
OpenSSH 守护进程。
(5)ssh-keygen
OpenSSH 身份验证密钥实用程序,产生RSA或ECDSA密钥,用来认证用。
(6)ssh-agent
OpenSSH 身份验证代理,用于帮助用户不需要每次都要输入密钥密码的工具。
(7)ssh-add
向 OpenSSH 身份验证代理添加私钥身份,用于帮助用户不需要每次都要输入密钥密码的工具。
(8)ssh-keyscan
从服务器收集 SSH 公钥,并记录公钥。
在类 Unix 系统中的远程登录就采用了 SSH 协议,只有安装了相应软件包才能实现远程登录。
二、OpenSSL
OpenSSL 是一个开源的软件库,使用包含了众多加解密算法,用于传输层安全性 (TLS) 和安全套接字层 (SSL) 协议的强大、商业级和功能齐全的工具包。
主要库是以 C 语言所写成,实现了基本的加密功能,实现了SSL与TLS协议。