网络安全议题,几乎是业内人士避不开的话题,要做到网络安全,主要旨在三个方面的目标:保密性,完整性和可用性。本文在此主要对基础的加密和解密技术,ssl协议,以及ssl协议的实现实例做一些简要描述和梳理。
加密和解密:
目前对于网络安全的攻击,很大部分集中在“威胁保密性的攻击”,也就是我们进场所说的数据泄露,加密和解密是目前最为直观的解决保密性问题的手段。
几种加密方式:
- 对称加密;
特点:加密和解密使用同一个密钥;将数据分割成多个固定大小的块,逐个加密;
缺点:密钥过多(对于服务器端,需要与多人通信);密钥分发困难;
算法:DES,3DES,AES等;
- 非对称加密;
特点:公钥加密的数据,只能够通过与之配对的私钥才能解密;反之亦然;
私钥:secret key,通过工具创建,使用者自己保存,必须要保证私密性;
公钥:pubkey,从私钥中提取而来,可以公开给所有人;
用途:数字签名;密钥交换;数据加密(非对称加密效率低,一般不用作数据加密);
算法:RSA,DSA等;
- 单向加密:
用途:提取数据指纹(特征码),验证数据完整性;只能加密,不能解密;
特点:定长输出,雪崩效应;
算法:md5,sha{1-6}等;
SSL协议和OPENSSL
secure socket layer,安全的套接字层,位于应用层和传输层之间;SSL协议由网景公司在1994年研发,目前已经发展到3.0版本,其与继任者Transport Layer Security,简称TLS都是为网络通信提供保密性和完整性的安全协议。SSL协议的1.0到3.0版本都被发现安全漏洞,所以SSL目前快要淡出,其继任者TLS快要成为事实上的标准了。
OPENSSL:SSL协议的实现。
- 在centos 7 的OPENSSL包中,主要包含三个部分:libcrypto,libssl和openssl。前两者主要为开发者使用,我们最常用的还是openssl。
- SSL handshake protocol:SSL握手的过程;
- 第一阶段:client hello;C端向S端发送;
向S端发送自己所支持的协议版本(如tls 1.2),发送一个随机数(用于生成“会话密钥”),支持的加密算法(如AES,RSA等,便于协商生成会话密钥,可以使用相同加密算法),以及支持的压缩算法;
- 第二阶段:server hello;S端回应;
确认使用的协议版本;S端生成一个随机数(用作生成会话密钥);确认使用何种加密算法;以及发送服务器证书;(假如S端需要验证C端,会有索要C端证书的信息发送到C端);
- 第三阶段:C端握手结束;
验证服务器证书,确认无误后取出公钥(验证发证机构,证书完整性,持有者,有效期,吊销列表等);验证后发送以下信息给S端:一个随机数(用于服务器公钥加密);编码变更通知(表示随后信息会以协商好的加密方法发送);C端握手结束;
- 第四阶段:S端握手结束;
S端受到C端发来的第三个随机数pre-master-key后,计算生成本次会话的“会话密钥”,并向C端发送信息如下:编码变更通知(表示随后信息会以协商好的加密方式发送);S端握手结束;
- 第一阶段:client hello;C端向S端发送;
下面是一个简单的加密传输图示:
(图片可查看附件)
OPENSSL相关命令:标准命令,消息摘要命令,加密命令等;
主要介绍标准命令:enc,ca,req,genrsa;
- 对称加密:openssl enc;
支持算法:3des,aes,blowfish等;
例:openssl enc -e -des3 -a -salt -in fstab -out
fstab.ciphertext;将fstab文件用3des算法加密; - 单向加密(数据特征码):openssl dgst,gpg,md5sum等;
例:openssl dgst -md5 /PATH/TO/SOMEFILE == md5sum /PATH/TO/SOMEFILE;两者算法一致,得到的特征码也是一样的;
生成用户密码:openssl passwd -1 -salt 12345678;-1表示md5算法,-salt可以指定随机数;
生成随机数:openssl rand -base64 NUM;NUM表示字节数;-base64表示文本格式;-hex表示格式为16进制;
- 公钥加密:openssl genrsa
- 算法:RSA(加密解密,数字签名),DH(经常用作密钥交换),DSA(数字签名);
- 生成密钥:
- openssl genrsa 1024;
- openssl genrsa 1024 > /tmp/mykey2.private 1024;重定向到文件中;
- openssl genrsa 1024 -out /tmp/mykey2.private 1024;使用out也可以;
- 经常用法:(usmak 077;openssl genrsa 1024 -out
/PATH/mykey2.private 1024)保证权限为600;
- 提出公钥:
- openssl rsa in /PATH/FROM/PRIVATE_KEY -pubout;
- 系统随机数生成器:
- /dev/random:仅从熵池返回随机数,随机数用尽,就会发生阻塞;
- /dev/urandom:从熵池返回随机数,随机数用尽,会利用软件生成伪随机数,不会阻塞;
PKI:Public Key Infrastructure,公钥基础设施;主要包含以下四个部分:
- 签证机构:CA;
- 注册机构:RA;
- 证书吊销列表:CRL;
- 证书存取库:
自建私有CA;
- 工具有openssl和openCA;此处以openssl为例;
- 构建私有CA:在确定配置为CA的服务器上生成一个自签证书,并为CA提供所需目录文件即可;
- 生成私钥;
- (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
自签证书:CA需要先给自己签发证书;
-
openssl req -new -x509 -key
/etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem
-days 3655;;
如果不是自签证书,不加-x509即可;
-new:生成新证书签署请求;
-key:生成请求时用到的私有文件路径;
-x509:生成自签格式证书,专门用于创建私有CA时使用;
-out:生成的请求文件路径,如果是自签操作将会直接生成签署证书,没有请求这一步;
-days:证书的有效时长,默认单位day;
最后按照提示填好相关信息即可!
为CA提供所需目录及文件;
-
mkdir -pv /etc/pki/CA{certs,crl,newcerts};
- touch /etc/pki/CA{serial,index.txt};
- echo
01 > /etc/pki/CA/serial;
需要用到证书进行安全通信的服务器,需要向CA请求签署证书,步骤如下:
-
生成秘钥:
- mkdir /etc/httpd/ssl
- cd /etc/httpd/ssl
- (umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
生成签署请求:
-
openssl req -new -key http.key -out httpd.csr -days 365;
- 填写相关信息;
- 并把生成的httpd.csr发送到之前创建好的Ca主机上;(使用scp等工具)
私有CA签署证书(这一步由请求的CA操作)
-
openssl ca -in /PATH/TO/httpd.csr -out /etc/pki/CA/certs/httpd.crt
-days 365; - 然后再将生成的证书文件发送给请求的服务器主机即可;
查看证书信息:openssl x509 -in http.crt -noout -serial -subject;-subject指看主要部分内容,-serial指查看序列号;
以上。