ssl协议及开源实现openssl
ssl协议
SSL: (Secure Socket Layer)安全套接层,ssl是⼀套安全协议,被应⽤层调⽤,当http调⽤ssl协议时被称为https,当ftp调⽤ssl协议时被称为sftp。
lls是⼀个协议的集合 ,其中包括:
Handshake协议:包括协商安全参数和密码套件、服务器⾝份认证(客户端⾝份认证可选)、密钥交换
ChangeCipherSpec 协议:⼀条消息表明握⼿协议已经完成
Alert 协议:对握⼿协议中⼀些异常的错误提醒,分为fatal和warning两个级别, fatal类型错误会直接中断SSL链接,⽽warning级别的错误SSL链接仍可继续,只是会给出错误警告
Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等
HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。 HTTP over SSL”或“HTTP over TLS”,对http协议的⽂本数据进⾏加密处理后,成为⼆进制形式传输
ssl起源
Netscape:1994
v1.0,
1995:sslv2.0
1996:v3.0
IETF:1999
tlsv1.0
2006:tls v1.1 RFC4346
2008: tls v1.2
2015: tls v1.3
分层设计
1. 最底层:基础算法原语的实现,aes,rsa,md5
2. 向上⼀层,各种算法的实现;
3. 再向上⼀层:组合算⽅法实现的半成品;
4. ⽤各种组件拼装⽽成的各种成品密码学协议软件;
通信流程
ssl通信的两个阶段:
两阶段协议,分为握⼿阶段和应⽤阶段
握⼿阶段(协商阶段):客户端和服务器端认证对⽅⾝份(依赖于PKI体系,利⽤数字证书进⾏⾝份认证),并协商通信中使⽤的安全参数、密码套件以及主密钥。 后续通信使⽤的所有密钥都是通过MasterSecret⽣成。
应⽤阶段:在握⼿阶段完成后进⼊,在应⽤阶段通信双⽅使⽤握⼿阶段协商好的密钥进⾏安全通信
https的通信流程:
客户端向服务端发起请求,服务端将⾃⼰的证书发送给客户端,
客户端个使⽤内置于系统中的ca的公钥进⾏解密,解密成功即表⽰ca是合法的。
如果有需要客户端将⾃⼰的证书发送给服务端
客户端⽣成⼀个⾃⼰的对称密钥,使⽤服务端的公钥进⾏加密。发送给服务端。
服务端使⽤⾃⼰的私钥解密收到的加密过的对称密钥,
双⽅使⽤对称密钥进⾏通信,(http协议调⽤ssl协议对⾃⾝的数据进⾏密钥加密,被加密的http数据为⼆进制)
ssl协议的开源实现:OpenSSL
ssl作为协议出现,协议是被具体定义的概念,openssl时ssl的具体的实现,openssl也是⼀套开源的软件。
openssl包括三⽅⾯的组件:
openssl: 多⽤途的命令⾏⼯具,包openssl
libcrypto: 加密算法库,包openssl-libs
libssl:加密算法实现模块库,包nss
openssl⼯具使⽤
openssl ⽀持交互式模式, 指定参数。
交互式:
:帮助
OpenSSL> ?
openssl:Error: '?' 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
Message Digest commands (see the `dgst' command for more details)
man dgst 查看此类命令的帮助
md2 md4 md5 rmd160
sha sha1
Cipher commands (see the `enc' command for more details)
man enc 查看此类命令的帮助
aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb
aes-256-cbc aes-256-ecb base64 bf
bf-cbc bf-cfb bf-ecb bf-ofb
camellia-128-cbc camellia-128-ecb camellia-192-cbc camellia-192-ecb
camellia-256-cbc camellia-256-ecb cast cast-cbc
cast5-cbc cast5-cfb cast5-ecb cast5-ofb
des des-cbc des-cfb des-ecb
des-ede des-ede-cbc des-ede-cfb des-ede-ofb
des-ede3 des-ede3-cbc des-ede3-cfb des-ede3-ofb
des-ofb des3 desx idea
idea-cbc idea-cfb idea-ecb idea-ofb
rc2 rc2-40-cbc rc2-64-cbc rc2-cbc
rc2-cfb rc2-ecb rc2-ofb rc4
rc4-40 seed seed-cbc seed-cfb
seed-ecb seed-ofb zlib
⾮交互⽅式:
enc :(encrypt)加密或解密,⽤于对称加密
-e :加密
-d :解密
-des3 :指定加密算法为des3
-
a
-salt :加盐
-in :输⼊的⽂件
-out :输出的⽂件
例:
加密
# openssl enc -e -des3 -a -salt -in /etc/passwd -out ./haha.ssl
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
# ll /etc/passwd ./haha.ssl
-rw-r--r--. 1 root root 33297⽉1418:21 /etc/passwd
-
rw-r--r-- 1 root root 45427⽉1617:02 ./haha.ssl
解密:
# openssl enc -d -des3 -a -salt -in ./haha.ssl -out ./
enter des-ede3-cbc decryption password:
dgst ⽤于单向加密,即⽣成哈希值
-md5 :指明算法
例:
# openssl dgst -
)= 7d75659008a5a2f28cac1d2582d28491
passwd ⽣成密码的哈希值:
-1(数字1):md5算法
-
salt 指定加的盐
例
[root@localhost ~]# openssl passwd -1
Password:
ssl协议全称Verifying - Password:
$1$2otXR/.E$e2e0kTulm8LiSAKEgjKeD/
指定加盐,但是加盐之后只输⼊了⼀次密码
# openssl passwd -1 -salt asd
Password:
$1$asd$49QSDotWo6cyq5JpfBDQ4.
rand: ⽣成随机数
格式 openssl rand 编码⽅式 字节数。
-base64 使⽤base64 编码格式
-hex 使⽤hex 编码格式
# openssl rand -hex 2
380d
`# openssl rand -base64 2
UR8=
genrsa ⽣成私钥(仅⽣成私钥,公钥是从私钥中提取出来的)
-out ⽣成的密钥⽂件
-des 使⽤对称密钥对⽣成的⾮对称秘钥⽂件加密(可选参数)
格式 openssl genrsa -out ⽂件 -des ⾮对称秘钥密钥长度(多少位)
⽣成⾮对称密钥
openssl genrsa -out /root/haha.key
Generating RSA private key, 1024 bit long modulus
..................................++++++
..................++++++
e is65537 (0x10001)
指定使⽤对称密钥对⽣成的密钥⽂件加密加密
# openssl genrsa -out /root/haha-des.key -des 1024
Generating RSA private key, 1024 bit long modulus
......++++++
.++++++
e is65537 (0x10001)
Enter pass phrase for /root/haha-des.key:
Verifying - Enter pass phrase for /root/haha-des.key:
使⽤umask 决定⽂件权限
# (umask 066 ; openssl genrsa -out jinbus.key -des 2048)
Generating RSA private key, 2048 bit long modulus
.................................+++
...................+++
e is65537 (0x10001)
Enter pass phrase for jinbus.key:
Verifying - Enter pass phrase for jinbus.key:
[root@localhost ~]# ll jinbus.key
-rw------- 1 root root 17387⽉1617:39 jinbus.key
rsa 显⽰密钥
-in 获取公钥的私钥⽂件
-pubout从私钥中获取公钥
-out 保存获取的公钥的⽂件
例:
查看⽂件中的私钥
# openssl rsa -in jinbus.key
Enter pass phrase for jinbus.key:
writing RSA key
-
----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA3WuQa0EZ91BC2M9an99TqX5FJlBCqDSXuM/DS6RDzPuY6CwQ
l7nC11sMGxqC3ilXcfIKuCiKAX6uuAXI3Kskno5o8ftjyS1caiOdboTuUpqVaWFw
iGCygbNWKKrgV01b3FN/InrX46SGB4KlJ/soCl+kNa3MF4PiVowGKaVzepJJD8X6
hElaVIumQPKjSx7ZKiI/e89HnwxAGUTxtr6Oq3EcCSuXPKhz+FaAw9GsW0wKevyw
sUkGsEAWA2DZRyw3n5+rsVJn+BbIoURIW2cPiXhSnSl2xP57ThtogPtro2iv3O3C
7+9xczsahG3GbN+NwK4FGT+JZH5AJj18rk+6ywIDAQABAoIBADhUojQ3JsT9fVQt
RJABwAYR4sPBjYO/hY32BWhcDQe8RoVimIIRN1mUhzrp/rtIZz/M5R8+6QVCVm7o
wdYqEDHqZxaQ7y0CRk2Wa/nvBbasLzDVIkz/1MocduH3vwVW3/TopSJ/gCcg9xw4
B45pXiFtfZhOc+rTmaSNERBNUFixH0ryxFBqkuPb1bUaWumnOhMSIwgpkiCzy3on
v8/BuLHP3ySFb+94QvOsqInV2uYqXfLw7Tks2ETxmapvssWHzigrnvl5JyFb/UMH
rw5y4DCT+Ha9Brp22KuzBJx04UeCfAjVAlAiLUnjJH/IupNmCQhIsxW72IM+DdnJ
GkM4K3kCgYEA/uOVvFpwegQ/LAVKpNyOs+KYz17Oj/VXcrxjiCjFm213bH/Mnb+k
jhP/HNov2AGQTvNk+FwzjGIX+fMosNcb7+VegKA/opxWSJbw4tdaJK0SZmTFWJ33
JyXdKrsW8nA7cxKKaAwrKdnHBo9RXR3VomxsgmjvVVyt04FPJp1zLy8CgYEA3mKi
Jr7cbwYkcMKuBx9JkROTO3mAnPkicYuxH71FPPMB8mnPLQDEK/gne2Wcad57Olmv
hDgAhyEYHdgIay3FU3Fy0kWozXUha+U3MIq7BhuMH43AsjxgoGHbUzM8v6OKyDOY
HBbH9UzUW6WuLaP39q+xrq/mWQxN4cDA4xqyZyUCgYBWsewVM6G8LsOZ4nbgGlDD aJhXOEUD/Avxb5hfEJcd5Z7QHavoH+4FkVGda60ISIfgArNeMmYqIpdLIeS+OXw8
HYUGNPtQAOLsL8LhNSRpAyEWCMKDAL+25g8S4K3OalQeMLk46KKpynQCjC69gE9Q vpYtySlWnH5XSU01sioiawKBgQCENJzzbcn8Uul9A6+T2lzQ25NO6zezmkSIviQp
m0q7JjiFFbQtq+Pzw84tBMZNBg+6K7E1aFmf++Orck/m78n8hlhdez4UDss0qor5
16/BvMS7yXjCPTSwhBxwROibgS0zQcDvCfgL84XXihKXXYA/bkmycS3+yFrQl9fT
634d5QKBgBbPFkeAaGjzmLgIAfG1l/SIwjJhvH2n+xUt2YtV0VR9A07HKR/dda/9
L8vOlfegi3bODf+gwABOecbfKayzv6P+yQX6gBLaNvCXr1eE2Ob76Iwi2wb7UplL
3AU54zZlDFvH8YRl5fUVZGeJjyvGatViwuVDLvYCEz5tGos4rTyo
-----END RSA PRIVATE KEY-----
req 请求
-new: ⽣成新证书签署请求
-x509: 专⽤于CA⽣成⾃签证书
-key: ⽣成请求时⽤到的私钥⽂件
-days n:证书的有效期限
-out /PATH/TO/SOMECERTFILE: 证书的保存路径
x509 查看证书中的信息
格式:openssl x509 -in ⽂件名称 -noout
-text|issuer|subject|serial|dates
openssl x509 -in 证书 -noout -text:查看证书
ca ⽣成ca证书
-days 证书有效期
-in 证书的申请⽂件
-out ⽣成的证书
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论