Openssl——为你的信息保驾护航

OpenSSL基础


·传输层协议:TCP,UDP,SCTP

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

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

·不同主机上的进程间通信:socket

         cip:port <– –> sip:port

                 cip:55637 <– –> sip:80        

                 监听模式:LISTEN(ip:port)

·加密需要:

         不加密流量的易受攻击性:

                 密码/数据嗅探

                 数据操作

                 验证操作

                 相当于邮寄明信片

         不安全的传统协议:

                 telnet 、FTP 、POP3 等等;不安全密码

                 http 、smtp 、NFS 等等;不安全信息

                 Ldap 、NIS 、rsh

·设计基本原则:

         使用成熟的安全系统

         以小人之心度输入数据

         外部系统是不安全的

         最小授权

         减少外部接口

         缺省使用安全模式

         安全不是似是而非

         从STRIDE 思考

         在入口处检查

·SSL:Secure Sockets Layer

        http –> ssl –> https

·安全的目标:

         保密性:confidentiality

         完整性:integrity

         可用性:availability

·攻击类型:

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

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

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

·解决方案:

         技术(加密和解密)、服务(用于抵御攻击的服务,为了上述安全目标而特地设计的安全服务)

        

         加密和解密:

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

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

        

         服务:

                 认证机制

                 访问控制机制

        

         密钥算法和协议:

                 对称加密

                 公钥加密

                 单项加密

                 认证协议

Linux系统:OpenSSL(ssl),GPG(pgp)


·OpenSSL由3部分组成:

         libcrypto库:加密解密的库

         libssl库:加密模块应用库,实现ssl及tls

         openssl:多用途命令行工具

加密算法和协议:


·对称加密:加密和解密使用同一密钥

         DES:Data Encryption Standard

         3DES:Triple DES

         AES:Advanced Encryption Standard (128bits,192bits,256bits,384bits)

         Blowfish

         Twofish

         IDEA

         RC6

         CAST5

         特性:

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

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

        

         缺陷:

                 1、密钥过多

                 2、密钥分发困难

                 3、数据来源无法确认

·公钥加密:密钥分为公钥和私钥

         公钥:从私钥中提取产生;可公开给所有人;public key

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

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

        

         用途:

                 数字签名:主要在于让接收方确认发送方的身份

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

                 数据加密

        

         算法:RSA、DSA、ELGamal

                 DSS:Digital Signature Standard

                 DSA:Digital signature Algorithm

                 DSA:只能签名不能加密

        

         缺点:密钥长,加密解密效率低下

        

         实现加密:

                 接收者

                         生成公钥/密钥对:P和S

                         公开公钥P,保密密钥S

                 发送者

                         使用接收者的公钥来加密消息M

                         将P(M)发送给接收者

                 接收者

                         使用密钥S来解密:M=S(P(M))

        

         实现数字签名:

                 发送者

                         生成公钥/密钥对:P和S

                         公开公钥P,保密密钥S

                         使用密钥S来加密消息M

                         发送给接收者S(M)

                 接收者

                         使用发送者的公钥来解密M=P(S(M))

        

         结合签名和加密

·单向加密:即提出数据指纹(特征码);只能加密,不能解密

         特征:定长输出、雪崩效应

         功能:实现完整性

         算法:

                 md5:Message Digest 5 ,128bits

                 sha1:Secure Hash Algorithm 1 ,160bits

                 sha224 ,sha256 ,sha384 ,sha512

        

         工具

                 md5sum | sha1sum [ –check ] file

                 openssl 、gpg

                 rpm -V

    

         md5sum /path/to/file

                对文件进行哈希计算

                例如:

                        md5sum f1 > f1.md5

                        md5sum –check f1.md5

                                比较文件的hash值是否变化

·密钥交换:IKE(Internet Key Exchange)

         公钥加密

         DH(Deffie-Hellman)<迪菲-赫尔曼>

         ECDH(椭圆曲线DH)

         ECDHE(临时椭圆曲线DH)

        

                 A:p,g   协商生成公开的整数a,素数p

                 B:p,g

                

                 A:产生一个随机数x

                         通过DH算法发送给B一个数据

                                 –> p^x%g ==> B

                         密钥:A:(p^y%g)^x=p^yx%g

                

                 B:产生一个随机数y

                         通过DH算法发送给A一个数据

                                 –> p^y%g ==>A

                        密钥:B:(p^x%g)^y=p^xy%g

        

         DH:

                 1、 A:a,p  协商生成公开的整数a,  大素数p

                     B:a,p

                 2、 A:生成隐私据数据:x(x<p),计算得出a^x%p,发送给B

                     B:生成隐私据数据:y(y<p), 计算得出a^y%p,发送给A

                 3、 A:计算得出(a^y%p)^x=a^xy%p,生成为密钥

                     B:计算得出(a^x%p)^y=a^xy%p,生成为密钥

