Linux 第32天 openssl 私有CA

时间: 20180821


目录

OpenSSL

常见的加密算法和协议

一次加密通信过程

数字证书

Openssl命令

使用Openssl构建私有CA



OpenSSL

SSL (Secure Socket Layer)安全的套接字协议,主要用于传输数据的加密。 

OpenSSL是SSL协议开源形式,是广泛使用的商业及SSL工具。

OpenSSL也是一种命令行工具。

常见的加密算法和协议

1 对称加密 加密和解密使用同一个密钥,依赖于算法和密钥,但其安全性依赖于密钥而非算法

常见的算法

DES: Data Encryption Standard, 56bits

3DES

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

Blowfish

Twofish

IDEA

RC6

CAST5

特性 加密、解密使用同一密钥

将明文分隔成固定大小的块,逐个进行加密

2 非对称加密 采用的是公钥加密方法,当然还需要另一个密钥来解密,这个密钥称之为私钥

两者统称为密钥对儿

私钥: Secret Key 仅允许个人使用

公钥: Public Key 公开给所有人获取

公钥是从私钥中提取而来,使用公钥加密的数据,

只能使用与此公钥配对的私钥解密,反之亦然。

用处: 身份认证,密钥交换,数据加密

算法: RSA DSA ELGamal

特性: 密钥长度较大,例如512bits,2048bits,4096bits

  加密解密分别使用密钥对儿中的密钥相对进行

  常用于数据签名和密钥交换

3 单向加密 只能加密,不能解密,主要是提出数据的特征码

特性:定长输出,不论原来的数据是多大级别,其加密结果长度一样

雪崩效应,原始数据微小改变,将会导致结果巨大变化

不可逆

算法:

MD5 128bits定长输出

SHA1 160bits定长输出

SHA256 

SHA512

SHA384

SHA512

CRC32

用处: 数据完整性校验,系统账号密码校验

4 密钥交换 IKE (Internet Key Exchange)

双方通过交换密钥来实现数据加密解密



一次加密通信过程

发送者

1 使用单向加密算法生成数据的特征码(数据完整性验证)

2 使用自己私钥加密特征码,附加在数据后面(身份验证)

3 生成用于对称加密的临时密钥

4 用此临时密钥加密数据和已经使用私钥加密后的特征码

5 使用接收方的公钥加密此临时密钥,附加在对称加密后的数据后方(数据传输保密性)

接收者

1 使用自己的私钥解密加密的临时密钥,从而获得对称密钥

2 使用对称密钥解密对称加密的数据和私钥加密的特征码密文;

  从而获得数据和特征码密文

3 使用发送方的公钥解密特征码密文,从而获得从计算生成的特征码

4 使用与对方同样的单向加密算法计算数据的特征码,并与解密而来的进行比较


数字证书

双方通讯过程中,数据的加密解密依赖于对方的公钥,因此就需要一种可靠机制能够保证

公钥数据的安全性,即如何来确认此公钥就是你所要通信主机的公钥。这就是CA,CA是一

个证书颁发机构,当双方要建立通信时,都需要找一个大家都认同的CA机构申请证书,当

双方都申请证书后,要通信时则在通信之前互相交换自己的证书,然后把证书拿CA机构的

公钥解密如果可以解密则表示确实是要通信的主机


CA只是PKI(Public Key Infrastructure公钥基础设施)的一个组成部分

PIK包含

CA 签证机构 相当于办理×××时的公安局(真正颁发证件的机构)

RA 注册机构 相当于办理×××的派出所(帮你拍照信息录入的机构)

CRL 证书吊销列表 相当于我们证件丢失时挂失的内容

证书存取库 当别人去请求认证时的资料库

数字证书的格式(x.509 v3) 由以下几部分:

版本号version

序列号serial number CA用于唯一标识此证书

签名算法标志Signature algorithm identifier

发行者的名称 CA自己的名称

有效期 两个日期,起始日期和终止日期

证书主体名称: 证书拥有者自己的名字

证书主体公钥信息: 证书拥有者自己的公钥

发行商的唯一标识

证书主体的唯一标识

扩展信息

签名: CA对此证书的数字签名



Openssl命令

openssl是ssl的一个开源项目,由三部分组成

openssl 多用途命令行工具,每种功能都使用专用的子命令来实现

