1、通讯机制:

    同一主机间通讯机制:IPC、message quence,shm(共享内存),semerphone

    不同主机间通讯机制:socket(ip:port),一般来说socket通讯都是成对出现:CIP:PORT<--->SIP:PORT

2、传输层协议:

tcp、udp、sctp;传输层协议单元为段,用端口区分不同应用    

port用来标识进程地址;进程向内核注册使用某端口(独占的)


3、如何保证安全的信息通讯?

    ssl:secure socket layer:安全套接字层,ssl是一种规范协议


4、信息安全目标:

    保密性:confidentiality;确保通讯的保密性

    完整性:integrity;确保信息的完整性,体现在数据的完整性和系统完整性两个层面

    有效性(可用性):


5、攻击类型:

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

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

    威胁可用性的攻击:决绝服务


6、安全实现手段:安全通讯解决方案

    通过技术实现:加密和解密       

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

        现代加密方法:现代块加密技术,将存在硬盘上的数据,分成块进行加密。   

    通过服务实现:用于抵御攻击的服务,也就是说为了实现上述安全目标而特地设计的安全服务。

        认证机制

        访问控制机制

        秘钥算法和协议(专用于密码交换)


6.1、linux系统实现上述解决方案工具主要有两个:openssl、GPG

   openssl由三部分组成:

    libencrypt库:实现加密解密的库

    libssl库:实现ssl安全通信的库

    openssl工具:命令行工具,多用途,可以实现前两者的功能


6.2、密钥算法和协议:

    对称加密:主要用来加密数据;DES、3DES、AES

    公钥加密:主要用来加密对称加密密钥;RSA、DSA

    单向加密:主要用来提取数据特征码;md5、sha1、sha224、sha256、sha384、sha512

    认证协议:主要用来进行密钥交换

6.2.1、对称加密:

    加密和解密使用同一个密钥,但是加密和解密的算法可能不同。

    对称加密算法主要有:des(56位加密技术)、3des、aes(advance encryption standard;128bits、192bits、256bits、384bits)、blowfish、twofish、idea、rc6等等;常用的是3des和aes。


    对称加密特性:

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

        ②、将原始的数据分隔成固定的大小的块,逐个进行加密


    对称加密的缺陷:

         ①密钥过多(体现在服务端和众多客户端通讯时,需要每个通讯都有一个单独的密钥)

         ②密钥分发困难


6.2.2、公钥加密:

    密钥成对出现,有公钥和私钥。

       公钥:publickey,公开给所有人;公钥从私钥中提取产生

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


    公钥加密特性:

        ①、用公钥加密的数据只能由对应的私钥进行机密,反之亦然。


    公钥加密用途:

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

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

        ③、数据加密:主要加密对称密钥


数字签名的实现过程:

  以a用户和b用户通讯为例

    ①、a用户发送数据给b用户,a需要用到单向算法提取发送数据的特征码,由于单向算法有雪崩效应,改动很小一部分,特征码就会发生很大变化

    ②、a用户用自己的私钥加密这段特征码,并将其附加在这段数据的后面(如果用私钥加密原始数据,消耗内存、cpu)

    ③、a用户生成一个临时的对称加密密钥,并使用这个密钥加密原始数据和特征码,生成的新的数据

    ④、a用户获取b用户的公钥,并用b用户的公钥加密a的对称密码,将其附在③中新生成数据包的后面,然后将整个数据包发送给b用户。

    ⑤、b用户用自己的私钥去解密a用户用b的公钥加密的数据,得到③中的数据和④中的加密后的对称密钥并将其解密成明文对称密钥。

    ⑥、b用户用a的对称密钥解密③中的数据,得到原始数据和原始数据提取的加密后的特征码

    ⑦、b用户用a的公钥去解密②中的a私钥加密的特征码,如果可以解密,a用户的身份得到验证。

    ⑧、b用同样的单向加密算法去计算原始数据的特征码,如果一样,完整性得到了验证,否则说明数据被篡改过。

其中①-④说明了加密的过程,⑤-⑧说明了数字签名和完整性验证。但是,此处有个问题,怎么确保对方的公钥是安全的,就是他们需要发送对方的呢?因此有了第三方公证机构(CA:证书颁发机构)


    公钥加密常用算法:

        DSA:只能用于实现数字签名,不能实现加密解密

        RSA:既能实现数字签名又能实现加密、解密。 

      

6.2.3、单向加密:只能实现加密,不能实现解密,用于提取数据指纹

    单向加密特征:

        定长输出、雪崩效应


    单向加密功能:

        用于实现完整性


    单向加密算法:

        md5:messagedigest,消息摘要,5是版本号,128bits定长输出

        sha1:secure hash algorithm,1是版本号,160bits定长输出

        sha224、sha256、sha384、sha512

    注意:对于centos6、7来说,密码加密已从centos5中的md5切换到sha512了。


