Jusene's Blog

安全基础及openssl的使用

字数统计: 2.8k阅读时长: 10 min
2017/03/12 Share

安全

就目前的网络的现状,我们首先需要保障的是在整个网络通信过程中的数据机密性,完整性和可用性,然而目前对网络安全的重视,能够进行通信就已经很了不起的早期协议对于今天来说已经远远不够看了。

威胁

  • 机密性:保证数据机密性,隐私性。
    面临直接威胁:监听,数据分析,破解等

  • 完整性:不可篡改,数据完整性,系统完整性。
    面临直接威胁:篡改,假冒,否认等

  • 可用性:服务可用,可扩展性。
    面临直接威胁:拒绝服务(ddos)

安全机制

加密、数字签名、访问控制、数据完整性、认证交换、流量填充、路由控制、公证

安全服务

认证
访问控制
数据保密性
链接保密性
无连接保密性
选择域保密性
流量保密性
数据完整性
不可否认性

管理基本原则

使用成熟的安全系统
以小人之心输入数据
外部系统是不安全的
最小授权
减少外部接口
缺省使用外部接口
缺省使用安全模式
安全不是似是而非
从stride思考
在入口处检查
从管理上保护好你的系统

常用安全技术

认证 授权 安全通信 审计

加密算法

对称加密算法

加密和解密使用同一个秘钥

常见的对称加密算法:DES,3DES,AES,IDEA,RC6,CAST5

特性:

  • 加密、解密使用同一密钥,效率高
  • 将原始数据分隔成固定大小块,逐个进行加密

缺陷:

  • 密钥过多
  • 密钥分发难
  • 数据来源无法确定

公私钥加密

密钥成对出现

公钥:公开所有人:public key
私钥:自己留存,必须保证其私密性,secret key

特性:

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

功能:

  • 数字签名:主要在于让接受方确认发送方身份
  • 对称密钥交换 :发送方用对方的公钥加密一个对称密钥后发送给对方
  • 数据加密:适合加密较小的数据

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

算法:RSA(加密、数字签名) DSA(数字签名)

单向加密

将任意数据缩小成固定大小的“指纹”

特点:

  • 任意长度输入
  • 固定长度输出
  • 雪崩效应
  • 无法从指纹中重新生成数据(单向)

功能:数据完整性

常见算式:
md5:128bits 、sha1:160bits、 sha224、sha256、sha384、sha512

安全协议

如网站中我们常见https开头的uri,这里我们就使用了ssl/tls协议:

  • SSL:Secure Socket Layer 安全套接字层协议,由Netscape公司在1994年发布
  • TLS:Transport Layer Security 传输层安全协议 由IETF在1999年发布,与SSL基本兼容

因为ssl3.0协议发现安全漏洞,如谷歌等大型应用已经将ssl协议列入不安全协议,但ssl协议在互联网使用了如此之久,也不是一朝一夕就可以改变的,但未来tls将是绝对的主流。

简述数据包加密

SSL会话三步曲:

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

– 第一阶段: ClientHello
客户端支持的协议版本,加密算法,压缩算法等
并生成一个随机数,用于之后生成的“会话密钥”

– 第二阶段: ServerHello
确认使用的协议版本,加密算法等,也生成一个随机数,用于之后的“会话密钥”
并向客户端发送服务器证书

– 第三阶段:
客户端验证服务器证书(发证机构,证书完整性,证书持有者,证书有效期,吊销列表),在确认无误后取出其公钥
发送一个随机数,编码变更通知,客户端握手结束通知给服务器

– 第四阶段
收到客户端发来的随机数,计算生成本次会话用到的“会话密钥”
发送编码变更通知,服务器握手结束通知给客户端

SSL/TLS

以下是一个数据包如何通过SSL/TLS加密传输数据的过程:

  • 第一步:他们需要实现协商好对称加密算法,单向加密算法,公钥加密算法,交换公钥等。
  • 第二步:B用户想要将数据传给A,首先需要使用单向加密算法取出数据的特征码,并用自己的私钥对这段特征码进行加密(数字签名),B用户生成临时对称密钥,并用对称密钥加密整段数据,B用户使用 A用户的公钥加密一次性对称密钥,附加在整段数据后面,并将整段数据发送给A用户。
  • 第三步:A用户使用自己的私钥来解密被加密的对称密钥,用对称密钥解密整段加密的内容,用用户B的公钥解密数字签名,如果解得开,数据来源得到验证,获取特征码与用户A使用相同的单向加密算法获取整段数据的特征码进行比较,如果相同,数据的完整性得到保证。

以上的过程看似可靠,但是却存在风险,用户名A与用户B未见过面,如果双方在交换公钥等信息过程中,用户C对A伪装成B,对B伪装成A, 所有的数据都经过C, 这就是中间人攻击。所以我们需要第三方可信机构来保障这个过程的实现,CA 就诞生了。

