SSL是netscape(网景公司,全称Netscape Communications Corporation)的常用简称。它是发明浏览器和web服务器之后,用于实现在浏览器和web服务器之间安全交互的一种机制。
http是C/S架构的明文的,C=Client或客户端的浏览器,S=Server服务器应用程序,Client中的程序和Server中的程序通过80端口彼此进行交互,而http是文本协议,它所传输的所有内容都会编码成8位一个字节的文本编码的方式在网络上进行传输,但传输过程是明文的。但http并不加密,所以如果在电商网站购物了,提醒你输入账号,密码。怎么办,岂不是很容易就被人攻破。
而七层模型中,可以进行加密的是应用层,互联网上应用最多就是TCP/IP这样的模型。在传输层,不管是TCP还是UDP都是明文的,IP报文也是明文的,若应用层自己也是明文的,整个网络协议都是明文的了,无法加密了。若想安全传输,后来netscape在应用层和传输层之间增加了半个层,这个层正好是传输层之上,基于套接字通信时专用的,假如在服务器和客户端之间进行通信应用层经过了这个半个层。那么它的通信就是加密的。除非它选择不在那半个层进行通信,这时候的数据就是明文的。这里就说加密的。
SSL:全称:安全的套接字层。Secure Socket layer。位于应用层和传输层的那半个层。SSL是一种协议,常见的两个版本:sslv1和sslv2,sslv3通常都使用sslv3了。SSL协议公开了,就可以被任意公和任意组织任意使用。SSL,由
TLS:Transport layer Security
tlsv1
大多数应用都使用sslv3 or tlsv1,只有应用程序在实现了应用层协议,开发时调用ssl上它应该实现的功能时,才算说名这个协议是该支持ssl功能的。ssl可能会被多种协议都支持到,http是明文的,它可能用到ssl协议,ftp是明文的,如果它想加密,也会用到ssl协议。 既然ssl是种公共功能,ssl其实被实现成为公共的共享库。当开发一种web服务器时,开发时调用了ssl的共享库,我们就理解该新的web服务支持ssl功能。要想支持ssl,必须调用这个ssl这个库才可以。
像apache这样的web服务器就支持ssl功能,nginx也支持ssl功能,它们既可以用ssl功能,也可以不用ssl功能。
就以http为例,http如果支持使用ssl,http就不再是http,而是https。http和https可不是一种协议,http监听在80端口,而https则监听在443端口上。基于http传输的web数据和https传输的数据格式都不相同,编码也不同。
以http为例,客户端和服务器端是如何交换?
如果实现ssl数据安全通信,意味数据传输要加密了,要加密意味着要交换密钥啦。但是我客户端要发请求去你的网站怎么获取你的密钥呢?
1、当客户端和服务器端通信时,首先发起请求的肯定是客户端,例如在浏览器中键入地址,https://www.mageedu.com/index.php。由于基于tcp/ip协议,服务器和客户端得三次握手,而后数据才能传输,三次握手后,发现通信要基于ssl才能实现。客户端开始要服务器端的证书,让服务器端发证书过来。而服务器的证书一定是互联网上某个比较可靠的CA颁发的,客户端拿到证书时,就开始:
1、验证证书合法性,用CA的公钥去解密CA的签名,
2、验证证书的数据完整性,把解密出来的数据和重新计算证书的特征码进行比对,如果一样,证书ok
3、验证证书中主机名字和请求的主机名称是否一致,是的话,的确是你的证书。
4、以上验证没问题就取得请求主机的公钥信息,而后客户端会临时生成一次性加密密码,一串对称的密码用对方的公钥加密后发送服务器。
5、服务器拿到密码开始加密网页,再次发给客户端。
6、客户端解密网页,看到网页数据。
而客户端向服务器索要证书,并生成一段密码加密通信返回给对方的过程叫ssl会话建立的过程。
要向能够证书加密,必须基于ssl建立ssl会话,说明web服务器基于ssl库里的功能,加密算法有多种,
要选择一个双方都支持的算法才可以,所以会话的建立还包括协商双方都支持的算法的过程,当然ssl协议的选择。
一旦建立完成,数据就能传输,ssl是把数据分成多个块,加密每个块,单独发送的,编码机制改变了。
为什么服务器端没有要客户端的证书呢??
其实要买证书的费用是十分高昂的,个人是完全没有必要去购买证书的。ssl只是服务器端向客户端传输它自己的证书的。而客户端无需传送给服务器。
但有些情况下,比如公司内部通信,就必须要求客户端有自己的证书,服务器才有必要跟你建立传输。
双方会进行证书验证的。
Linux下通用性的公共的数据加密解密工具
1、gpg(pgp)
gpg:工具
pgp:协议
gpg:通常rpm包进行加密
2、openssl
openssl可以实现对称加密、非对称加密、单向加密,都能实现。
openssl
三部分组成
是系统安装时默认安装上去的。用rpm -ql openssl查看openssl生成的文件
1part1、openssl多用途命令工具
2part2、主要功能是被其他工具调用实现的库libcrypto,很多加密解密的功能依靠这个库就ok啦
实现了很多加密算法
3part3、ssl协议的实现。libssl
命令
openssl version
查看openssl版本号
命令工具
直接运行openssl,启动交互式接口
如
[root@localhost Packages]# openssl
OpenSSL>
在交互接口下,输入个错误选项,弹出:
OpenSSL> ljkdksjal
openssl:Error: 'ljkdksjal' is an invalid command.
Standard commands
asn1parse ca ciphers cms
crl crl2pkcs7 dgst dh
dhparam dsa dsaparam ec
ecparam enc engine errstr
gendh gendsa genpkey genrsa
....
Message Digest commands (see the `dgst' command for more details)
md2 md4 md5 rmd160
sha sha1
Cipher commands (see the `enc' command for more details)
aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb
aes-256-cbc aes-256-ecb base64 bf
....
而且openssl有很多很多子命令的。
子命令大致分三大类
1、标准命令
2、实现单向加密的命令
openssl 直接在bash下键入就进入交互式界面
openssl
openssl创建CA的,各种功能
[root@localhost ~]# openssl
OpenSSL> help
openssl:Error: 'help' is an invalid command.
Standard commands
asn1parse ca ciphers cms
crl crl2pkcs7 dgst dh
dhparam dsa dsaparam ec
ecparam enc engine errstr
gendh gendsa genpkey genrsa
nseq ocsp passwd pkcs12
pkcs7 pkcs8 pkey pkeyparam
pkeyutl prime rand req
rsa rsautl s_client s_server
s_time sess_id smime speed
spkac ts verify version
x509
另外指定某种加密方式
1、req:生成证书颁发申请
2、dsa:公钥加密算法
3、rsa:rsa算法
4、enc 数据加密
5 passwd 模拟passwd帮你生成密码
6、crl 证书吊销
7、speed 测试某种加密算法的实现速度
8
1、对称加密:使用openssl
openssl enc
算法:des des3 aes-128 aes-192....idea....RC6 CAST5
举例:先使用whatis enc 然后man enc -加密算法的名称
默认就-salt 加盐了
#openssl enc -e(加密) -des3 -a -salt -in (想要加密的文件)-out (加密后放哪)
[root@localhost ~]# openssl enc -des3 -a -salt -in /tmp/1.txt -out /tmp/100.txt
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
Verify failure
bad password read
[root@localhost ~]# openssl enc -des3 -a -salt -in /tmp/1.txt -out /tmp/100.txt
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
[root@localhost ~]# cat /tmp/100.txt
U2FsdGVkX18hsis6ztPMvrioM1Byyi2AR3VRkFA6Wb1TkmfOubNnwC1jNIrghS6n
n7376ibEIX2fnhDz44P1RK+wcmEk7SYoJxhqEM01fJMKUjkS566lWTVoajrRNwNS
EqLn4knQemWwyWv5uJlYuq9NasgijtyPdNFCVnIsUiGmW7BhmFb+WFiAmCIlKN/J
6AKmkaVPqG27719W66pq7y+MhsHGEb6X6Y1h7UiIoJ3uqQzMyHpg+Xdev2KLU2fV
解密对称加密的文件:
openssl enc -d -des3(指明与加密时的相同算法) -a -salt -in 加密后的文件 -out 输出的文件
openssl如何单向加密
特性:单向 onewway
检测数据完整性
算法
md5
sha1
sha256
sha384
sha512
命令:md5sum, sha1sum,openssl dgst chsum
openssl dgst [-md5|-sha1] -out 把特征码输出哪个文件 (不写-out 意味输出到屏幕) 对哪个文件进行单向加密
加密命令不同,但提取特征码是相同的
[root@localhost ~]# openssl dgst -md5 /tmp/1.txt
MD5(/tmp/1.txt)= 20608a9db624359cf6a7567caaf097d7
[root@localhost ~]# md5sum /tmp/1.txt
20608a9db624359cf6a7567caaf097d7 /tmp/1.txt
MAC 消息摘要码
单向加密的一种延伸类的应用
应用: 用于实现在网络通信包括传输数据的完整性
仅利用单向加密算法 MAC机制
机制:CBC-MAC
HMAC :使用MD5 sha1算法
传输消息安全。
用户密码:
提醒用户输出时,把用户输入键盘的“看不见”的信息进行单向加密,提取特征
openssl还支持passwd
用whatis passwd取得openssl passwd的信息
[root@localhost ~]# whatis passwd
passwd (1) - update user's authentication tokens
passwd (5) - password file
passwd [sslpasswd] (1ssl) - compute password hashes
[root@localhost ~]# man sslpasswd
屏幕上会生成一堆..
#openssl passwd 默认隐含stdin(从标准输入读取密码)
[root@localhost ~]# openssl passwd -1 -salt 23223567
Password:
$1$23223567$lZjQH2yflOA/y48E5kGrG1
openssl还支持生成随机数的密码
[root@localhost ~]# whatis rand
rand (3p) - pseudo-random number generator
rand (3) - pseudo-random number generator
rand [sslrand] (1ssl) - generate pseudo-random bytes
rand [sslrand] (3ssl) - pseudo-random number generator
[root@localhost ~]# man sslrand
[root@localhost ~]# openssl rand -hex 4
08a4f846
[root@localhost ~]# openssl rand -base64 4
1GsTyw==
其实可以把上述随机数生成的密码串当做salt
openssl的非对称加密;
算法:RSA
Eigamal
命令:
gpg openssl rsautl
先生成一堆密钥
数字签名:
算法:RSA Eigamal DSA(只能签名,不能进行加密)
DSA:Digital Signature
DSS:Digital Signature Standard
密钥交换:
算法:公钥加密机制,
用对方的公钥加密一段密钥(密码),送给对方,对方能用自己的私钥解开,获得密码的过程。
DH
生成密钥:
IKI
DH
生成密钥:
openssl gendsa 生成dsa
很多时候,生成密钥对儿时很有必要的
命令:openssl genrsa
查看genrsa
GENRSA(1)
NAME
genrsa - generate an RSA private key
因为通常情况下,公钥信息都是由私钥提取出来的。
openssl genrsa -out(直接保存在文件)
(umask 077;openssl genrsa -out /root/key3 2048)
Generating RSA private key, 2048 bit long modulus
...............+++
........+++
e is 65537 (0x10001)
[root@localhost ~]# cat /root/key3
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAyRPxiN5XWzDieymVSa+m33ZWfrrHnFXuEXIPjMJfnzSll4Wi
ccB3Qc+OyfiWiPIkjJU6rUSmBJs+jcka4oPuVJJcg+e0Dv3kBTRgJabwfRFEaU1P
mT9bl80Z/TKNS+rqVOxHsacGHuLLgUAcNdeO61hk8OIq2lKFEyP6kdWTnPKpwCJk
U7v+M4y3MQE7y95gHW9/9BV6J6wtYHf+ozOlnbe37x/sH8bonZFYb9OM+lTGT0DF
nOf2O6kx+ZhKu4Yy44KR+Xn2nQqEnyyw/bi2JjhdKHUz5iupiRstMoAiYMf9aOIM
pHZJ5mP2oJ5EnNgY3mJz0v3Q2/zk/i58agHqvwIDAQABAoIBAQCl8cWWFRi284MV
hnLiNP3bM2vLGHUPi5ORNZTFb2uR5ceU9W6Rd1+6X02xpNw9G0Erh0QUaP+nHUag
hUjutYcozL8jJowDhoYVUHq/U8VP0/SGKs/qK8Cn93SCukmHv9LX4IrZC2Mc4J8k
SOnzN9KybU/knF4j2NM2R90CgYEArFIMLSNML+gQW418hHaIRI6S5E6v5jdB5r+k
G8rz1ITNN1L4eHrkB/FBbFysCCy3WwRAER8e5Hck7zesFnufUm656uF3KHSFIjYI
Uoo2kK3SkPoS07Fvo5jnwsX2JD4vC3rrawZpuQDGkcCSSbv3JB6QSccRVVFuWVAu
TRvzxwECgYBvwgU4cExqela3z3ruDc+0rsoe7Xrp+QW6Rj64NGGb26BW94TdPGsA
oIuAhmIdL+vbppudcuhd59bKrkFpHxivtd9PjqYruNAopDzOjJ1Q71O68EDy3Ycf
RFr9bMktsY53GNnMok3UA95NiPROUfgRLXUdCo9mPL06cSw+89fJJQ==
-----END RSA PRIVATE KEY-----】
从私钥中生成生钥
openssl rsa -in 私钥文件的位置(最好是绝对路径)
[root@localhost ~]# openssl rsa -in key3 -pubout -text
Private-Key: (2048 bit)
modulus:
00:c9:13:f1:88:de:57:5b:30:e2:7b:29:95:49:af:
a6:df:76:56:7e:ba:c7:9c:55:ee:11:72:0f:8c:c2:
5f:9f:34:a5:97:85:a2:71:c0:77:41:cf:8e:c9:f8:
.....
期望对方能解密,就用对方的公钥加密
为了保密性。就用对方的公钥加密
为了保证身份验证就用自己的私钥加密
如何在openssl搭建一个私有CA?
[root@localhost ~]# rpm -ql openssl
/etc/pki/CA
有一个CA的目录,openssl的主配置文件是/etc/pki/tls/openssl.cnf
既然建立私有CA,那我们就自己给自己发个证吧!
1、给自身生成一对密钥
2、自己给自己发个证书。
对于客户端节点来说:1、生成密钥对儿 2、生成证书签署请求(电子文档)3、把请求发给CA(RA证书注册)
CA回应证书:1、验证请求者的信息 2、ok的话签署证书 3、把签好的证书再发给请求者
1、建立CA服务器
1、生成密钥(当前主机上)/etc/pki/CA/private CA自己的私钥
命令[root@localhost private]# (umask 077; openssl genrsa -out ./cakey.pem)
[root@localhost private]# ll
total 4
-rw------- 1 root root 887 Aug 3 08:48 cakey.pem 而且权限是700!
2、自己签署自己的证书,#openssl req 生成证书签署请求
-key(指明你的私钥文件时什么,它会自动从私钥文件提取公钥信息) -out(提取出公钥,证书存放放到什么地方)-x509(生成子签署证书,只有自己的做CA时,才有必须加上这个选项)-days 指明
指明证书有效天数,-news 新请求
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
成功的话,就让你输入信息啦
Common Name (eg, your name or your server's hostname)这项特别关键,当你在互联网的环境下,该名字必须为你的主机名,必须为hostname!
生成的证书在/etc/pki/CA下,叫cacert.pem CA的公钥就在CA的自签署文件里
此外CA还要生成一个索引文件和serial,序列号 /etc/pki/CA下
3、客户端节点申请证书,1、生成请求,2、CA签署证书
1、生成请求 以httpd为例,先到/etc/httpd 下建立一个ssl目录,里面要保存它的证书等信息。
但是第一步先生成客户端的密钥对儿
[root@localhost ssl]# (umask 077; openssl genrsa -out /etc/httpd/ssl/http.key 2048)
Generating RSA private key, 2048 bit long modulus
2、生成签署请求(其实这里我们可以编辑openssl配置文件,反正签署的时候一定要保持一致,所以直接编辑默认配置再发给他们就ok啦)
3、发送证书给CA
命令 openssl ca
证书文件的后缀都叫.crt
签署过程:
openssl ca -in /etc/httpd/ssl/http.csr -out /etc/httpd/ssl/http.crt -days 200
Using configuration from /etc/pki/tls/openssl.cnf 回答y 签署成功。再次把请求发给请求者。