CA和证书

使用gpg实现对称加密

**实验:在主机A和主机B之间实现对称加密传输数据**
gpg -c file
scp file IP(将文件传输到另一台主机上)
在另一台主机上解密(与加密使用同一个密码)
    gpg -d file

使用gpg实现非对称加密

**实验:在主机A和主机B之间实现非对称加密传输数据**
1、现在客户端B上生成公钥:
    gpg --gen-key
    按步骤操作即可生成密钥对,放在家目录下的.gnupg目录下
2、将公钥导出
    gpg -a --export -o /data/msqpunkey
    此时公钥以文本形式导入到/data目录下
3、将导出的公钥传送到主机A
    scp key IPA/data
4、在主机A上生成密钥对,方法如上1。
5、将主机B传过来的公钥导入
    gpg --import /data/msqpubkey
6、对文件file进行加密(使用主机B的公钥)
    gpg -e -r lovey(此处指定的是公钥对应的uid) f1
    将加密后的文件传输给B
    scp f1.gpg IPB:/data
7、在主机B进行解密操作
    gpg -o f1 -d f1.gpg
8、删除本机上其余主机的公钥
    gpg --delete-keys lovey
    如果要删除本机的公钥,需要先删除本机的私钥
        gpg --delete-secret-keys lovem
        gpg --delete-keys lovem

上述方法采取非对称加密的方式存在重大安全隐患:中间人攻击。那么如何解决这个问题呢:

CA和证书

建立私有CA,并实现证书申请

1、在服务器上建立私有CA
    cd /etc/pki/CA
    (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
    openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
    touch index.txt
    echo 00 > serial
2、在客户端申请证书
    (umask 077;openssl genrsa -out app.key 1024)
    openssl req -new -key app.key -out app.csr
    scp app.csr 服务器IP:/etc/pki/CA/z
3、在服务器上颁发证书
    openssl ca -in app.csr -out /etc/pki/CA/certs/app.crt -days 1000
    scp /etc/pki/CA/certs/app.crt 客户端:
4、脚本实现
    creat_ca.sh
    request_crt.sh

tls协议和openssl工具

HTTPS:http协议经过tls协议加密。
HTTPS工作原理:
    1、客户端向HTTPS服务器发送请求
    2、服务器回应证书(被CA签过名的公钥,CA信息等)
    3、客户端检查证书(拿CA的公钥解密,要争有效期等)
    4、检查如果没通过会发出警告信息,检查通过后客户端生成一个随机key(秘钥),并用服务器的公钥加密key,发送给服务器
    5、服务器用自身私钥解密解密客户端发送的随机key,并用此key加密之后的传输数据。

OpenSSL

OpenSSL是一个开源项目,由三个组件组成

1
2
3
OpenSSL:多用途的额明航工具,由openssl包提供
libcrypto:加密算法库,由openssl-libs提供
libssl:加密模块应用库,实现了ssl及tls,由nss包提供

openssl命令:
两种运行模式:
交互模式
批处理模式
标准命令,消息摘要命令,加密命令
标准命令:enc,ca,req,…

1
2
3
4
openssl实现对文件的对称加密:
openssl enc -e -des3 -a -salt -in input-file -out output-file
解密
openssl enc -d -des3 -a -salt -in input-file -out output-file
1
2
3
openssl生成用户密码:
openssl passwd -1 -salt SALT(最多8位)
openssl passwd -1 -salt centos
1
2
3
openssl生成随机数:
openssl rand -base64|-hex NUM
NUM:表示字节数,使用-hex,每个字符为16进制,相当于4位二进制,出现的字符数为NUM*2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
利用openssl生成秘钥对
生成私钥
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS
(umask 077;openssl genrsa -out test.key -des3 2048)
将加密key解密:
openssl rsa -in test.key -out test2.key
从私钥中提取公钥
openssl rsa -in PRIVATEKEYFILE -pubout -out PUBLICKEYFILE
利用公钥进行加密
openssl rsautl -encrypt -in file -inkey test_pub.key -pubin -out file.en
-in指定要加密的文件,-inkey指定密钥,-pubin表明是用纯公钥文件加密,-out为加密后的文件。
利用公钥进行解密
openssl rsautl -decrypt -in file.en -inkey test.key -out file.de
-in指定被加密的文件,-inkey指定私钥文件,-out为解密后的文件
1
2
3
4
随机数生成器:伪随机数
键盘和鼠标,块设备中断
/dev/random:仅从熵池中返回随机数;随机数用尽,阻塞
/dev/urandom:从熵池中返回随机数;随机数用尽,会利用软件生成为随机数,非阻塞