网络上实现安全传输是一件非常必要的事情,此篇博文主要介绍一下四种常见的加密解密技术和PKI机制以及如何通过openssl建立私有CA。
一、加密解密技术
(1)对称加密
主要加密算法:
1、DES:Data Encryption Standard 数据加密标准
加密端:将明文划分为64bits为一块,用密钥加密产生64bits的密文
解密端:还原回64bits密文
加密和解密均使用56bits的密钥
2、3DES:Triple DES;也就是进行三次DES加密
3、AES:Advanced Encryption Standard;
高级加密标准;密钥可为128bits,192bits,256bits,384bits
4、Blowfish,使用1-448bits的密钥,将明文划分为64bits的块;
5、Twofish,采用128, 192, 256bits的密钥,将明文划分为128bits的块
6、IDEA,采用128bits密钥,将明文划分为64bits的块;
7、RC6, 256 位密钥和 128位块大小
8、CASTS,64 位块加密, 允许最大 128 位的块大小,使用 128 位密钥
特性:1、加密和解密使用同一个密钥,但是加密和解密算法可能不同;
2、将原始数据分割为固定大小的块,逐个进行加密;
(2)公钥加密
主要加密算法:
1、RSA(既能实现数字签名,又能实现加解密)
2、DSA,digital Signature Algorithm(数字签名标准)
3、ELGamal,既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题
公钥:从私钥中提取的,公开给所有人;
私钥:通过工具创建,使用者自己留存,必须保证其私密性;secret key
特点:用公钥加密的数据,只能适用与之配对的私钥加密;反之亦然;
用途:
数字签名:主要在于让接收方确认发送方的身份;
密钥交换:发送方用对方的公钥加密一个对称密钥,并发送给对方;
数据加密:加密数据成为密文;
(3)单向加密
主要加密算法:
1、md5:Message Digest 5,128bits定长输出
2、sha1:Secure Hash Aigorithm 1,160bits定长输出
又有sha224,sha256,sha384,sha512
特性:即提取数据指纹(特征码),只能加密不能解密,定长输出,雪崩效应
功能:完整性验证。
(4)密钥交换
主要加密算法:
1、公钥加密
有一个风险,密码是在网上传输,有可能会被暴力破解;
2、DH(Deffie-Hellman)
Alice和Bob最终都得到了同样的值,因为在模p下和 相等。注意a, b 和 gab = gba mod p 是秘密的。其他所有的值�C p, g, ga modp, 以及 gb modp �C都可以在公共信道上传递。一旦Alice和Bob得出了公共秘密,他们就可以把它用作对称密钥,以进行双方的加密通讯,因为这个密钥只有他们才能得到。此密钥依赖于大素数;(此段解释出自维基百科)
二、 PKI机制
PKI(Public KeyInfrastructure)即公钥基础设施,它包括:
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库:
X.509v3:定义了证书的结构以及认证协议标准,它包括
证书版本号
证书序列号
数字签名算法ID
发行者名称
证书有效期限
证书主体名称
证书主体公钥
发行者的唯一标识
主体的唯一标识
扩展
发行者的签名:单向加密以上内容项
(1)没有PKI机制的加密通信过程
A要给B加密一段数据发送过去
缺陷:接收方的公钥可能会被人冒充;这个缺陷会引发中间人攻击(man-in-middle)
(2)增加PKI机制的加密通信过程
主要是为了解决公钥的可信问题,增加PKI机制后的通信过程比上述过程增加了验证证书的环节;
验证证书:
当接收方拿到发送方的公钥,会要求发送方发送可信机构为其签署的证书,而后验证证书内容,根据这个验证结果来确定公钥的可信性;
索要证书的过程是基于SSL会话的方式进行的:
SSL会话:
第一阶段:ClientHello:
支持的协议版本。比如tls 1.2;
客户端生成一个随机数,随后用于生成“会话密钥”;
支持的加密算法,比如AES、RSA;
支持的压缩算法;
第二阶段:ServerHello
确认使用的加密通信协议版本,比如tls 1.2;
服务器端生成一个随机数,稍后用于生成“会话密钥”;
确认使用的加密方法;
服务器证书;
(如果服务器需要验证客户端证书则会索要客户端证书)
第三阶段:
验证服务器证书,在确认无误之后取出其公钥;
发送以下信息给服务器:
一个随机数:用于服务器公钥加密;
编码变更通知:表示随后的信息都将用双方商定的加密方法和密钥发送
客户端握手结束通知。
第四阶段:
收到客户端发来的第三个随机数pre-master-key后。计算生成本次会话所用到的“会话密钥”;
向客户端发送如下信息:
编码变更通知:表示随后的信息都将用双方商定的加密方法和密钥发送
服务器握手结束通知。
验证的证书内容:
(1)用CA的公钥解密CA的签名,说明证书的来源可靠。
(2)用同样的加密算法加密证书得到特征码,与解密出的特征码比对,若一致,则完整性可靠;
(3)检查证书的有效期限
(4)验证主体名称是否符合;
(5)检查证书是否被吊销;
三、 OpenSSL介绍和使用openssl创建私有CA
(1)OpenSSL介绍
OpenSSL是SSL协议/TLS协议的开源实现程序,它由三部分组成
libcrypto:通用加密库,提供各种加密函数
libssl:TLS/SSL协议的实现;基于会话实现了身份认证、数据机密性和会话完整性的TLS/SSL库
openssl:多用途命令行工具;
注意:libcrypro和libssl主要是供给开发者使用;在这里我们仅说明一下openssl的使用;
openssl命令
使用格式:openssl command [ command_opts ] [command_args ]
它通过众多的子命令来实现各种不同的功能,子命令分为三类:
标准命令(enc,ca,req,genrsa,passwd,dgst...)可通过openssllist-standard-commands 查看.
消息摘要命令(如md5等子命令)可通过 openssl list-message-digest-commands 查看
加密命令(如des子命令)可通过 openssl list-cipher-commands 查看
注意:由于openssl有众多子命令,所以 man openssl 并不能看到子命令的帮助文档,想要查看子命令的帮助信息,应该先whatis command,然后再man command,
例如:
~]# whatis passwd sslpasswd (1ssl) - compute password hashes passwd (1) - update user's authentication tokens passwd (5) - password file ~]# man sslpasswd
1、常用命令
1> enc 实现对称加密
支持的算法:3des,aes,blowfish,twofish
常用选项:
-in filename:指明需要加密的文件
-outfilename:知名密文输出的文件
-salt:加密时加一点杂质
-e :加密数据
-d :解密数据
-des3... :指明加密算法
-a :使用base64,base64基于64个可打印字符来表示二进制数据。如无此项,加密密文
是乱码
例如:
加密 ~]# openssl enc -e -des3 -a -salt -in test -outtest.crypt 解密 ~]# openssl enc -d -des3 -a -salt -out test -in test.crypt
2> dgst 实现单向加密
dgst命令: openssl dgst -md5 /PATH/TO/SOMRFILE
此处-md5为单向加密算法,此外还有-md2,-md4,-rmd160,-sha,-sha1
3> passwd 生成用户密码
openssl passwd -1-salt SALT
-1:表示MD5算法,目前仅支持md5算法
-salt SALT:SLAT是杂质,一般是随机数。
例如:
~]# openssl passwd -1-salt $(openssl rand -hex 4)
此处说明生成随机数的方法
openssl rand -hex NUM 即可生成一个16进制字符串
例如:
~]# openssl rand -hex 4
4>genrsa 生成私钥
一般使用方法:(umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
其中umask 077保证私钥仅创建者可读;NUM_BITS必须是2的N次方;
例如:
~]# (umask 077;openssl genrsa -out fisrt.pri 512) Generating RSA private key, 512 bit long modulus ...........++++++++++++ ...++++++++++++ e is 65537 (0x10001) ~]# cat fisrt.pri -----BEGIN RSA PRIVATE KEY----- MIIBOgIBAAJBAL3I5YfgHBp6X8LJLXWb4d09hmjpnW0/cO5Hkt45tTaiZtCRnu4v Dt0fLKBNVsirztD4mXR6KHvx91pWAMgNR+kCAwEAAQJAE1UnrJOzyS62Go2Lx/M9 KuBdlMpXcw2HX36DA4g1YX80YJIpEbElUtSAJ1mnm73HU0YBQaW7/+moSsXTgpvW AQIhAPmixZqK8JLkDHmk8OjxOCQzWJFm7uZ0SBcN5v+eUvJRAiEAwp+C8V+hm+DE qj6guba6Qm1B/GixioSb6QZooNIEPhkCIQDIbxTRvPTkPA54LSLxJZy6FC/srwTq LDslp5ftbaWTwQIgGuGlWGl5DOqyv0D/Oid++oXUw2RCgXtnfXwhH3VimKECIAK1 lEloDaB18V+tK9d46JQXZAWBg3s+2oOL/AyjLBah -----END RSA PRIVATE KEY-----
5> rsa 提取公钥
一般使用方法 openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
例如:
~]# openssl rsa -in fisrt.pri -pubout writing RSA key -----BEGIN PUBLIC KEY----- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL3I5YfgHBp6X8LJLXWb4d09hmjpnW0/ cO5Hkt45tTaiZtCRnu4vDt0fLKBNVsirztD4mXR6KHvx91pWAMgNR+kCAwEAAQ== -----END PUBLIC KEY-----
(2)使用openssl创建私有CA(配置文件在/etc/pki/tls/openssl.cnf的[ ca ]段)
概述:在将要被配置为CA的主机上生成一个自签证书,并为CA提供所需要的目录及文件即可
1、在/etc/pki/CA/private/下生成密钥cakey.pem
~]# (umask077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096) Generating RSA private key, 4096 bit long modulus .........................................................++ ..................................................................................++ e is 65537 (0x10001)
2、生成自签证书
~]# openssl req -new-x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 300 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:ShangHai Locality Name (eg, city) [Default City]:ShangHai Organization Name (eg, company) [Default Company Ltd]:OpenHome Organizational Unit Name (eg, section) []:Ops Common Name (eg, your name or your server's hostname) []:centos 7 Email Address []:[email protected]
-x509:自签证书,专用于创建私有CA时;
-new:生成新证书签署请求
-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创建成功。
验证CA服务器颁发证书
以一台web服务器为例,向CA服务器请求一个证书
1、在web服务器所在主机的/etc/httpd目录下新建ssl目录,并在这个目录下生成一个私钥文件
[root@COS6 httpd]#mkdir ssl [root@COS6 httpd]# cd ssl [root@COS6 ssl]# (umask 077;openssl genrsa -out httpd.key 2048) Generating RSA private key, 2048 bit long modulus ........................+++ ...........................................................................................................+++ e is 65537 (0x10001)
2、在web服务器上生成证书签署请求
[root@COS6 ssl]#openssl req -new -key httpd.key -out httpd.csr -days 365 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:ShangHai Locality Name (eg, city) [Default City]:ShangHai Organization Name (eg, company) [Default Company Ltd]:OpenHome Organizational Unit Name (eg, section) []:Ops Common Name (eg, your name or your server's hostname) []:centos 7 Email Address []:[email protected] Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:123456 An optional company name []:tianchao
注意:这一步的信息必须和CA的信息保持一致;
3、将请求通过可靠方式发送给CA服务器,我们这里是测试,所以使用scp工具,但实际使用中建议更安全的方式来传递请求
[root@COS6 ssl]# scphttpd.csr [email protected]:/ ---> 172.16.25.71是CA服务器
4、CA服务器签署web服务器发来的请求
[root@COS7 ~]# openssl ca -in /httpd.csr -out/etc/pki/CA/certs/httpd.crt -days 200 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: Jan 9 15:55:33 2016 GMT Not After : Jul 27 15:55:332016 GMT Subject: countryName = CN stateOrProvinceName = ShangHai organizationName = OpenHome organizationalUnitName = Ops commonName = centos 7 emailAddress = [email protected] X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL GeneratedCertificate X509v3 Subject KeyIdentifier: 70:BE:AA:EB:B8:5E:C0:62:18:8B:D2:8E:A8:AF:9D:70:A8:ED:49:B7 X509v3 Authority KeyIdentifier: keyid:73:4E:41:9A:71:B3:F0:85:26:6E:99:1B:6B:E0:53:96:32:DC:8D:9F Certificate is to be certified until Jul 27 15:55:33 2016 GMT (200 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
注意:CA服务器和客户端的httpd.csr文件在签署请求后都可以删除,以此来保证信息不泄露。
注:此篇博文是在CentOS系统上做的测试