libcrypto 加密、解密库文件

libssl ssl协议实现


openssl命令

子命令分类: 标准命令、消息摘要命令、加密解密相关命令


加密文件(对称加密)

算法: des, 3des, aes, blowfish, idea, cast5

工具: openssl enc, gpg


enc工具:

openssl enc -e -CIPHERNAME -in /PATH/FILE -out /PATH/enc_FILENAME

openssl enc -d -CIPHERNAME -in /path/cipherfile -out /path/file

上述两种是一个加密文件一个解密文件


单向加密(提取数据的特征码)

算法: md5 sha1

工具: openssl dgst, md5sum, sha{1,224,256,384,512}sum

openssl dgest filename

如 openssl sha1 abc.txt

MAC 消息认证码,单向加密的一种延伸应用,用于实现在网络通信中保证

所传输数据的完整性


生成用户密码

openssl passwd -l -salt 8bits 随机数


生成随机数

openssl rand <-hex|-base64> NUM


公钥加密

工具: gpg, openssl rsautl

数字签名: RSA, DSA, ELGanmal

DSA: Digital Signature Algorithm

DSS: Digital Signature Standard

密钥交换:

公钥加密,DH

生成密钥对

操作过程: 生成私钥,从私钥中提取公钥

openssl genrsa -out /path/rsa_key_file

(umask 077;openssl genrsa -out /root/mykey.key)

从私钥中提取公钥

openssl rsa -in /root/mykey.key -pubout > mykys.pubkey


随机数生成器 random 和 urandom

首先说一说熵池的概念,在操作系统上有一个叫做熵池的地方,他是用来保存

中断产生的随机数(每一次硬件中断都会产生一个随机数)

/dev/random 仅从熵池中返回随机数,当熵池中的随机数耗尽时,取随机数的

进程将会被阻塞

/dev/urandom 先从熵池中取随机数,当熵池中的随机数耗尽时,

就通过伪随机数生成器 生成随机数



使用Openssl构建私有CA

1. 生成私钥

2. 生成自签署证书

私钥: 用于签发证书时,向证书添加数字签名使用

证书: 每个通信方都导入此证书"受信任的证书颁发机构"


涉及的配置文件 /etc/pki/tls/openssl.cnf

工作目录 /etc/pki/CA


建立私有CA

生成私钥文件 /etc/pki/CA/private/cakey.pem

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

生成自签证书

# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem 

  -out /etc/pki/CA/cacert.pem -days 365 (与上边是一条命令)

  其中

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

  -key 私钥文件路径,用于提取公钥

  -days N 证书有效时长,单位为天

  -out 输出文件保存位置

  -x509 直接输出自签署的证书文件,通常只有构建CA时用到

提供辅助文件

touch /etc/pki/CA/index.txt

echo 01 /etc/pki/CA/serial

查看自签证书

openssl x509 -text in cacert.pem


给节点颁发证书

1 节点申请证书(注意这个一般已经是另外一台机器了哈)

在证书申请的主机上进行如下步骤

生成私钥

mkdir -p /etc/http/ssl

cd /etc/http/ssl

(umask 077; openssl genrsa -out httpd.key 1024) 

生成证书签署请求

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

csr(Certificate Signing Request)

注意:

其中的subject信息部分,要与CA保持一致

Common Name要使用此主机在通信时真实的名字

把请求发送给CA

如果是现实场景一般是将此请求带到CA机构那边去

2 CA证书签发(此时来到CA的机器上)

验证(查看)请求者信息

openssl x509 -text -in /root/httpd.csr

签署证书

openssl ca -in /root/httpd.csr -out /root/http.crt -days 365

crt (CeRTificate)

把签署好的证书还给请求者


吊销证书

1 获取吊销证书的序列号

openssl x509 -in /root/http.crt -noout -serial -subject

2 实现证书吊销

吊销证书

openssl ca -revoke /root/http.crt

生成吊销证书的编号

echo 01 > /etc/pki/CA/crlnumber

更新证书吊销列表(名字和路径自行定义)

openssl ca -gencrl -out /etc/pki/CA/crl/dev.crl

crl (Certificate Revocation List)

查看被吊销的证书

openssl crl -text -in /etc/pki/CA/crl/dev.crl