·数据传输方式:

        加密通信中数据块的结构:key<对称加密>(data+SA[hash(data)])+PB(key)

                        用hash算法:计算出data的特征码

                        用自己的SA<私钥>:签名data的特征码

                        用对称加密<key>加密:data和签名后的hash(data)

                        用对方的PB<公钥>加密:对称加密的密钥<key>

                        把对称加密的数据和PB加密的数据一同发给对方

·PKI:Public Key Infrastructure

         公钥基础设施:

         签证机构:CA

         注册机构:RA

         证书吊销列表:CRL

         证书存取库:

        

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

                 版本号

                 序列号

                 签名算法ID

                 发行者名称

                 有效期限

                 主体名称

                 主体公钥

                 发行者的唯一标识

                 主体的唯一标识

                 扩展

                 发行者的签名

        

         证书获取:

                 证书类型:

                         证书授权机构的证书

                         服务器

                         用户证书

                 获取证书两种方法:

                         使用证书授权机构

                                 生成签名请求(csr)

                                 将csr发送给CA

                                 从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

SSL/TLS


·SSL:安全套接字层(ssl 1.0,2.0,3.0)

·TLS:传输层安全(tls 1.0,1.1,1.2,1.3)

·OpenSSL

         libcrypto

         libssl

         openssl

·SSL回话主要三步:

         客户端向服务器端索要并验证证书

         双方协商生成“会话密钥”

         双方采用“会话密钥”进行加密通信

·SSL Handshake Protocol

         第一阶段:ClientHello

                 支持的协议版本:比如tls 1.2

                 客户端生成一个随机数,稍后用于生成“会话密钥”

                 支持的加密算法:比如AES、RSA

                 支持的压缩算法

        

         第二阶段:ServerHello

                 确认使用的加密通信协议版本:比如tls 1.2

                 服务器端生成一个随机数,稍后用于生成“会话密钥”

                 确认使用的加密方法

                 服务器证书

        

         第三阶段:

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

                 发送以下信息给服务器端

                 一个随机数

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

                 客户端握手结束通知

        

         第四阶段:

                 收到客户端发来的第三个随机数<客户端在第三阶段产生的随机数>per-master-key后,计算生成本次会话所用到的“会话密钥”

                 向客户端发送如下信息:

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

                 服务器端握手结束通知

·PKI:公钥基础设施

         签证机构:CA

         注册机构:RA

         证书吊销列表:CRL

         证书存取库

OpenSSL命令


·组件:

         libcrypto,libssl主要由开发者使用

         openssl:多用途命令行工具

·openssl:

         众多子命令,可分为三类:

                 标准命令

                 消息摘要命令(dgst子命令)

                 加密命令(enc子命令)

        

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

        

         openssl ?

                 查看openssl命令的众多子命令

·对称加密:

         工具: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 -in fstab.ciphertext -out fstab.test

                         -e:加密

                         -d:解密

                         -a:[-a/-base64]使用base64位的输出格式

                         -salt:加点盐ftp://10.1.0.1/pub/exam/%E9%9D%A2%E8%AF%95%E9%A2%98/%E6%90%9C%E7%8B%90/QQ%E5%9B%BE%E7%89%8720141202142644.jpg

                         -in:对那个文件进行加密/解密

                         -out:加密/解密输出的文件路径及文件名

Openssl——为你的信息保驾护航

Openssl——为你的信息保驾护航


·单向加密:

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

        

         dgst命令:

                 # openssl dgst -md5 /PATH/TO/SOMEFILE

3.png

·生成用户密码:

         工具:passwd ,openssl passwd

        

         openssl passwd -1 -salt SALT

                 -1:使用sha1的密钥长度生成密码

                 默认只支持sha1,不支持sha256以及sha512

4.png

·生成随机数:

         工具:openssl rand

        

         # openssl rand -hex NUM

                 hex encode output

                 生成16位进制的随机数,1位占4字节

         # openssl rand -base64 NUM

                 base64 encode output

                 生成的随机数要去掉最后面的2个=符号

5.png

·公钥加密:

         加密解密:

                 算法:RSA ,ELGamal

                 工具:openssl rsautl ,gpg

        

        数字签名:

                 算法:RSA ,DSA ,ELGamal

                 工具:openssl rsautl ,gpg

        

        密钥交换:

                 算法:DH

        

        生成密钥:

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

                         可以加 -des3 使用3des对私钥进行加密

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