6.2.4、认证协议:和加密算法相关的协议,密钥交换,IKE(internet key exchange)

    密钥交换:IKE

        公钥加密:密钥在网上传输

        DH(diffie-hellman):密钥不在网上传输,更安全些



6.3、PKI:pulic keyinfrastructure;公钥基础设施

      组件如下:

        签证机构:CA

        注册机构:RA

        证书吊销列表:CRL

        证书存取库:CB

 

证书:数字证书标准(x.509),它定义了证书的结构以及认证协议标准

  证书组成部分:

    ①版本号

    ②序列号

    ③签名算法ID

    ④发行者名称

    ⑤有效期限

    ⑥主体名称

    ⑦主体公钥

    ⑧发行者的唯一标识

    ⑨主体的唯一标识

    ⑩拓展信息

    11.发行者的签名

 其中①-⑤为签证机构信息,⑥-⑩为个人信息,11为发证机构


7、SSL和TLS协议:

ssl:secure socket layer,安全套接字层在ip层和传输层之间衔接,有网警公司开发

    ssl v1.0(已废弃)、ssl v2.0(已废弃)、ssl v3.0

tls:transport layer security,传输层协议安全,由ITEF研发

    tls v1.0 、tls v1.1 、tls v1.2 、tls v1.3(草案)   


tls分层设计:

    最底层:基础算法原语的实现,aes,rsa,MD5

    向上一层:各种算法的实现

    再向上一层:组合算法实现的半层品

    最顶层:用各种组件拼装而成的各种成品密码学协议软件。

注意:实现ssl协议和tls协议的软件的有很多,著名的开源软件有:openssl。


8、openssl组件:

    libcrypto库:实现加密解密,主要由开发者使用

    libssl库:实现ssl功能,主要由开发者使用

    openssl:多用途的明林工具


9、ssl会话步骤:

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

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

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


  ssl会话流程:ssl handshank,有四个阶段

    第一阶段:client hello

        向服务器端发送①、支持的协议版本,比如tls1.2;②、客户端生成一个随机数,稍后用户生成“会话密钥”,③、支持的加密算法,比如rsa、aes,④、支持的压缩算法


    第二阶段:server hello  

        ①、确认使用的加密通信协议版本,比如tls1.2

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

        ③、确认使用的加密算法

        ④、服务端发送自己的证书

        ⑤、索要客户端证书(可省)


    第三阶段:client端收到serverhello后的回应

        ①、验证服务器证书,(证书发放机构、证书完整性、证书持有者、证书有效性、吊销列表等)

        ②、确认以上信息无误后,取出其公钥

        ③、发送以下信息给服务器端:

            一个随机数:用于服务器上的公钥加密

            编码变更通知:表示随后信息都将用双方协定的加密算法加密后发送

            客户端握手结束通知

    

    第四阶段:服务端收到客户端发送来的信息

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

        ②、向客户端发送以下信息:

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

            服务端握手结束通知

       




10、openssl命令:

  命令格式:openssl command [ command_opts ] [ command_args ]

    openssl命令有如下三类:

        标准命令

        消息摘要命令

        加密命令

[root@localhost httpd]# 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            seed              seed-cbc          seed-cfb          

seed-ecb          seed-ofb          zlib              


[root@localhost httpd]# 


10.1、openssl实现对称加密:

 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]    

    工具:openssl enc

    支持算法:3des、aes、blowfish、towfish

    加密示例:

        [root@localhost sh]# openssl enc -e -des3 -a -salt -in /etc/fstab -out /tmp/fstab.cipertext   //-in:要加密的文件,-out:加密后的文件,-e:加密

    解密示例:

       [root@localhost sh]# openssl enc -d -des3 -a -salt -in /tmp/fstab.cipertext -out /tmp/fstab.plain  //-d:解密