CA是证书颁发机构,是用户都认可的公信机构,整个通信的过程就交换公钥的环节可以被伪装,所以在交换公钥的过程中双方的公钥都需要被CA签署,双发交换公钥的过程,用户还需要通过CA来验证证书,如果通过双方都认可的CA的证书签署机构签署的证书验证成功(数字签名),才认为这是对方的公钥。然而这双发又要怎么来验证这证书,当然是通过CA的公钥来验证这签署的证书,所以获取CA的公钥也就起到了至关重要的环节,我们还需要验证这个CA是否是我们请求的CA,CA会给自己签署一个证书来确保CA是正确的,而CA的公钥已经基本在安装操作系统就存在了。

这一套体系也就成就现在互联网的基础:
PKI:public key infrastructure

  • 签证机构:CA
  • 注册机构: RA
  • 证书吊销列表:CRL
  • 证书存取库

OpenSSL

openssl是这套体系的开源实现方式,当然免费也就无第三方机构来保证ca可信,需要自己来保证ca体系,我们可以来实现ca,如果需要测试我们只要使用openssl就可以了,如果需要自己内部局域网实现ca,建议可以使用openca,虽然使用的还是openssl。

openssl 三大组件

  • openssl:多用途的命令行工具
  • libcrypt:加密算法库
  • libssl: 加密模块应用库,实现ssl/tls

据说目前80%网上使用的ssl/tls都是采用了openssl来实现的,所以前段时间曝出的openssl心脏滴血漏洞,真是为了整个互联网捏了一把汗了,但是openssl被一个开源项目组维护着,漏洞还是可以被修复的。

openssl

enc命令

加密:openssl enc -e -des3 -a -salt -in fstab -out fstab.chip

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

  • -e 加密

  • -d 解密

  • -a base64位显示,默认二进制

  • -salt 加入杂质

  • -des3 对称加密算法

单向加密

openssl dgst

dgst命令:

  • openssl dgst -md5 /PATH/TO/SOMEFILE

生成用户密码

工具:passwd,openssl passwd

openssl passwd -1 -salt SALT
不支持sha256,linux系统的默认加密算法,但是linux md5也是支持的

如果我们想要使用系统默认的加密算法来加密密码,可以使用:

1
pip  install passlib
2
python2.7 -c "from passlib.hash import sha512_crypt;import getpass;print(sha512_crypt.encrypt(getpass.getpass()))"

生成随机数

openssl rand

openssl rand -hex num
openssl rand -base64 num

公钥加密

加密解密:
算法:rsa,ELGamal
工具:openssl rsautl,gpg
数字签名:
算法:rsa,dsa,elgamal
工具:
密钥交换:
算法: DH

openssl genrsa num 生成私钥

1
(umask 077;openssl genrsa -out /path/to/privite num_bits(2的次方))
2
提出公钥:openssl rsa -in /path/to/privite -pubout

Linux系统的随机数生成器

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

熵池中随机数的来源:

  • 键盘io中断时间间隔
  • 硬盘io中断时间间隔

openssl配置私有CA:

配置文件:/etc/pki/tls/openssl.cnf
构建私有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:证书的有效时长,单位是天
  • (3)为CA创建所需要的目录或文件
    mkdir /etc/pki/CA/{certs,crl,newcerts}
    touch /etc/pki/CA/{serial,index.txt}
    echo 01> /etc/pki/CA/serial

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

步骤:

  • (1)用到的证书饿主机生成证书签署请求
    (umask 077;openssl genrsa -out httpd.key 2048)
  • (2)生成证书签署请求
    openssl req -new -key httpd.key -out httpd.csr -days 365
  • (3)将请求通过可靠方式发送给ca证书
  • (4)签署证书
    openssl ca -in httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
  • (5)查看证书中的信息
    openssl x509 -in httpd.crt -noout -serial -subject

吊销证书: 步骤:

  • (1)客户端获取要吊销的证书的serial(在使用的证书的主机执行)
    openssl x509 -in httpd.crt -noout -serial -subject
  • (2)CA主机吊销证书
    先根据客户提交的serial和subject信息,对比其与本机数据库index.txt 中存取的是否一致
    吊销:
    openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
  • (3)生成吊销证书的吊销编号(第一次吊销证书的时候执行)
    echo 01 > /etc/pki/CA/crlnumber
  • (4)更新证书吊销列表
    openssl ca -gencrl -out thisca.crl

查看crl文件
openssl crl -in /path/to/crl_file -noout -text

CATALOG
  1. 1. 安全
    1. 1.1. 威胁
    2. 1.2. 安全机制
    3. 1.3. 安全服务
    4. 1.4. 管理基本原则
    5. 1.5. 常用安全技术
  2. 2. 加密算法
    1. 2.1. 对称加密算法
    2. 2.2. 公私钥加密
    3. 2.3. 单向加密
  3. 3. 安全协议
    1. 3.1. 简述数据包加密
  4. 4. OpenSSL
    1. 4.1. openssl 三大组件
    2. 4.2. openssl
      1. 4.2.1. enc命令
      2. 4.2.2. 单向加密
      3. 4.2.3. 生成用户密码
      4. 4.2.4. 生成随机数
      5. 4.2.5. 公钥加密
      6. 4.2.6. Linux系统的随机数生成器
    3. 4.3. openssl配置私有CA: