Openssl原理与实战

SSL

SSL(Secure Sockets Layer,安全套接字层)是一种安全的加解密协议,它的实现也是需要程序(算法)来实现。ssl是一种公共功能,但ssl本身只是一种规范和协议,需要程序员开发出一种遵循SSL协议规范的程序来实现。

分层设计:
1、最底层:基础算法原语的实现,aes, rsa, md5
2、向上一层:各种算法的实现;
3、再向上一层:组合算法实现的半成品;
4、用各种组件拼装而成的各种成品密码学协议软件;

SSL/TLS

SSL: 安全套接字层(ssl 1.0, ssl 2.0, ssl 3.0)
TLS:传输层安全 (tls 1.0, tls 1.1, tls 1.2, tls 1.3)

SSL会话主要三步:

①客户端向服务器端索要并验正证书;
②双方协商生成“会话密钥”;
③双方采用“会话密钥”进行加密通信;

SSL Handshake Protocol:

第一阶段:ClientHello
支持的协议版本,比如tls 1.2;
客户端生成一个随机数,稍后用户生成“会话密钥”
支持的加密算法,比如AES、3DES、RSA;
支持的压缩算法;

第二阶段:ServerHello
确认使用的加密通信协议版本,比如tls 1.2;
服务器端生成一个随机数,稍后用于生成“会话密钥”
确认使用的加密方法;
服务器证书;

第三阶段
验正服务器证书,在确认无误后取出其公钥;(发证机构、证书完整性、证书持有者、证书有效期、吊销列表)
发送以下信息给服务器端:
编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
客户端握手结束通知;

第四阶段
收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所有到的“会话密钥”;
向客户端发送如下信息:
编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
服务端握手结束通知;

SSL应用(参考示例)

以https通信过程为例描述SSL的实现过程:

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL。

以https为例,进一步说明如何依靠CA来可靠的获得通信对方的公钥,如图:


https的主要实现过程说明:

(1)在通信之前,服务器端通过加密算法生成一对密钥,并把其公钥发给CA申请数字证书,CA审核后,结合服务端发来的相关信息生成数字证书,并把该数字证书发回给服务器端。
(2)客户端和服务器端经tcp三次握手,建立初步连接。
(3)客户端发送http报文请求并协商使用哪种加密算法。
(4)服务端响应报文并把自身的数字签名发给服务端。
(5)客服端下载CA的公钥,验证其数字证书的拥有者是否是服务器端(这个过程可以得到服务器端的公钥)。(一般是客户端验证服务端的身份,服务端不用验证客户端的身份。)
(6)如果验证通过,客户端生成一个随机对称密钥,用该密钥加密要发送的URL链接申请,再用服务器端的公钥加密该密钥,把加密的密钥和加密的URL链接一起发送到服务器。
(7)服务器端使用自身的私钥解密,获得一个对称密钥,再用该对称密钥解密经加密的URL链接,获得URL链接申请。
(8)服务器端根据获得的URL链接取得该链接的网页,并用客户端发来的对称密钥把该网页加密后发给客户端。
(9)客户端收到加密的网页,用自身的对称密钥解密,就能获得网页的内容了。
(10)TCP四次挥手,通信结束。

OpenSSL

组件:

libcrypto, libssl主要由开发者使用
openssl:多用途命令行工具

openssl:

从多子命令,分为三类:

  • 标准命令
  • 消息摘要命令(dgst子命令)
  • 加密命令(enc子命令)
[root@promote ~]# openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017
[root@promote ~]# 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)
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                
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            rc5               rc5-cbc           rc5-cfb           
rc5-ecb           rc5-ofb           seed              seed-cbc          
seed-cfb          seed-ecb          seed-ofb          zlib   
对称加密:

工具:openssl enc, gpg
支持的算法:3des, aes, blowfish, towfish

enc命令:
加密:openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext

[root@promote ~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
[root@promote ~]# cat fstab.ciphertext
U2FsdGVkX19XpMD+Z0r8qS41Ov8IqY7LHDtswe7qy7amEb6sxIzXr/K6HW0w2qWq
rzNUUZGemEjdiYikaLQePfxVgreuqcOAVmrn+VNDt+gYdTw+cCK3v9jSLBxuJOXc
Hb2deMJdk+j0umCRnS+Db/cy5M1Kj4eXckRu4Yjft0oZkoRG8u5CIj81rL4qwMXB
2AAOsDl8ZPakVDh7TyYvqWndpH2gFTdYcw1NyOOFqCgUV5bE11LSOSA0U69CCFqa
ijSHky/uujwP2M08pFQAogUN6KfLjvqq5frFhR6nWHT1k7UHwYnWSNPTTDLw0nQf
Vo/QiyTqVZ+tdBqdd08lKcavDImGOrGkhyqDi9f4UaAzXkL22YW1WUhFZ8mstsjd
PbEp6vkzgKz2k90pbf3p9JUxYbIKHgcjrBfclDQmaMPQTCw4rDy1gm6tfXPhad3g
Nin8p78lNR43VfHYbf0HpMCZClh8ZPCNgIbO/CGnJNJOf7uozK3/fhCntg8oVvVK
q9y6SXySYrM/wC6kbF13u22mOB4NRGCwHITDPLvTOOJ78JEd0HWPgwkfqGgMvMSp
BiRg6MounfixNZLECwGLyRoT+S7To4oiDzpvs+JV9xWaVnEB8yaS0Swmi6YxVmI6
REHhw2WrCV3X7HQLCXOMuGXkNMh24w2TRNTYidC7SaPmIK7V5DVhkBKM4M/IlKq1
uTtJaU/DXUCUF34eYlGVsmw9QpUD5/SxUjcWpX8woljthwIvUy7kHvPctp0lwBZP
miKiCYlpG00=

解密:openssl enc -d -des3 -a -salt -out fstab -in fstab.ciphertext

[root@promote ~]# openssl enc -d -des3 -a -salt -out fstab -in fstab.ciphertext
enter des-ede3-cbc decryption password:
[root@promote ~]# cat fstab

#
# /etc/fstab
# Created by anaconda on Sun Apr 14 09:29:51 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos_promote-root /                       xfs     defaults        0 0
UUID=273deb66-d03c-457f-8b29-5df019b3e53a /boot                   xfs     defaults        0 0
/dev/mapper/centos_promote-home /home                   xfs     defaults        0 0
/dev/mapper/centos_promote-swap swap                    swap    defaults        0 0
单向加密:

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

dgst命令:
openssl dgst -md5 /PATH/TO/SOMEFILE

[root@promote ~]# md5sum fstab
c58fef6dca558db2e6122bdf12f66aba  fstab
[root@promote ~]# openssl dgst -md5 fstab
MD5(fstab)= c58fef6dca558db2e6122bdf12f66aba

生成用户密码:
工具:passwd, openssl passwd
openssl passwd -1 -salt SALT

[root@promote ~]# openssl passwd -1 -salt 12345678
Password: 
$1$12345678$2MUF23c1xwXhNSpW3dupd.

生成随机数:
工具:openssl rand
openssl rand -hex NUM
openssl rand -base NUM

[root@promote ~]# openssl rand -base64 12
0iMFITFdgsHDsKLA
[root@promote ~]# openssl rand -hex 12
6e02d827b1944dfe66e18b93
公钥加密:

加密解密:
算法:RSA,ELGamal
工具:openssl rsautl, gpg

数字签名:
算法:RSA, DSA, ELGamal
工具:openssl rsautl, gpg

密钥交换:

算法:DH

生成密钥:
生成私钥:(umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)

[root@promote ~]# (umask 077;openssl genrsa -out /tmp/mykey3.private 2048)
Generating RSA private key, 2048 bit long modulus
...............................................................................................................................................+++
........................................................................................................................................+++
e is 65537 (0x10001)

提出公钥:openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout

[root@promote ~]# openssl rsa -in /tmp/mykey3.private -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAslrkVrMPj7efIJ1Pt337
sVVguLyu1xdU4BpYZJEEXncik0+UtlzQ6yR2tpys0LxDac2urL4dLhk5S/khU71j
zm4w3yZPolxMP0hAORisx4QmVN+QRfayWSCnR2RUI73Xn8hnY7fPGN7kZD5ZlMnd
H0aUiuSMugQQR5ZqJmzmHUqcsfT/flAQDAhSChFlseTJ4y93uHR8zGou4cR3mluL
gGSXAtokj5+9m4Q0pMQuuu+qaZyfJu+3iv1OgXNi5BOFwhIZdrZv64W+nx0C9sUb
HjpFliMss0tCAebxM6fwjaxqv+8Is156THXfSvIVDcqkSU0Uckx3OKUcWFK8SVyD
6wIDAQAB
-----END PUBLIC KEY-----

Linux系统上的随机数生成器:

/dev/random:仅从熵池返回随机数;随机数用尽,则阻塞;

/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞;伪随机数不安全;

熵池中随机数的来源:

硬盘IO中断时间间隔;
键盘IO中断时间间隔;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,859评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,772评论 2 374
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,956评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,729评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,611评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,441评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,850评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,485评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,770评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,803评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,598评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,434评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,856评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,065评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,365评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,852评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,065评论 2 338

推荐阅读更多精彩内容

  • 前言 早期互联网数据传输是基于TCP/IP模型完成数据交换,其各层对传输的数据包进行各协议的封装,从数据的发送方到...
    魏镇坪阅读 6,515评论 1 11
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,068评论 1 32
  • SSL(Secure Socket Layer,安全套接字层)是为网络通信提供安全保障和数据完整性的一种安全协议,...
    CHUANHAI阅读 1,810评论 0 7
  • 1 概述 OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,...
    ghbsunny阅读 3,061评论 0 2
  • SSL是一种国际标准的加密及身份认证通信协议,您用的浏览器就支持此协议。SSL(Secure Sockets La...
    星空星晴阅读 5,599评论 1 1