Openssl——为你的信息保驾护航

Openssl——为你的信息保驾护航

Openssl——为你的信息保驾护航

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


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

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

    伪随机数不安全

         熵池中随机数的来源:

                 硬盘IO中断时间间隔

                 键盘IO中断时间间隔

        

         随机数不够用时:

                 1、击键<不建议>

                 2、cp或mv一个大的文件,从而产生大量硬盘IO终端<建议>

CA:


·公共信任的CA,私有CA

·建立私有CA:

         openssl

         OpenCA

·openssl命令:

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

        

[ CA_default ]
                
dir             = /etc/pki/CA           # Where everything is kept   //CA目录
certs           = $dir/certs            # Where the issued certs are kept   //CA签名的证书所放路径
crl_dir         = $dir/crl              # Where the issued crl are kept  //吊销列表
database        = $dir/index.txt        # database index file.  <必须touch出文件来>   //已签名证书的数据库文件
                
new_certs_dir   = $dir/newcerts         # default place for new certs.  //新证书存放路径
                
certificate     = $dir/cacert.pem       # The CA certificate     //CA自己的证书路径及文件名
serial          = $dir/serial           # The current serial number   <必须touch出文件来>  //每个证书的序列号及文件名
crlnumber       = $dir/crlnumber        # the current crl number   //吊销证书的序列号及文件名
                                                        # must be commented out to leave a V1 CRL
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/cakey.pem# The private key <很重要>    //CA自己的私钥路径及文件名
                
default_days    = 365                   # how long to certify for
default_crl_days= 30                    # how long before next CRL
default_md      = sha256                # use SHA-256 by default
preserve        = no                    # keep passed DN ordering
                
# For the CA policy
[ policy_match ]
countryName             = match   //match必须同CA服务器
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional   //optional可以选的
commonName              = supplied  //supplied自己给出
emailAddress            = optional

·构建私有CA:

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

        

         步骤:

                 (1)生成私钥

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

                

                 (2)生成自签证书

                         # openssl req -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请求签署证书

         步骤:(以http为例)

                 (1)用到证书的主机生成私钥

                         # mkdir /etc/httpd/ssl

                         # cd /etc/httpd/sl

                         # (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主机

                         # scp /etc/httpd/ssl/httpd.csr root@IP.A.DD.R:/tmp/

                

                 (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

                                         -subject :给谁发布的

                

                

                 (5)把CA主机上签署的证书发给http主机

·吊销证书:

         步骤:

                 (1)客户端获取要吊销的证书的serial(在使用证书的主机上执行)

                         # openssl x509 -in /etc/pki/CA/certs/httpd.crt -nount -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

                                 thisca.crl  是CA签署的其他公钥的签名

                

                         查看crl文件

                                 # openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text

作业:用openssl实现证书申请

创建CA

(1)生成私钥

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

Openssl——为你的信息保驾护航

Openssl——为你的信息保驾护航

(2)生成自签证书

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

Openssl——为你的信息保驾护航

(3)为CA提供所需的目录及文件

# ls -ld /etc/pki/CA/{certs.crl,newcerts}

        一般默认有上面三个目录,无这3个目录时,创建之

# touch /etc/pki/CA/{serial,index,txt}

# echo 01 > /etc/pki/CA/serial

Openssl——为你的信息保驾护航

要用到证书进行安全通信的服务器,需要向CA请求签署证书

步骤:(以http为例)

(1)用到证书的主机生成私钥

# mkdir /etc/httpd/ssl

# cd /etc/httpd/sl

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

Openssl——为你的信息保驾护航

Openssl——为你的信息保驾护航

(2)生成证书签署请求<提取出私钥中的公钥>

# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365

Openssl——为你的信息保驾护航

(3)将请求通过可靠方式发送给CA主机

# scp /etc/httpd/ssl/httpd.csr root@IP.A.DD.R:/tmp/

Openssl——为你的信息保驾护航

(4)在CA主机上签署证书

# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365

Openssl——为你的信息保驾护航

(5)把CA主机上签署的证书发给http主机

Openssl——为你的信息保驾护航


原创文章,作者:megedugao,如若转载,请注明出处:http://www.178linux.com/48461

评论列表(1条)

  • 马哥教育
    马哥教育 2016-09-23 12:51

    我们常常处于测试的目的会自建CA来模拟https协议的实现,以后学习中也会用的很多,望熟练掌握,尝试着用脚本来实现CA主机的自签和授权,挑战一下自己