OpenSSL

  • Post author:
  • Post category:其他


OpenSSL

一、概念类

传输层协议:TCP,UDP,SCTP

port:进程地址,进程向内核注册使用某端口(独占)

同一主机上的进程间通信:IPC,message queue,shm,semephor

不同主机上的进程间通信:socket(也可用于同一主机间通信),

socket=ip:port

cip:port — sip:port,已建立连接的套结字都是一对socket

监听模式:listen(ip:port)

SSL:Secure Sockets Layer

http -> ssl ->https

安全的通信目标:

1.保密性:confidentiallity

2.完整性:integrity

3.可用性:availabilty

攻击类型:

威胁保密性攻击:窃听,通信量分析

威胁完整性攻击:更改,伪装,重放,否认

威胁可用性攻击:拒绝服务(DoS)

针对攻击的解决方案

技术:加密解密

服务:用于抵御攻击的服务,安全服务

加密和解密:

传统加密方法:替代加密方法,置换加密方法

现代加密方法:现代块加密方法,

服务:

认证机制

访问控制机制

二、密钥算法和协议

密钥算法和协议

对称加密

公钥加密

单向加密

密钥交换

对称加密:加密和解密使用同一个密钥,(解决保密性问题)

DES(data encryption standard)des算法_百度百科 (baidu.com)

3DES:Triple DES,三轮DES加密

AES:Advanced Encryption Standard(密钥长度128bit,192bit,256bit)

特性:

1.加密解密使用同一个密钥

2.将原始数据分割为固定大小的块,逐个进行加密

缺陷:

1.密钥过多

2.密钥分发困难

公钥加密(非对称加密),身份认证,密钥交换,数据加密(比对称加密慢3个数量级,10的3次幂)

密钥成对出现,密钥分为:公钥,私钥

公钥:可以公开给所有人,pubkey,公钥从私钥中提取产生

私钥:通过工具创建,使用者自己留存,必须保证其私密性,secret key,skey

特点:

用公钥加密的数据,只能使用与之配对的私钥解密,反之亦然

用途:

数字签名:主要用于接收方确认发送方身份,使用私钥对需要传输的文本的摘要进行加密,得到的密文即被称为该次传输过程的签名

密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方

数据加密:通常不用于数据加密,效率低

点对点模型示例:client A, sever B

加密过程:

1. B将data1通过<单向加密>算法,提取特征码(如MD5),通过自己私钥对特征码进行加密(数字签名,用以完成身份认证),生成数字签名,附加在数据后,称为data2,保证发送方身份和数据完整性

2.B生成一次性<对称加密>密码,将data2通过对称加密对整段数据进行加密(保密性),称为data3

3.B将data3通过A的公钥对一次性对称加密密码进行加密(密钥交换),附加在数据后,成为data4(保证其保密性),发送给A



解密过程:

1.    A获取data4,先用自己的私钥对对称加密密码进行解密,获得data3+对称密码

2.    A用对称密码对data3解密,获得data2和MD5

3.    A用B公钥对特征码进行解密(身份认证),用MD5验证data1完整性

缺点:容易受到中间人攻击,进而需要CA

CA:保证通信双方能够拿到正确公钥的公信机构

算法:RSA,DSA,ELGamal

DSA:digital signature algorithm,仅能用于签名,而不能用于加解密

DSS:digital signature standard

RSA:即能签名也能用于加解密

单向加密:只能加密,不能解密,只能提取数据特征码md5等(保证数据完整性)

特点:

定长输出

雪崩效应(加密数据的微小改变,导致密码巨大变化)

功能:用于验证数据完整性

算法:

1.MD5:Message-Digest Algorithm 5,128bit信息摘要算法

2.sha1:Secure Hash Algorithm 1,160bit,安全散列算法

sha224,sha256,sha384,,sha512

centos6,7用户密码加密:sha512

cenots5用户密码加密:md5

密钥交换:IKE :Internet key exchange互联网密钥交换协议

RSA(公钥加密)

DH:deffie-hellman(迪菲-赫尔曼)

优势在于让双方不用发密码就可以得到密码

模型:

A:p,g

B:p,g

A:x

p^x%g==>B

A:(p^y%g)^x

B:y

p^y%g==>A

B:(p^x%g)^y

(p^y%g)^x = (p^x%g)^y

(p^x%g)^y为密码

ECDH:椭圆曲线DH

ECDH:临时椭圆曲线DH

三、实现

PKI: public key infrastructure,公钥基础设施

签证机构:CA(市公安机关)

注册机构:RA(派出所)

证书吊销列表:CRL

证书存取库:

互联网通信强依赖PKI

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

版本号:用来区分X.509的不同版本号

序列号:由CA给予每一个证书的分配唯一的数字型编号,当证书被取消时,实际上是将此证书的序列号放入由CA签发的CRL中;这也是序列号唯一的原因。

签名算法ID:用来指定用CA签发证书时所使用的签名算法。算法标识符用来指定CA签发证书时所使用的公开密钥算法和HASH算法,须向国际指明标准组织(如ISO)注册。

发行者名称(认证机构):即发出该证书的机构唯一的CA的x.500名字;

有效期限:证书有效的时间包括两个日期:证书开始生效期和证书失效的日期和时间。在所指定的这两个时间之间有效;

主体名称:证书持有人的姓名、服务处所等信息;

主体公钥:包括被证明有效的公钥值和加上使用这个公钥的方法名称;

发行者唯一标示

主体的唯一标识

扩展

发行者签名:以确保这个证书在发放之后没有被撰改过;

CA使用模型:

Clinet C,Server S

C获取S证书,验证证书:

用CA的公钥去解密CA签名,能解密说明证书来源可靠

用同样的加密算法去加密证书取得特征码,和解密证书特征码比较,说明完整性可靠

检查证书有效期限

验证主体名称和通信人是否一致

检查证书是否被吊销

SSL:secure socket layer

安全套接层是Netscape公司率先采用的网络安全协议

v1.0(1994),v2.0,v3.0

TLS:transport layer security

安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性

IETF研发:1999

v1.0,v1.1,v1.2,v1.3

我们统称的SSL,实际是指SSL或TLS

TLS分层设计:

1.最底层:基础算法原语实现aes,rsa,md5

2.向上一层:各种算法实现

3.向上一层:组合算法实现的半成品

4.用各种组件拼装而成的各种成品密码密码学协议软件

协议开源实现:openssl

四、SSL handshake

OpenSSL由三部分组成:

1.    libencrpt库:加密解密库

2.    libssl库,实现SSL功能,用于通信加密的库

3.    openssl:多用途命令行工具

SSL主要简化有3步:

1.    客户端向服务器端索要并验证对方证书

2.    双方协商生成会话密钥

前两部合成握手阶段,handshake

3.    双方采用会话密钥进行加密通信

4.    断开



——–ssl handshake 流程————

第一阶段:客户端通过浏览器向服务器发出加密通信请求:

clinethello:

1.    向服务器发送自己支持的协议版本,比如TLS1.2

2.    客户端生成的随机数,稍后用于生成会话密钥

3.    支持的加密算法,比如AES,3DES,RSA

4.    支持的压缩算法

第二阶段:服务器端回应客户端

Serverhello:

1.    确认使用的通信加密协议版本,比如TLS1.2

2.    服务器端生成一个随即数,稍后用于生成会要密钥

3.    确认使用的加密算法

4.    发送服务器证书;

5.    索要客户端证书(如果需要)

第三阶段:客户端收到服务器端的回应

1.    验证服务器证书(发证机构,证书签名,证书完整性,证书持有者,证书有效期,吊销列表等等),确认无误后,取出服务器公钥

2.    发送以下信息给服务器端:

a)    一个随机数(第三个随即数),用服务器公钥对这个随机数加密

b)    编码变更通知(随后信息,用双方商定的加密算法进行发送)

c)    客户端握手结束通知

第四阶段:服务器回应

1.    收到客户端发来的第三个随机数pre-master-key,计算生成本次会话所用的“会话密钥”

2.    向客户端发送如下信息:

a)    编码变更通知,表示随后的信息都将用双方商定的加密算法和密钥发送

b)    服务器握手结束通知

———ssl handshake—————–



五、OpenSSL

组件:

Libcrypto,libssl主要由开发者使用

openssl:多用途命令行工具

openssl命令分类:

standard commands:标准命令

message digest:消息摘要命令

cipher commands:加密命令

标准命令:enc,ca,req,genrsa

对称加密,使用openssl完成对称加密:

工具:openssl enc

算法:3des,aes,blowfish

enc命令:

enc – symmetric cipher routines

openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P][-bufsize number] [-nopad] [-debug] [-none] [-engine id]

-e加密,-d解密,-a(-base64)文本加密

实例:

加密:

openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext

解密:

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

单向加密:

工具:openssl dgst,md5sum,sha1sum,sha224sum

dgst:

提取摘要

openssl dgst -md5 fstab

openssl dgst -md5 -out fstab.md5 fstab

验证摘要:

生成用户密码的命令:

工具:passwd, openssl passwd

openssl passwd:

openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}

openssl passwd -1 -salt 123456

-1(一)标示MD5加密,-salt不变,密文不变

生成随即数,salt

工具:openssl rand

openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num

openssl rand -base64 10

L4JQf3hy3RdPtQ==

使用时需要删除==

openssl rand -hex 10

f858abb49c1b72e5188d

openssl passwd -1 -salt $(openssl rand -hex 4)

$1$7d20e521$fp7jFdPa8IRTqjx1FbKHL/

公钥加密:

三种功能:

加密解密:

算法:rsa,elgamal

工具:openssl rsautl,gpg

数字签名

算法:rsa, dsa, elgamal

工具:openssl rsautl,gpg

