OpenSSL
传输层协议:TCP传输控制协议,UDP用户数据协议,SCTP流控制传输协议
port:内核中的传输层提供的进程地址,进程向内核注册使用某端口(独占)
同一主机上的进程间通信:
IPC机制
message queue(消息队列),
shm,共享内存
semerphor旗语
不同主上的进程间通信:
基于TCP/IP中研发的一种机制:socket(端口)
cip:port<-- --> sip:port
监听模式:LISTEN(ip:port)
Web本身不具有加密解密的功能
SSL:Secure Sockets Layer安全的套接字层在应用层与传输层之间作为一个夹层库
功能:为应用层调用者完成加密解密以及秘钥的功能
这些加密解密的功能是应用程序调用或者自带,其他的层是不具有的,如下:
http--> ssl --> https
安全的目标:
保密性:confidentiality
完整性:integrity
可用性:availability
攻击类型:
威胁保密性的攻击:窃听、通信量分析;
威胁完整性的攻击:更改、伪装、重放、否认
威胁可用性的攻击:拒绝服务(DoS)
解决方案:
技术(加密和解密)、服务(用于抵御攻击的服务,也即是为了上述安全目标而特地设计的安全服务)
加密和解密:
传统加密方法:替代加密方法、置换加密方法
现代加密方法:现代块加密方法
服务:
认证机制
访问控制机制
密钥算法和协议(密钥都是成对出现的)
对称加密
公钥加密
单向加密
认证协议
Linux系统:OpenSSL(ssl), GPG(pgp)
OpenSSL由三部分组成:
libencrypt库,libssl库,openssl多用途命令行工具
加密算法和协议:
对称加密:加密和解密使用同一个密钥;
DES:Data EncryptionStandard;
3DES:Triple DES;
AES:Advanced EncryptionStandard; (128bits, 192bits, 256bits,384bits)
Blowfish
Twofish
IDEA
RC6
CAST5
特性:
1、加密、解密使用同一个密钥;
2、将原始数据分割成为固定大小的块,逐个进行加密;
缺陷:
1、密钥过多;
2、密钥分发困难;
公钥加密:密钥分为公钥与私钥
公钥加密速度比对称加密慢的很多
公钥:从私钥中提取产生;可公开给所有人;pubkey
私钥:通过工具创建,使用者自己留存,必须保证其私密性;secret key;
特点:用公钥加密的数据,只能使用与之配对儿的私钥解密;反之亦然;
公钥的两种用途:
数字签名:主要在于让接收方确认发送方的身份;
数字签名实现方法:
1. Alice定向输出(MD5等128位)提取数据的特征码:
2. Alice用私钥加密特征码(生成的就是数字签名)发送给Bob
3. Bob使用公钥解密特征码(如果能解密,就可以确认发送者是Alice)
4. Bob定向输出(MD5等128位)对数据再次提取特征码与解密出来的Alice定向输出的特征码比对,确认数据传输过程中,是否被篡改
总结:优点:验证发送者身份以及数据完整性
缺陷:漏洞是数据保密性无法认证
密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方;
密钥交换实现方法;
1. Alice定向输出(MD5等128位)提取数据特征码
2. Alice使用私钥加密数据特征码形成数字签名,
3. Alice使用一个一次性的对称加密算法加密数据以及数据特征码(即数字签名),然后把对称秘钥附加在数字签名后
4. Alice使用Bob的公钥加密被对称加密的数据和附加的堆成加密秘钥,发送给Bob(实现了密钥交换)
5. Bob使用自己的私钥进行解密,拿到对称加密密钥
6. Bob使用对称加密密钥解密对称加密的数据,得到Alice使用Alice的私钥加密的数据特征码
7. Bob使用Alice的公钥解密Alice的数字签名(实现了身份认证)
8. Bob使用定向输出(MD5等128位)提取数据特征码与Alice的特征码比对,实现了数据保密性
中间人攻击:
1. Eve以Bob的身份与Alice进行通信,但是Eve并不知道Bob与Alice之间存在哪些交易
2. 于是Eve伪装成Alice与Bob进行通信,于是得到Bob公钥
3. 于是Bob与Alice每次信以为真的把信息交给Eve,Eve便浏览了通信的内容,进而转发给真正的接收方,整个过程都是经过中间层的转发
导致中间人攻击的环节是:Bob与Alice索要对方的公钥时并没有可靠的验证对方公钥的这一环节上,这就需要CA的出现了
数据加密
算法:RSA, DSA, ELGamal
DSS:Digital Signature Standard
DSA:Digital SignatureAlgorithm
单向加密:即提出数据指纹;只能加密,不能解密;
特性:定长输出、雪崩效应;
功能:完整性;
算法:
md5:Message Digest 5,128bits
sha1:Secure Hash Algorithm1, 160bits
sha224,sha256, sha384, sha512
密钥交换: IKE(Internet Key Exchange)
公钥加密
DH(Deffie-Hellman)
A:p, g
B:p, g
A:x--> p^x%g ==> B
A:(p^y%g)^x=p^yx%g
B: y--> p^y%g ==> A
B:(p^x%g)^y=p^xy%g
PKI:Public KeyInfrastructure
公钥基础设施:
签证机构:CA:CertificateAuthority证书颁发机构
说明:也称为电子商务认证中心、电子商务认证授权机构,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任
解释:CA是作为类似Bob与Alice等用户都可信的第三方认证机构,并且愿意把自己的公钥提送给CA,CA作为一个第三方认证机构(为了荣誉等)就会遵从器保密的原则,把申请人所发送的公钥经过CA自己专门的防伪认证技术加密后再发送给申请人,并且提供用户申请辨认的第三方机构(CA能确认申请人的详细信息)
证书:通常把CA经过防伪认证过的公钥称之为证书
证书的包含内容:X.509v3:定义了证书的结构以及认证协议标准
版本号
序列号
签名算法ID
发行者名称
有效期限
主体名称
主体公钥
发行者的惟一标识
主体的惟一标识
扩展
发行者的签名
CA的证书:
CA会根据自己的信息和公钥为自己颁发一个证书
如何判断CA的证书:
实地考察,当然也引起证书会用的昂贵
CA的信息链:
信息链关系CA的信任是可以传递的
CA的从属机构是固定的
证书加密:Bob与Alice之间如何使用CA认证解析过程:
1. CA首先得到Bob的相关有效信息,
2. CA定向输出(MD5等128位)获取申请人Bob所发送数据的特征码
3. CA使用自己的私钥加密特征码形成数字签名放在信息之后发送给Alice
4. Alice拿到CA的公钥(CA的证书会分发给所有信任他的用户)进行解密,判断是CA机构加密认证过的,也确保了Bob的身份信息
CA证书使用的处理过程:
1. Alice请求Bob的公钥,Bob就把自己的证书发送给Alice
2. Alice判断证书是否合法以及是否经过第三方认证机构认证后才能判断是不是Bob
注册机构:RA
证书吊销列表:CRL
用户或者机构的私钥丢失,应该立刻向CA吊销证书的
证书存取库:
SSL:Secure sockets Layer
Netscape:1994
V1.0,V2.0, V3.0
TLS:Transport Layer Security
IETF:1999
V1.0,V1.1, V1.2, V1.3
分层设计:
1、最底层:基础算法原语的实现,aes,rsa, md5
2、向上一层:各种算法的实现;
3、再向上一层:组合算法实现的半成品;
4、用各种组件拼装而成的各种成品密码学协议软件;
协议的开源实现:OpenSSL
回顾:
技术:加密和解密,服务
加密算法和协议:
对称加密:数据加密(保密性),(3DES,AES)
公钥加密:身份认证、密钥交换、数据加密(不常用,比对称加密要慢3个数量级),(RSA,DSA)
单向加密:数据完整性,(MD5, SHA1,...)
密钥交换:RSA,DH(迪菲-赫尔曼),ECDH(椭圆曲线DH),ECDHE(临时椭圆曲线DH)
SSL/TLS
SSL:安全套接字层(ssl1.0, ssl 2.0, ssl 3.0)
TLS:传输层安全 (tls 1.0, tls1.1, tls 1.2, tls 1.3)
OpenSSL
libcrypto
libssl
openssl
SSL会话主要三步:
客户端向服务器端索要并验正证书;
双方协商生成“会话密钥”;
双方采用“会话密钥”进行加密通信;
SSLHandshake Protocol:
第一阶段:ClientHello:
支持的协议版本,比如tls 1.2;
客户端生成一个随机数,稍后用户生成“会话密钥”
支持的加密算法,比如AES、3DES、RSA;
支持的压缩算法;
第二阶段:ServerHello
确认使用的加密通信协议版本,比如tls1.2;
服务器端生成一个随机数,稍后用于生成“会话密钥”
确认使用的加密方法;
服务器证书;
第三阶段:
验正服务器证书,在确认无误后取出其公钥;(发证机构、证书完整性、证书持有者、证书有效期、吊销列表)
发送以下信息给服务器端:
一个随机数;
编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
客户端握手结束通知;
第四阶段:
收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所有到的“会话密钥”;
向客户端发送如下信息:
编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
服务端握手结束通知
OpenSSL(2)
组件:
libcrypto,libssl主要由开发者使用;
openssl:多用途命令行工具;
openssl:
从多子命令,分为三类:
标准命令
消息摘要命令(dgst子命令)
加密命令(enc子命令)
标准命令: enc, ca, req,genrsa, ...
对称加密:
工具:openssl enc, gpg
支持的算法:3des, aes,blowfish, towfish
enc命令:
加密:~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
解密:~]# openssl enc -d -des3 -a -salt -out fstab -in fstab.ciphertext
单向加密:
工具:openssl dgst,md5sum, sha1sum, sha224sum, ...
dgst命令:
~]#openssl dgst -md5 /PATH/TO/SOMEFILE
生成用户密码:
工具:passwd,openssl passwd
openssl passwd -1 -salt SALT
生成随机数:
工具:openssl rand
~]#openssl rand -hex NUM
~]#openssl rand -base NUM
公钥加密:
加密解密:
算法:RSA,ELGamal
工具:openssl rsautl, gpg
数字签名:
算法:RSA, DSA, ELGamal
工具:
密钥交换:
算法:DH
生成密钥:
生成私钥: ~]# (umask077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
提取公钥~]# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
Linux系统上的随机数生成器:
/dev/random:仅从熵池返回随机数;随机数用尽,阻塞;
/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞;
伪随机数不安全;
熵池中随机数的来源:
硬盘IO中断时间间隔;
键盘IO中断时间间隔;
CA:
公共信任的CA,私有CA;
建立私有CA:
openssl
OpenCA
openssl命令:
配置文件:/etc/pki/tls/openssl.cnf
构建私有CA:
在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录及文件即可;
步骤:
(1) 生成私钥;
~]#(umask077;openssl genrsa -out /etc/pki/CA/private/cakey.pem4096) cakey.pem是配置文件中定义的
(2)生成自签证书;
~]#opensslreq -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem-days 3655
-new:生成新证书签署请求;
-x509:生成自签格式证书,专用于创建私有CA时;
-key:生成请求时用到的私有文件路径;
-out:生成的请求文件路径;如果自签操作将直接生成签署过的证书;
-days:证书的有效时长,单位是day;
(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
~]#cd /etc/httpd/ssl
~]#(umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
(2)生成证书签署请求
~]#openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
(3)将请求通过可靠方式发送给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
吊销证书:
步骤:
(1)客户端获取要吊销的证书的serial(在使用证书的主机执行):
~]#openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
(2)CA主机吊销证书
先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致;
吊销:
#openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
其中的SERIAL要换成证书真正的序列号;
(3)生成吊销证书的吊销编号(第一次吊销证书时执行)
#echo 01 > /etc/pki/CA/crlnumber
(4)更新证书吊销列表
#openssl ca -gencrl -out thisca.crl
查看crl文件:
#openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text
第二部分:创建私有CA证书步骤[补充201605021436]
创建CA实验的环境介绍:
CA主机为:192.168.1.106
httpd服务主机为:192.168.1.103
步骤的详细演示:
①在CA主机上生成私钥:注意文件存放的目录一致性,这里不再追溯
[root@localserver ~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096) Generating RSA private key, 4096 bit long modulus ................................................................................................++ ....................++ e is 65537 (0x10001)
②生成CA自签证书;
[root@localserver ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:BJ Locality Name (eg, city) [Default City]:BJ Organization Name (eg, company) [Default Company Ltd]:UN Organizational Unit Name (eg, section) []:UN Common Name (eg, your name or your server's hostname) []:server Email Address []:[email protected]
③注意当不存在时需要创建签发证书、吊销证书、新证书目录
[root@localserver CA]# ls cacert.pem certs crl newcerts private
④创建证书序列号文件以及证书索引文件
[root@localserver CA]# touch serial [root@localserver CA]# touch index.txt [root@localserver CA]# echo 01 > /etc/pki/CA/serial
⑤服务器申请证书签署实现ssl安全通信
在httpd主机上192.168.1.103上生成私钥
[root@server ~]# mkdir /etc/httpd/ssl [root@server ~]# cd /etc/httpd/ssl [root@server ssl]# ls [root@server ssl]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048) Generating RSA private key, 2048 bit long modulus ..........+++ ......................................................................................................................................................................................+++ e is 65537 (0x10001) [root@server ssl]# ll 总用量 4 -rw------- 1 root root 1679 5月 2 14:27 httpd.key
⑥生成证书签署请求(保证和CA主机信息一致)
[root@server ssl]# openssl req -new -key /etc/httpd/ssl/httpd.key -out ./httpd.csr -days 365 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:BJ Locality Name (eg, city) [Default City]:BJ Organization Name (eg, company) [Default Company Ltd]:UN Organizational Unit Name (eg, section) []:UN Common Name (eg, your name or your server's hostname) []:server Email Address []:[email protected] Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:nihao An optional company name []:name
⑦把请求通过可靠方式发送给CA主机
[root@server ssl]# scp /etc/httpd/ssl/httpd.csr [email protected]:/tmp/ The authenticity of host '192.168.1.106 (192.168.1.106)' can't be established. RSA key fingerprint is 50:c1:39:d7:c1:5d:ee:5e:af:cd:b3:24:9f:5d:28:d1. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.1.106' (RSA) to the list of known hosts. Address 192.168.1.106 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT! [email protected]'s password: httpd.csr 100% 1070 1.0KB/s 00:00
⑧在CA主机(192.168.1.106)上签署证书
[root@localserver tmp]# openssl ca -in httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365Using configuration from /etc/pki/tls/openssl.cnf Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: May 2 18:30:43 2016 GMT Not After : May 2 18:30:43 2017 GMT Subject: countryName = CN stateOrProvinceName = BJ organizationName = UN organizationalUnitName = UN commonName = server emailAddress = [email protected] X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: FC:51:0B:64:E0:B1:B3:2A:9C:E3:9C:15:0B:0A:13:8B:7D:3B:95:E5 X509v3 Authority Key Identifier: keyid:ED:12:C3:2E:4D:5C:7D:EF:31:75:E5:E7:DF:36:36:9B:B9:C3:01:BC Certificate is to be certified until May 2 18:30:43 2017 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
⑨查看签署的证书信息1
[root@localserver tmp]# cat /etc/pki/CA/index.txt V 170502183043Z 01 unknown /C=CN/ST=BJ/O=UN/OU=UN/CN=server/ [email protected]
查看签署的证书信息2
[root@localserver tmp]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject serial=01 subject= /C=CN/ST=BJ/O=UN/OU=UN/CN=server/[email protected]
⑩将签署的证书发送给服务器
[root@localserver tmp]# scp /etc/pki/CA/certs/httpd.crt [email protected]:/etc/httpd/ssl The authenticity of host '192.168.1.103 (192.168.1.103)' can't be established. RSA key fingerprint is f9:a8:75:68:e2:c2:e5:ab:3b:be:56:70:a1:b2:48:6b. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.1.103' (RSA) to the list of known hosts. Address 192.168.1.103 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT! [email protected]'s password: httpd.crt
11.一般情况下都不会存放证书文件,你可以通过U盘拷贝或者删除