您的位置:首页 > 运维架构

加密/解密&利用OpenSSL构建私有CA

2015-07-15 21:00 288 查看
在互联网安全及个人隐私状况日益严峻的今天,加密技术变得尤为重要并且不可或缺。在密码雪中,加密是指将明文信息隐匿起来,使之在缺少特殊信息时不可读。本文所讲的主要是在互联网传输数据时所用的加密方式。我们都知道OSI&TCP/IP网络参考模型,通常我们会把这两个模型分为通信子网和资源子网两部分,但是在构建网络的初期,信息从发送端送达到接受端都非常困难所以在设计模型之初并没有考虑过多的安全因素,以至于通信子网和资源子网都没有涉及到数据加密的内容。为了解决这个问题,网景公司在资源子网和通信子网之间添加了半层协议,早期就叫做SSL层,现在叫做TSL。
传输层安全协议(英语:Transport Layer Security,缩写为 TLS),及其前身安全套接层(Secure Sockets Layer,SSL)是一种安全协议,目的是为互联网通信,提供安全及数据完整性保障。在网景公司(Netscape)推出首版Web浏览器的同时提出SSL,IETF将SSL进行标准化,1999年公布了 TLS标准文件。
在实现数据安全通信时我们必须要考虑这几个方面:明文加密/解密、数据完整性校验、不可否认性。根据这几个要求我们一般把加密技术分为三种类型:对称加密、非对称加密(公钥机密)、单向加密(离散函数)。不过非对称加密也能完成单向加密的功能。对于这几种加密技术我简单的介绍一下。
对称加密:即加密解密时使用相同的密钥,加密解密速度较快,但是在一对多的环境下密钥本身的安全性不高。常见的对称加密算法有DES、3DES、AES、Blowfish、IDEA、RC5、RC6。
非对称加密:在这种密码学方法中,需要一对密钥,一个是私人密钥,另一个则是公开密钥。这两个密钥是数学相关,用某用户密钥加密后所得的信息,只能用该用户的解密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个的秘密性质。称公开的密钥为公钥;不公开的密钥为私钥。公钥加密主要应用在密钥交换(将对称加密的密钥使用私钥机密后传输给对方,对方使用公钥解密)、身份认证(公钥和私钥必须是成对,所以使用其中一个密钥加密后的数据只有另一个密钥可以解密)、加密数据等方面,但是公钥一般长度很长用于加密数据的话会相当消耗资源。常见的算法有:RSA、DSA、ELGamal。
单向加密:这种方式其实使用用哈希函数对一段特定的数据进行计算,会得出一串特征码,并且是不可逆的,这段特征码类似于"指纹"信息,只要是使用的哈希算法相同,那么对同一段数据不管计算多少次所产生的特征码总是相同的,如果原始数据发生了变化哪怕是及其细微的,那么特征码也会发生巨大的变化,这种现象叫做雪崩效应。所以可以实现数据的完整性校验。常见的算法有:MD5、SHA家族。
了解了以上的加密技术那么我们在互联网中的安全通信可以用以下的步骤来描述:
1.Alice 准备好要传送的数字信息(明文); 2.Alice 对数字信息进行哈希运算,得到一个信息摘要; 3.Alice 用自己的私钥对信息摘要进行加密得到 Alice 的数字签名,并将其附在数字信息上; 4.Alice 随机产生一个加密密钥,并用此密码对要发送的信息进行加密,形成密文; 5.Alice 用 Bob 的公钥对刚才随机产生的加密密钥进行加密,将加密后的 DES 密钥连同密文一起传送给Bob; 6.Bob 收到 Alice 传送来的密文和加密过的 DES 密钥,先用自己的私钥对加密的 DES 密钥进行解密,得到 Alice随机产生的加密密钥; 7.Bob 然后用随机密钥对收到的密文进行解密,得到明文的数字信息,然后将随机密钥抛弃;当也可以继续使用这个对称密钥完成之后的通信。 8.Bob 用 Alice 的公钥对 Alice 的数字签名进行解密,得到信息摘要; 9.Bob 用相同的哈希算法对收到的明文再进行一次哈希运算,得到一个新的信息摘要; 10.Bob 将收到的信息摘要和新产生的信息摘要进行比较,如果一致,说明收到的信息没有被修改过。 在这里再补充一点关于密钥交换的另一种算法,及D-H算法。简单来说就是通信双方各找一个大素数对它进行幂运算,在现在的数学运算模型上想对它进行开根运算是非常难的。利用一系列的数学计算来完成密钥交换:
两个素数分别为P,G
A的私有数字X
P^X%G à 将此数字传递给B
(P^Y%G)^X=P^XY%G 此数字即为密钥
B的私有数字Y
P^Y%G à 将此数字传递给A
(P^X%G)^Y=P^XY%G 此数字即为密钥
这种方式产生的密钥不会在网络上传输并且只有A和B两个认知到。
如果细心的朋友就会发现在数据加密通信的过程中有一环是有漏洞的,即通信双方如何安全的获取到对方的公钥,或者说如何确认对方的确是对方而不是第三方伪装的。为了解决这个问题就需要用到CA了。
数字证书认证机构(英语:Certificate Authority,缩写为CA),也称为电子商务认证中心、电子商务认证授权机构,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
CA会为没个需要使用公开密钥的用户颁发一个数字证书,以证明此用户就是其本人,并在互联网中得到公认。有些朋友可能会想到那CA自己呢?需不需要认证?答案是:需要。CA在给别人颁发证书之前会先给自己颁发一个自签证书并公开到互联网以证明自己就是自己。再有写朋友会想到,如果CA自己造假呢?怎么办?答案是:没办法,我们只能信任他,好在互联网上公认的几个CA都可信。所以说这世界上没有绝对的安全。
证书实际是由证书签证机关(CA)签发的对用户的公钥的认证。证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。目前,证书的格式和验证方法普遍遵循X.509 国际标准。
数字证书的格式(x.509 v3):
版本号(version)
序列号(serial number):CA用于惟一标识此证书;
签名算法标志(Signature algorithm identifier)
发行者的名称:即CA自己的名称;
有效期:两个日期,起始日期和终止日期;
证书主体名称:证书拥有者自己的名字
证书主体公钥信息:证书拥有者自己的公钥;
发行商的惟一标识:
证书主体的惟一标识:
扩展信息:
签名:CA对此证书的数字签名;
证书只颁发是不够的,它需要的组成有签证机构:CA、注册机构:RA、证书吊销列表:CRL、证书存取库。完成这一列工作的叫做PKI。
公开密钥基础建设(英语:Public Key Infrastructure,缩写:PKI),又称公开密钥基础架构、公钥基础建设、公钥基础设施或公钥基础架构,是一组由硬件、软件、参与者、管理政策与流程组成的基础架构,其目的在于创造、管理、分配、使用、存储以及撤销数字证书。
想在互联网上拥有自己的数字证书需要向CA申请,并且要付出一定的金额,如果仅想在自己的公司内部使用安全通信机制那么我们可以建立私有CA给我们内部的主机或用户颁发证书,而建立私有CA我们需要用到OpenSSL工具。openssl的组成部分:libcrypto:加密、解密库文件;libssl: ssl协议实现;openssl:多用途命令行工具,每种功能都使用专用的子命令来实现。
建立私有CA:
建立私钥

