openssl学习

openssl学习


安全机制:

加密、数字签名、访问控制、数据完整性、认证交换、流量填充、路由控制、公证

安全服务:

认证
访问控制
数据保密性
	连接保密性
	无连接保密性
	流量保密性
数据完整性
不可否认性

设计基本原则

使用成熟的安全系统
以小人之心度输入数据
外部系统是不安全的
最小授权
减少外部接口
缺省使用安全模式
安全不是似是而非
从STRIDE思考
在入口处检查
从管理上保护好你的系统

安全算法

常用安全技术
认证授权
安全通信
密码算法和协议:
	对称加密
	公钥加密
	单向加密
	认证协议
Linux系统:OpenSSL,gpg(pgp协议的实现)

对称加密算法

对称加密:加密和解密使用同一个密钥

1算法公开
2秘钥不公开
A--data-加密kev-data'-解密key2-data-B
DES keyl = key2

DES:Data Encryption Standard,56bits
3DES:
AES:Advanced(128,192,256bits)
Blowfish,Twofish 
IDEA,RC6,CAST5

特性:

1、加密、解密使用同一个密钥,效率高 2、将原始数据分割成固定大的块,逐个进行加密

缺陷:

1、密钥过多 2、密钥分发 3、数据来源无法确认

非对称加密算法

公钥加密:密钥是成对出现

>公钥:公开给所有人;public key
>私钥:自己留存,必须保证其私密性;secret key

特点:

用公钥加密数据,只能使用与之配对的私钥解密;反之亦然 ## 功能: ``` >数字签名:主要在于让接收方确认发送方身份 >对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方 >数据加密:适合加密较小数音 ```

缺点:

密钥长,加密解密效率低

算法:

RSA(加密,数字签名),DSA(数字签名),ELGamal

Pb{Sa(data)} Pb{data+Sa {hash(data)}} hash(data) Pa(Sa {hash(data)}) key{data+Sa (hash(data))}+Pb(key)

密钥交换

密钥交换:IKE(Internet Key Exchange)

公钥加密: DH(Deffie-Hellman):生成会话密钥,参看: https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange

DH:

1、A:a.p协商生成公开的整数a,大素数p B:a,p
2、A:生成隐私数据x区p),计算得出a~×%p,发送给B 
   B:生成隐私数据y,计算得出-a~y%p,发送给A
3、A:计算得出[(a~y%p)~x]%p=a~xy%p,生成为密钥
   B:计算得出[(a~×%p)~y]%p=a~xy%p,生成为密钥
   
   a=2,p=11
   A:x=3
   B: y=4
   2^3=8%11=8
   2^4=16%11=5
   [5^3]%11=4
   [8^4]%11=4

使用gpg实现对称加密

对称加密file文件
	gpg-c file
	Is file.gpg
在另一台主机上解密file
	gpg-o file-d file.gpg

使用gpg工具实现公钥加密

在hostB主机上用公钥加密,在hostA主机上解密
在hostA主机上生成公钥/私钥对
	gpg --gen-key
在hostA主机上查看公钥
	gpg --list-keys
在hostA主机上导出公钥到wang.pubkey
	gpg -a --export -o wang.pubkey  (-a以一定格式)
从hostA主机上复制公钥文件到需加密的B主机上
	scp wang.pubkey hostB
	
在需加密数据的hostB主机上生成公钥/私钥对
	gpg --list-keys 
	gpg --gen-key
在hostB主机上导入公钥
	gpg --import wang.pubkey 
	gpg --list-keys
用从hostA主机导入的公钥,加密hostB主机的文件file,生成file.9pg 工再数音
	gpg -e -r wangxiaochun file
	file file.gpg
	
复制加密文件到hostA主机
	scp fstab.gpg hostA:
在hostA主机解密文件
	gpg -d file.gpg
	gpg -o file -d file.gpg
删除公钥和私钥
	gpg- -delete-keys wangxiaochun
 gpg--delete-secret-keys wangxiaochun

A、B非对称加密关键问题,拿到的是否是对方的公钥

是否有第三方C搞了一把错误的公钥给A,这时候A不但解不开B的数据, C如果获取还可以解开

CA和证书

PKI:Public Key Infrastructure

签证机构:CA(Certificate Authority)
注册机构:RA
证书吊销列表:CRL
证书存取库:

X.509:定义了证书的结构以及认证协议标准

版本号
主体公钥
序列号
CRL分发点
签名算法
扩展信息
颁发者
发行者签名
有效期限
主体名称

证书获取

证书类型:

证书授权机构的证书
服务器
用户证书

获取证书两种方法:·

使用证书授权机构
	生成签名请求(csr)
	将csr发送给CA
	从CA处接收签名
自签名的证书
	自已签发自己的公钥

安全协议

SSL:Secure Socket Layer

	TLS:Transport Layer Security
		1995:SSL 2.0 Netscape
		1996:SSL3.01999:TLS 1.0
		2006:TLS 1.1IETF(Internet工程任务组)RFC 4346
		2008:TLS 1.2当前使用
		2015:TLS 1.3
	功能:机密性,认证,完整性,重放保护

两阶段协议,分为握手阶段和应用阶段

	握手阶段(协商阶段):客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使用的所有密钥都是通过MasterSecret生成。
	应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信

Handshake协议:

包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换

ChangeCipherSpec 协议:

一条消息表明握手协议已经完成

Alert协议:

对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告

Record 协议:

包括对消息的分段、压缩、消息认证和完整性保护、加密等

HTTPS协议:

就是“HTTP协议”和“SSL/TLS协议”的组合。HTTP over-SSL”或“HTTP over TLS”,对http协议的文本数据进行加密处理后,成为二进制形式传输

ethernet(ip(tcp(tls(app(data)))))
ethernet(ip(tcp(tls(app(data)))))

https://www.taobao.com
(CA私钥签名的公钥)Sca(Ptaobao)+有效期+CA+算法
CA公钥一般都是在电脑里面了 Ptaobao (得到公钥)

客户端生成sessionkey 用公钥加密, 服务端私钥解密
sessionkey(data)会话秘钥定期会更换

OpenSSL:开源项目

三个组件:

		openssl:多用途的命令行工具,包openssl libcrypto:
		加密算法库,包openssl-libs libssl:
		加密模块应用库,实现了ssl及tls,包nss sopenssl命令:

两种运行模式:

		交互模式和批处理模式
		openssl version:程序版本号
		标准命令、消息摘要命令、加密命令
		标准命令:
			enc,ca,req,…

Openssl命令

对称加密:

	工具:openssl enc,9pg
	算法:3des,aes,blowfish,twofish

enc命令:

帮助:man enc
加密:
openssl enc -e -des3 -a -salt -in testfile -out tesfile.cipher
解密:
openssl enc -d -des3 -a -salt -in testfile.cipher -out testfile 

单向加密:

工具:md5sum,sha1sum,sha224sum,sha256sum.. openssl dgst

dgst命令

帮助:man dgst 
openssl dgst-md5[-hex默认]/PATH/SOMEFILE 
openssl dgst-md5 testfile md5sum/PATH/TO/SOMEFILE ## MAC:Message.Authentication Code 单向加密的一种延伸应用,用于实现网络通信中保证所传输数据的完整性机制
CBC-MAC 
HMAC:使用md5或sha1算法

生成用户密码:

passwd命令:
帮助:man sslpasswd 
openssl passwd-1-salt SALT(最多8位)
openssl passwd-1-salt centos ## 生成随机数:
帮助:man sslrand 
openssl rand -base64| -hex NUM 
NUM:表示字节数;-hex时,每个字符为十六进制,相当于4位二进制,出现的字符数为NUM*2

公钥加密:

算法:RSA,ELGamal
工具:gpg.openssl rsautl(man rsautl) ## 数字签名:
算法:RSA,DSA,ELGamal ## 密钥交换:
算法:dh 
DSA:Digital Signature,Algorithm 
DSS:Digital Signature Standard 
RSA

#生成公钥私钥

生成密钥对儿:

man genrsa

生成私钥

openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS (umask 077;openssl genrsa -out test.key -des 2048)(私钥太危险,使用对称密钥加密一下)

从私钥中提取出公钥

openssl rsa -in PRIVATEKEYFILE -pubout -out PUBLICKEYFILE openssl rsa -in test.key -pubout -out test.key.pub

随机数生成器:伪随机数字

键盘和鼠标
块设备中断
/dev/random:仅从熵池返回随机数;随机数用尽,阻塞
/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞

PKI:Public Key Infrastructure

CA
RA 
CRL
证书存取库 ## 建立私有CA:
OpenCA
openssl ## 证书申请及签署步骤:
1、生成申请请求
2、RA核验
3、CA签署
4、获取证书

创建私有CA:

	openssl的配置文件:/etc/pki/tls/openssl.cnf
	三种策略:匹配、支持和可选
	匹配指要求申请填写的信息跟CA设置信息必须一致,支持指必须填写这项申请信息,可选指可有可无

1、创建所需要的文件

	touch /etc/pki/CA/index.txt 生成证书索引数据库文件
	echo 01>/etc/pki/CA/serial 指定第一个颁发证书的序列号

2、CA自签证书

	生成私钥cd/etc/pki/CA/
	(umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
	
	生成自签名证书
	openssl req -new -×509 -key 
	/etc/pki/CA/private/cakey.pem -days 7300 -out
	/etc/pki/CA/cacert.pem
		-new:生成新证书签署请求
		-×509:专用于CA生成自签证书
		-key:生成请求时用到的私钥文件
		-days n:证书的有效期限
		-out /PATH/TO/SOMECERTFILE:证书的保存路径

3、颁发证书

在需要使用证书的主机生成证书请求

给web服务器生成私钥
(umask 066;openssl genrsa-out /etc/pki/tls/private/test.key 2048)
生成证书申请文件
openssl req-new-key/etc/pki/tls/private/test.key -days 365 -out etc/pki/tls/test.csr ### 将证书请求文件传输给CA ### CA签署证书,并将证书颁发给请求者
openssl ca -in /tmp/test.csr -out /etc/pki/CA/certs/test.crt -days 365
注意:默认国家,省,公司名称三项必须和CA一致

查看证书中的信息:

openssl ×509 -in /PATH/FROMWCERT_FILE-noout
-text|issuer|subject|serial|dates 
openssl ca -status SERIAL 查看指定编号的证书状态 ## 4、吊销证书 ### 在客户端获取要吊销的证书的serial 
openssl ×509 -in /PATH/FROM/CERT_FILE -noout -serial -subject ### 对比检验客户提交的serial与subject信息是否与index.txt文件中的信息一致
在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致,吊销证书:
openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem

指定第一个吊销证书的编号

注意:第一次更新证书吊销列表前,才需要执行
echo 01 > /etc/pki/CA/crlnumber ### 更新证书吊销列表
openssl ca -gencrl -out /etc/pki/CA/crl/crl.pem
查看cr文件:
openssl crl -in /etc/pki/CA/crl/crl.pem -noout -text