密钥交换

算法:dh

生成密钥对

1.    生成私钥

openssl genrsa [-out filename] [-passout arg] [-aes128] [-aes192] [-aes256] [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]

openssl genrsa  -out ./mykey3.private 1024

openssl genrsa 1024 > mykey.private

openssl genrsa 1024

修改为仅自己能读能写

(umask 077; openssl genrsa -out mykey4.private 1024)

使用()表示启用子shell启动进程,主进程不受影响

2.    提取公钥

openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-sgckey] [-aes128] [-aes192] [-aes256] [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-RSAPublicKey_in] [-RSAPublicKey_out] [-engine id]

openssl rsa -in mykey.private -pubout -out mykey.pub

3.    linux系统上的随机数生成器:

a)    /dev/random:仅从熵池中返回随机数,随机数用尽,阻塞

b)    /dev/urandom:从熵池中返回随机数,随即数用尽,会利用软件生成伪随即数,非阻塞

伪随即数不安全,熵池:内核在内存中维护的一个空间,空间内存储大量随机数,

熵池中的随机数来源:

硬盘IO中断时间间隔

键盘IO中断时间间隔

如果随机数用尽,可以拷贝大数据到硬盘,产生大量IO

CA:

分为两类:

公共信任的CA,

私有CA

建立私有CA:

openssl

OpenCA(图形界面工具)

openssl命令:

其配置文件/etc/pki/tls/openssl.cnf

构建私有CA:在确定配置为CA的服务器上生成一个自签证书,并为CA提供所需的目录及文件即可

步骤:

1.    生成私钥,默认要求生成在/etc/pki/CA/private/

(umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)

2.    生成自签证书,要配置在/etc/pki/CA/cacert.pem

req – PKCS#10 certificate request and certificate generating utility.

openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365

-new 生成新证书签署请求

-x509 生成自签格式证书,专用于创建私有CA时

-key 生成请求时用到的私有文件路径

-days 证书有效时长

-out 输出路径

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

(umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)

cd /etc/httpd/ssl

2.    生成证书签署请求

openssl req -new -key httpd.key -out httpd.csr -days 365

3.    将请求通过可靠方式发送给CA

a)    把httpd.csr拷贝给CA

cp httpd.csr /tmp/

————以上在请求主机作,以下在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

serial=01

subject= /C=CN/ST=Liaoning/O=tianlang/OU=Ops/CN=k8s-node-02

5.    CA给客户提供认证

cp certs/httpd.crt /etc/httpd/ssl/

吊销证书:

步骤:

1.    客户端获取要证书吊销的serial

openssl x509 -in certs/httpd.crt -noout -serial -subject

2.    CA主机吊销证书

先根据客户提交的serial和subject信息,对比其与本机index.txt中信息是否一致

吊销:

openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem

其中serial.pem要换成证书真正的序列号

3.生成吊销证书的吊销编号(第一次吊销证书执行)

echo 01>/etc/pki/CA/crlnumber

4.更新证书吊销列表

openssl ca -gencrl -out thisca.crl

查看crl文件

openssl crl -in /path -noout -text

OpenSSH 和 OpenSSL 并不是直系亲属,顶多算有共同志向的兄弟!

它们是由不同的团队开发,有不同的目的,但是都开放源码,为安全通信提供支持。

一、OpenSSH

OpenSSH 是使用 SSH 协议进行远程登录的连接工具。 它加密所有通信讯息以消除窃听、连接劫持和其他攻击。 此外,OpenSSH 提供了大量的安全隧道功能、多种身份验证方法和复杂的配置选项。

OpenSSH 包含的组件如下:

(1)ssh

OpenSSH 远程登录客户端,作为 rlogin 和 Telnet 的替代方案。

(2)scp

OpenSSH 安全文件复制,作为 rcp 的替代方案,将文件复制到其他电脑上。

(3)sftp

OpenSSH 安全文件传输,类似于 scp。

(4)sshd

OpenSSH 守护进程。

(5)ssh-keygen

OpenSSH 身份验证密钥实用程序,产生RSA或ECDSA密钥,用来认证用。

(6)ssh-agent

OpenSSH 身份验证代理,用于帮助用户不需要每次都要输入密钥密码的工具。

(7)ssh-add

向 OpenSSH 身份验证代理添加私钥身份,用于帮助用户不需要每次都要输入密钥密码的工具。

(8)ssh-keyscan

从服务器收集 SSH 公钥,并记录公钥。

在类 Unix 系统中的远程登录就采用了 SSH 协议,只有安装了相应软件包才能实现远程登录。

二、OpenSSL

OpenSSL 是一个开源的软件库,使用包含了众多加解密算法,用于传输层安全性 (TLS) 和安全套接字层 (SSL) 协议的强大、商业级和功能齐全的工具包。

主要库是以 C 语言所写成,实现了基本的加密功能,实现了SSL与TLS协议。



版权声明:本文为u010230019原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。