[root@bogon ~]# (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
生成自签证书



客户端申请证书
此处我们给web服务器颁发证书以便之后使用https服务



将证书签署请求发送给CA服务器



CA服务器签署web服务器证书

[root@bogon CA]# openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 2 (0x2)
Validity
Not Before: Apr 25 15:31:15 2015 GMT
Not After : Apr 24 15:31:15 2016 GMT
Subject:
countryName               = CN
stateOrProvinceName       = HA
organizationName          = CzcEdu
organizationalUnitName    = Web
commonName                = www.czcedu.com
emailAddress              = webadmin@czcedu.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
77:B6:3E:D4:7C:05:A2:34:2B:CF:E1:82:79:81:03:FD:7A:97:8E:F8
X509v3 Authority Key Identifier:
keyid:B4:72:B5:82:34:21:6D:2F:21:53:46:6F:6A:D0:F1:24:CC:F8:C7:FF
Certificate is to be certified until Apr 24 15:31:15 2016 GMT (365 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 UpdatedWrite out database with 1 new entries
Data Base Updated

客户端从CA下载已经签署好的请求



这样在配置好web服务器就可以和客户端之间实现加密通信了。如果web服务器的私钥丢失或者证书过期那么我们需要在CA服务器上吊销web的证书:
验证证书信息是否与index文件一致



吊销证书



生成吊销证书编号、更新证书吊销列表



OK,到此我们的私有CA服务器的基本工作流程就完成了,这些也可以满足我们大多数的应用场景了,如有错误恳请各位看官指正。
本文出自 “Linuxlove” 博客,请务必保留此出处http://linuxlover.blog.51cto.com/2470728/1675113
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: