简单罗列基础命令,只分享我的想法!
一、数据加/解密原理说明
客户端双方在互联网上通信,为了保证信息的安全,有了SSL协议,就是在TCP/IP模型传输层之上应用层之下,叫做安全的套接字层。目的就是为了把应用层的数据进行加密传递给客户端,而在Linux上实现这个协议或这个功能的软件就是OpenSSL。
原理其实就是,双方客户端的SSL层进行协商应用哪种加/解密的方式,ok,如果双方SSL达成一致,上层应用协议又通过SSL进行加密的话,那么双方在互联网上传输的数据就是加密的,这个加密之后的数据到达客户端之后,客户端的SSL就会使用相应的“办法”进行数据解密还原,之后交给资源子网(对应的进程)去处理。原理如图1所示。
图1
常见的加密算法和协议:
1、对称加密:加密和机密使用同一种密钥,算法公开,但是密钥只有通信上方才知道,常见的算法有DES(Data Encryption Standard)56bits,AES(AdvancedEncryption)128bits/192bits/256bits/384bits/512bits,blowfish,twofish,IDEA等,如图2。
特点:加解密使用同一种密钥,把数据分割成固定大小的块儿,逐个加密。
权限:和多少客户端通信就有多少密钥,密钥过多,密钥分发也困难。
图2
2、非对称加密:公钥和私钥成对儿出现,公钥是从私钥中提取出来的,私钥仅允许个人使用,公钥公开。常见的算法有RSA(数字签名和密钥交换),DSA(数字签名),ELGamal等。
特性:使用公钥加密的数据只能通过对应的私钥解密,反之亦然,密钥长度较大512bits/2048bits/4096bits/8192bits。
用处:
身份认证:私钥拥有者用自己的私钥加密,只能用相应的公钥解密。
密钥交换:双方通信之前,首先获得对方的公钥,自己生成一个对称的密钥,用对方的公钥加密这个对称的密钥,只能对方的私钥解密,所以,双方采用对称加密就可以了。
数据加密:很少用数据加密,密钥长度太大,效率很低。
3、单向加密:提取数据的特征码。算法有MD5,SHA1,SHA256,SHA512,SHA384。
特性:
定长输出:无论原来的数据是多大级别,其特征码是一样长度的。
不可逆:不能由特征码推算出数据。
雪崩效应:原始数据的微小改变都能使特征码完全不一样。
用处:用于数据完整性校验和数字签名(用私钥加密特征码就是数字签名)。
说了数据如何加密和如何解密,下面说说双方是如何加密数据传输的,对称密钥加密的数据一般用于保密数据,也就是“有心人”根本看不懂,而非对称加密主要是为了做数字签名保证数据的完整性和来源的真实性,所以,首先需要密钥交换(IKE:Internet Key Exchange,主要是通过公钥加密和DH算法),通信的双方都需要知道这个对称密钥才行,假设双方都已经知道了对方的公钥,则要传输的加密的数据应该是如图3。
图3
图3是在双方都知道对方公钥的情况下的传输数据,如果要保证双方的公钥都是对方的,还需要通过数字证书对公钥信息进行安全分发,数字证书(CA签证机构颁发)的格式(X.509 V3)是:
版本号
序列号:CA用于唯一标示此证书。
签名算法标志:验证证书的有效性。
发行者名称:CA自己的名称。
有效期:开始日期和结束日期。
证书主体持有者:即证书所有者。
证书主体公钥信息:证书拥有者自己的公钥。
发行商唯一标示:计算机更容易识别数字。
证书主体唯一标示
扩展信息
签名:CA对此证书的签名。
证书的工作流程如图4所示:
图4
注意:除了查看CA的有效性之后,还要看这个证书是不是过了有效期和是不是在吊销证书列表中。
二、通过OpenSSL实现SSL的命令说明
OpenSSL的组成部分:
(1)、libcrypto:加密、解密文件。
(2)、libssl:SSL协议的实现
(3)、openssl:多用途命令行工具,每种功能都有相应的子命令实现。
OpenSSL分为标准命令,信息摘要命令和加密命令,如图5
图5
对称加密/解密的实现:
openssl enc -ciphername [-in filename] [-out filename] [-d] [-a/-base64] [-salt]
-ciphername:算法,des,aes,3des等。
-salt:加随机数,也就是杂质。
-d:解密。
-e:加密。
-a:基于base64,也就是文本编码格式来处理数据。
例如:对/tmp/passwd文件进行加密,如图6,包括所用的算法,你可以从中选择,前文也已经说了,用到的那些对称加密的算法。
可以把/tmp/passwd文件删除,在把加密的/tmp/passwd.key文件进行解密处理,如图7所示。
图6
图7
文件特征码的提取:
openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-outfilename] [file...]
命令很简单,直接附图8,多次对同一文件提取特征码,特征码是一样的。
图8
公钥加密实现:
(1)、生成不加密的私钥:
openssl genrsa [-out filename] [numbits]
命令很简单,直接附图9。
图9
(2)、从私钥中提取公钥:
openssl rsa [-in filename] [-pubout]
命令简单,直接附图10。
图10
如何构建私有CA,构建私有CA工作目录在/etc/pki/CA:
(1)、生成私钥,如图11;
图11
注意:私钥必须保存在/etc/pki/CA/private这个目录下,并且私钥必须以.pem结尾,这些都是在/etc/pki/tls/openssl.cnf这个配置命令中说明的,部分如图12所示。
图12
(2)、生成自签证书;
openssl req -x509 -key 私钥 -out/etc/pki/CA/cacert.pem -days #(天数),如图13。
图13
验证CA有效性,同一台主机既是CA又是证书的申请者:
(1)、节点申请证书,步骤如下:
A、在申请证书的主机上,生成私钥
B、生成证书签署要求,如图14
openssl req –new –key 生成的密钥 –out 待签发的证书.csr(必须以.csr结尾)
图14
C、把请求发送给CA
(2)、CA签发证书
A、验证请求者信息
B、签署证书,如图15
openssl ca -in 申请的证书.csr -out 获批的证书.crt -days 360
图15
注意:在签署证书的时候会报错,根据提示创建index.txt(证书索引文件)和serial文件(定义接下来颁发证书的序列号),可以看一下配置文件,上文我已经说了。
C、把签署好的证书发给申请者
吊销之前颁发的证书(就是httpd.crt):
获取吊销证书的序列号和index.txt做比较
openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject
吊销证书:
openssl ca -revoke /etc/httpd/ssl/httpd.crt(发过来要吊销的证书)
生成吊销证书的编号
echo 01 > crlnumber(没有自己创建)
更新证书吊销列表
openssl ca -gencrl -out diaoxiao.crl(没有可以自己创建)
注意:只附上吊销的一个截图,对比/etc/pki/tls/openssl.cnf添加缺少的文件即可。
图16
有志同道合的“战友”可以加我qq:865765761。