10.2、openssl实现单向加密:

 openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-c] [-d] [-hex] [-binary] [-out filename] [-sign filename] [-keyform arg] [-passin arg] [-verify filename]         [-prverify filename] [-signature filename] [-hmac key] [file...]

       

        [md5|md4|md2|sha1|sha|mdc2|ripemd160] [-c] [-d] [file...]

    

    工具:openssl dgst

    支持的算法:md5sum、sha1sum、sha224sum、...

    加密示例:

      [root@localhost sh]# openssl dgst -md5   /etc/fstab

      MD5(/etc/fstab)= ec11d9db3a8d8a8dabfe0d98af76ac46

      [root@localhost sh]# md5sum /etc/fstab 

      ec11d9db3a8d8a8dabfe0d98af76ac46  /etc/fstab

      [root@localhost sh]# 


    生成用户密码工具:passwd、openssl passwd

        [root@localhost sh]# man sslpasswd    

        openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}   //salt:随机数

     示例:

        [root@localhost sh]# openssl passwd  -1 -salt 12345678   //-1:表示md5加密,salt表示随机数

        Password:    

        $1$12345678$KShFLCowWE89oV0dKisl2/

        [root@localhost sh]# 

        [root@localhost sh]# openssl passwd -1 -salt $(openssl rand -hex 5)

        Password: 

        $1$cccd731d$6j3DLRtJZqurDiprU/7oz0

        [root@localhost sh]# 


    生成随机数:工具openssl rand

     查看rand在哪些章节有帮助文档

        [root@localhost sh]# whatis rand

        rand (3)             - pseudo-random number generator

        sslrand (1ssl)       - generate pseudo-random bytes

        rand (3p)            - pseudo-random number generator

        [root@localhost sh]# 

    rand命令用法:openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num   //base64表示:用ASCII码表示输出的文件(A-Z),-hex表示仅以16进制(1-F)表示数据

    示例:

        [root@localhost sh]# openssl rand  -base64 16

        QbOTMmR3cpp5+Y2eKIoN3g==

        [root@localhost sh]# 

        [root@localhost sh]# openssl rand  -hex 16

        f41d01d6774f77029dd8ea46ca3214e8

        [root@localhost sh]# 


10.3、openssl实现公钥加密:

    公钥加密的三种功能:

        加密、解密:(算法:rsa;工具:openssl rsautl)

        数字签名:(算法:rsa、dsa,工具:rsautl)

        密钥交换:(算法:D-H)

       

    生成密钥步骤:注意:生成密钥对于公钥加密来说,公钥不是生成的,是从私钥中提取出来的 。

     ①、生成私钥:

        [root@localhost sh]# (umask 077;openssl genrsa -out /a.key 50)  //命令放在括号中运行,表示在当前shell的子shell中运行,运行完则退出,避免对当前shell的影响;-out指出生成的密钥存储的位置,50:表示声场密钥的位长。

        Generating RSA private key, 50 bit long modulus

        .+++++++++++++++++++++++++++

        .+++++++++++++++++++++++++++

        e is 65537 (0x10001)

        [root@localhost sh]# cat /a.key 

        -----BEGIN RSA PRIVATE KEY-----

        MDcCAQACBwNeIm8b7bkCAwEAAQIHAPfq8fZg4QIEAdutBQIEAc/8JQIEANpH6QID

        P5cZAgQAtovS

        -----END RSA PRIVATE KEY-----

        [root@localhost sh]# 

    ②、生成公钥:从私钥中提取。

        [root@localhost sh]# openssl rsa -in /a.key -pubout     //-in:指定从哪个文件提取公钥,-pubout:提取并展示出

        writing RSA key

        -----BEGIN PUBLIC KEY-----

        MCIwDQYJKoZIhvcNAQEBBQADEQAwDgIHA14ibxvtuQIDAQAB

        -----END PUBLIC KEY-----

        [root@localhost sh]# 

    ------------------------------------------------------------------------------------------------------    

     linux系统上随机数生成器:

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

        /dev/urandom:从熵池中返回随机数,随机数用尽,会利用软件生成伪随机数,不阻塞进程。但是这中不安全。

    

        熵池中随机数来源:

            ①、硬盘I/0中断时间间隔

            ②、键盘I/O中断时间间隔      

   

10.4、CA创建

    CA有两种类型:公共信任CA、私有CA。

    

    建立私有CA的方法:openssl命令、openca命令

    

    CA的配置文件:[root@localhost sh]# cat /etc/pki/tls/openssl.cnf 

    

 构建私有CA步骤:

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


 私有CA配置示例:

   ①、生成密钥放在/etc/pki/CA/private/目录下 ,文件名必须为/etc/pki/tls/openssl.cnf中配置的名称。       

    [root@localhost CA]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 40)

    [root@localhost CA]# ls /etc/pki/CA/private/ -l   //确保生成的密钥文件的权限为600

    total 4

    -rw-------. 1 root root 132 Feb  3 10:21 cakey.pem

    [root@localhost CA]# 

  

 

   ②、生成自签证书(发送申请证书申请):按配置文件要求配置(certificate = /etc/pki/CA/cacert.pem )

        req:证书请求及证书生成工具。

   [root@localhost private]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365

    Country Name (2 letter code) [XX]:cn

    State or Province Name (full name) []:beijing

    Locality Name (eg, city) [Default City]:beijing

    Organization Name (eg, company) [Default Company Ltd]:magedu

    Organizational Unit Name (eg, section) []:ops

    Common Name (eg, your name or your server's hostname) []:www2.stux.com  //此处要写成客户端访问的服务的主机信息,

    Email Address []:

    命令解释:

        -new:生成新证书签署请求

        -x509:生成自签格式证书,专用于创建私有CA时,此处如果不自签,不需要加此项,但是自签,必须要写此项

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

        -out:生成的请求文件路径;如果自签操作将直接生成签署过的证书

        -days:证书的有效时长,单位是days。


    ③、为ca提供所需要的目录(certs 、crl、 newcerts和文件(serial、index.txt),如果这几个个文件不存在 则需要手工创建

    [root@localhost CA]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}

    [root@localhost CA]# touch  /etc/pki/CA/{serial,index.txt}    //serial:证书序列号,index.txt:证书数据库   

    [root@localhost CA]# echo 01 > /etc/pki/CA/serial   //写入一个证书序列号。

 至此,私有ca创建完成。


要用到证书进行安全通信的服务器,需要向CA请求签署证书,比如https服务器,步骤如下:

    ①、用到证书的服务器主机生成私钥(以https主机为例)

    [root@localhost CA]# mkdir /etc/httpd/ssl 

    [root@localhost CA]# cd /etc/httpd/ssl

    [root@localhost ssl]# (umask 077;openssl genrsa -out httpd.key 2048)

    ②、用到证书的服务器主机生成证书签署请求:(因为不是自签,所以不用加-x509)

    [root@localhost ssl]# openssl req -new -key httpd.key -out httpd.csr -days 365 

    ③、将请求通过可靠方式发送给ca主机,在CA主机上进行签署。由于是在同一台主机上,因此,直接签署。

    [root@localhost ssl]# openssl ca -in httpd.csr -out /etc/pki/CA/httpd.crt -days 365

    Using configuration from /etc/pki/tls/openssl.cnf

    Check that the request matches the signature

    Signature ok

    Certificate Details:

            Serial Number: 1 (0x1)

            Validity

                Not Before: Feb 7 23:22:12 2018 GMT

                Not After : Feb 7 23:22:12 2019 GMT

            Subject:

                countryName = cn

                stateOrProvinceName = beijing

                organizationName = magedu

                organizationalUnitName = ops

                commonName = www.magedu.com

            X509v3 extensions:

                X509v3 Basic Constraints:

                    CA:FALSE

                Netscape Comment:

                    OpenSSL Generated Certificate

                X509v3 Subject Key Identifier:

                    93:33:80:F7:C5:12:6E:2A:22:92:E4:0C:70:56:00:D5:C4:76:6E:70

                X509v3 Authority Key Identifier:

                    keyid:77:55:41:C6:1D:5E:77:43:F8:9E:C0:2E:67:75:87:F4:2F:FE:0E:CC


    Certificate is to be certified until Feb 7 23:22:12 2019 GMT (365 days)

    Sign the certificate? [y/n]:y



    1 out of 1 certificate requests certified, commit? [y/n]y

    Write out database with 1 new entries

    Data Base Updated

    [root@localhost ssl]#

    ④、查看证书信息:(可以在ca和客户机上查看,只要有ca的主机都可以查看)

    [root@localhost ssl]# cat /etc/pki/CA/index.txt

    V 190207232212Z 01 unknown /C=cn/ST=beijing/O=magedu/OU=ops/CN=www.magedu.com

    [root@localhost ssl]#

  或 [root@localhost CA]# openssl x509 -in httpd.crt -noout -serial -subject

    serial=01

    subject= /C=cn/ST=beijing/O=magedu/OU=ops/CN=www.magedu.com

    [root@localhost CA]#

    ⑤、将CA签署过的证书发送给请求的服务器。由于是本机签署,所以不发送,拷贝签署的证书到指定位置。注意:此时的httpd.csr(请求签署文件)可以删除了

    [root@localhost CA]# cp /etc/pki/CA/httpd.crt  /etc/httpd/ssl/    

    

10.5、吊销证书:一般私有ca搭建,不用吊销,如果要吊销,一般会用openca工具实现。

    ①、客户端获取要吊销证书的serial(序列号),(在使用证书的主机上执行)

    [root@localhost ssl]# openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject

    serial=01

    subject= /C=cn/ST=beijing/O=magedu/OU=ops/CN=www.magedu.com

    [root@localhost ssl]#

    ②、CA端主机吊销证书

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

    [root@localhost ssl]# openssl ca -revoke /etc/pki/CA/newcerts/01.pem

    Using configuration from /etc/pki/tls/openssl.cnf

    Revoking Certificate 01.

    Data Base Updated

    [root@localhost ssl]#

    ③、生成吊销证书编号(第一次吊销证书时执行)

    [root@localhost ssl]# echo 01 > /etc/pki/CA/crlnumber

    ④、更新证书吊销列表

    [root@localhost CA]# openssl ca -gencrl -out thisca.crl

    ⑤、查看crl文件:

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