在现代互联网中,安全是一个不容忽视的问题,说到安全就不得不涉及到加密,解密。现在只要我们数据在互联网上传播就避免不了一些有恶意企图的人窥探,所以在网络中传播数据时首先要考虑几个因素,对方的身份,数据的完整性,数据的私密性。
常用的密码算法:对称加密,公钥加密,单向加密。
对称加密是加密和解密使用同一个秘钥,将原始数据分块进行加密。优点是加密速度快,常用于加密数据比较大的时候。其缺点是秘钥无法安全的送到对方。如果密码遗漏数据安全不复存在。常用的加密算法:DES,3DES,AES,Blowfish,Twofish,IDEA,RC6,CAST5。
使用工具:openssl
举例:把qq.txt文件加密。
openssl enc -a -salt -des3 -in /tmp/qq.txt -out /tmp/qqs.txt 然后输入2次自己定义的密码。
-a : 表示已base64的方式加密。
-des3:加密算法。
此时查看加密后的qqs.txt
解密:openssl enc -d -salt -des3 -a -in /tmp/qqs.txt -out /tmp/qqj.txt
-d:解密。
在例子中可见,对称加密和解密使用的同样的方式,而且如果在网络传输中传输密码或密码泄露数据也是不安全的。
单向加密:
单向加密即加密运算后的数据是不可逆的,不能反向运算出原数据。一般通过散列函数计算,散列函数的主要任务用于计算数据的完整性。常用算法有:MD5,SHA-1,SHA256,SHA384,SHA512。其特点是输入一样输出也是一样。如果输入发生任何改变,结果将引起巨大改变。无法通过输出结果还原原来的数据,无论输入多大,输出结果都是相同的大小。
举例:使用MD5算法计算qq.txt的结果。openssl dgst -md5 qq.txt
[root@localhost tmp]# openssl dgst -md5 qq.txt MD5(qq.txt)= cd7257236da80701dd11ce383644e213 [root@localhost tmp]# vim qq.txt 151515252:13523452345 455667678:45767687877 567787881:13456566767 667788931:15667676833 234457890:15899865663 567787881:13778798888 667788931:15678789904 234457890:15467689909 567791246:18755653256 234457890:15467685229 567791246:18758944576 d
"qq.txt" 12L, 244C written [root@localhost tmp]# openssl dgst -md5 qq.txt MD5(qq.txt)= c8fcbdb073a0381a8d2d9542dfc64800 [root@localhost tmp]# |
由此可见,在文本中末尾添加了一个字符d,其结果与上一次大不相同。由于具备不可逆的特性所以常用于验证文件是否发生过改变。而输出的结果我们通常称之为数据的指纹,或特征码。
公钥加密:
公钥加密也称为非对称加密,与对称加密不同的是它有两个秘钥,即公钥和私钥,这两个秘钥成对出现如果使用公钥加密数据解密必须用私钥。用私钥加密的数据解密要用其公钥。因为它加密和解密使用不同的秘钥所以称之为非对称加密。常结合其他加密方式组合使用。
生成自己的秘钥对:
在当前目录中生成一个2048位的秘钥保存到mykey中,注意默认生成权限出属主外账户有读权限,要禁止其他用户读取需修改权限或者直接使用:(umask 077;openssl genrsa 2048 >mykey)
[root@localhost tmp]# openssl genrsa 2048 >mykey Generating RSA private key, 2048 bit long modulus .................+++ ..............................+++ e is 65537 (0x10001) [root@localhost tmp]# ll -rw-r--r-- 1 root root 1679 Sep 26 03:51 mykey -rw-r--r-- 1 root root 242 Sep 26 02:54 qqj.txt -rw-r--r-- 1 root root 358 Sep 26 02:49 qqs.txt -rw-r--r-- 1 root root 244 Sep 26 03:31 qq.txt |
提取公钥:
[root@localhost tmp]# openssl rsa -in /tmp/mykey -pubout writing RSA key -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1CZOG8YAJ81strW7T9Sx cdsdD9tc0wNk5Qv7qE2PyNAthCuQdernyWYbf0on6uOGVfiHu0djLc9mfbDlXV2q Bu5WDS8Kh4RCFbTjeA35h+YGni16foQxa/U1QjijBK9Ju0BNQt/fblRsbjHR3W3g 0eUd5gJBgFf+p3W9FjR5S063ACIprVZF0u1Eu5lrOkKdtcHAXqSGQje70DCxJA3y iMtcTxSwBl3YRTuu37GMYot5KVBKzxAfcs7xjB34qxremBZlrLB3Wv8mG1bFf3GH siQjPtQ3gSig5spovPVccc5w4LglYE94OOa++hjf0btbBAqB9hET928cWZSGOuH+ 9wIDAQAB -----END PUBLIC KEY----- [root@localhost tmp]# |
以上步骤完成公钥和私钥已创建完成。并且私钥一定要保证其安全性。
以上三种加密方式各有特点,但也有各自的缺陷。如果单独用于网络数据加密仍然不可靠。但把他们组合在一起使用安全就有保障了。
首先发送方:
1、 把要发送的原文数据使用单向加密抽取出原文的特征码,用来保证数据的完整性。
2、 发送方使用非对称加密,即用自己的私钥把原文的特征码加密,加到原文后面。这样一来就保证身份,接收方有发送方的公钥收到数据后能正常用对方的公钥解密得到特征码即证明了数据发送方的身份。
3、 发送方再选择一个密码,用对称加密方式对原文和加密过的特征码一起再次进行加密。因为对称加密方式比较快如果数据过大也不太影响。
4、 发送方把选择的密码用接收方的公钥加密后一并把数据发给接收方。
接收方:
1、 接收方收到数据后首先使用自己的私钥得到了一个密码就是发送方打包的原数据和特征码。
2、 使用得到的密码打开发送方打包加密的原数据和特征码。此时得到了原数据,只有了原数据并不能确定数据没有被修改或替换过。此时要验证数据的完整性
3、 接收方用发送方的公钥解密加密过的特征码,而后得到了原数据的特征码。
4、 接收方用通样的方式对原数据计算特征码把得到的特征码和解密后的特征码进行比对如果一致说明数据没有被修改过。如果不一致说明此信息不可靠。
总结整个过程:
在过程中使用了三种加密方式组合,双方通过非对称加密验证了彼此的身份,因为发送方的数据密码使用了接收方的公钥加密了,这个数据只能是接收方的私钥才能解密,其他人得到了这些数据也是没有用处。使用对称加密对原数据进行加密使得原文得到加密。又通过单向加密的方式进行了特征码的比对验证了信息的可靠性。
下面用一张图表示过程:
在以上的过程当中接收方和发送方都事前有对方的公钥且互相信任,但在互联网当中我们又怎么保证对方公钥的可信度,如果对方是一个冒名顶替的呢我们将无从获知,所以我们需要一个可信的机构来保证,就好比我们生活当中一个人说他是张三住在甲街1号,我怎么知道他说的是真是假呢,我去派出所查一下,派出所说确实有个人叫张三住在甲街1号。那么我就认为他就是张三否则就不是。而在互联网中这个“派出所”就是CA,它负责给互联网上的主机签发证书。而如果你想在互联网上得到“信任”就要先到CA那里注册,CA核实你的身份信息然后提取信息的特征码用CA自己的私钥加密后发给你而这就是你的数字签名。
有了签名之后当我们需要与一个主机通讯的时候对方会发给我它的证书,这时我首先去用CA的公钥解密证书,如果能够解密说明证书是CA给颁发的,CA已经核实过他的身份和信息了我们认为对方是可靠的,但我们需要进一步证明证书是否在有效期内和是否是已经吊销的证书,这个查询就需要到CA那里查询。当整个确认过程没有问题之后通信才真正的开始。而以上的整个加密解密过程和CA的这种验证机制行程了一个新的技术规范就是:PKI(Public.Key.Infrastructure)。
CA证书的这种机制不是一定要应用于大型互联网中在自己的私有范围内也可以使用,其中使用的工具就是openssl。
建立私有CA:
1、 生成秘钥:
(umask077; openssl genrsa �Cout /etc/pki/CA/private/cakey.pem 2048)
[root@localhost private]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048) Generating RSA private key, 2048 bit long modulus ...............+++ ................+++ e is 65537 (0x10001) [root@localhost private]# |
2、 签署请求:
[root@localhost private]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -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) []:PEK Locality Name (eg, city) [Default City]:PEK Organization Name (eg, company) [Default Company Ltd]:FF Organizational Unit Name (eg, section) []:FF Common Name (eg, your name or your server's hostname) []:ops Email Address []:[email protected] [root@localhost private]# ls /etc/pki/CA/cacert.pem /etc/pki/CA/cacert.pem [root@localhost private]# ls /etc/pki/CA/ cacert.pem certs crl newcerts private [root@localhost private]# |
使用命令:openssl req-new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem �Cdays365,发起证书签署请求,然后会提示你填写一些信息。
req:生成证书签署请求;-news:新请求;-key /path/to/keyfile:指定私钥文件; -x509:生成自签署证书; -days 365:有效天数,可自定义。
然后在CA目录下新建2个文件,index.txt 和serial
然后:~]# echo 00 > seria
3、 签署证书:
签署请求生成的方法在文中提到过。不在重复说明,签署证书命令:
openssl ca -in /tmp/mykey.csr -out /tmp/ff.com.crt -days 365
-in:指明请求文件位置
-out:指明输出文件名和位置。
-days:指明签署有效期限。
[root@localhost CA]# openssl ca -in /tmp/mykey.csr -out /tmp/ff.com.crt -days 365 Using configuration from /etc/pki/tls/openssl.cnf Check that the request matches the signature Signature ok Certificate Details: Serial Number: 0 (0x0) Validity Not Before: Sep 26 12:22:03 2015 GMT Not After : Sep 25 12:22:03 2016 GMT Subject: countryName = CN stateOrProvinceName = PEK organizationName = FF organizationalUnitName = OPS commonName = OPS emailAddress = [email protected] X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 12:2C:F0:DF:C1:99:08:88:73:BA:04:8E:C4:2F:26:20:52:F5:A2:13 X509v3 Authority Key Identifier: keyid:84:C4:2E:4A:ED:A6:9D:26:A1:80:BE:D2:47:7F:CC:D9:85:97:4D:19
Certificate is to be certified until Sep 25 12:22:03 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 Updated [root@localhost CA]# [root@localhost CA]# cat serial 01 [root@localhost CA]# cat index.txt V 160925122203Z 00 unknown /C=CN/ST=PEK/O=FF/OU=OPS/CN=OPS/[email protected] [root@localhost CA] |
上图中看到在index.txt中.生成了签署记录.其他主机签署是同样的方式,只不过需要把请求通过一些途径发送给CA。
吊销证书:当有主机秘钥丢失或泄露为保证安全需要向CA申请吊销证书。
1、 获取要吊销证书的序号和信息。
[root@localhost CA]# openssl x509 -in /tmp/ff.com.crt -noout -serial -subject serial=00 subject= /C=CN/ST=PEK/O=FF/OU=OPS/CN=OPS/[email protected] [root@localhost CA]# |
2、 核实要吊销证书是否与申请吊销主机提供的信息是否一致。
3、 吊销证书:openssl ca -revoke /etc/pki/CA/newcerts/00.pem
如果是第一次吊销需生成吊销证书的编号: echo 01 > /etc/pki/CA/crlnumber
4、 更新吊销证书列表:openssl ca -gencrl -out ff.com.crl
查看crl文件:openssl crl -in /path/to/crl_FILE.crl -noout -text
[root@localhost crl]# openssl crl -in ff.com.crl -noout -text Certificate Revocation List (CRL): Version 2 (0x1) Signature Algorithm: sha1WithRSAEncryption Issuer: /C=CN/ST=PEK/L=PEK/O=FF/OU=FF/CN=ops/[email protected] Last Update: Sep 26 12:45:50 2015 GMT Next Update: Oct 26 12:45:50 2015 GMT CRL extensions: X509v3 CRL Number: 1 Revoked Certificates: Serial Number: 00 Revocation Date: Sep 26 12:40:47 2015 GMT Signature Algorithm: sha1WithRSAEncryption b5:f4:9c:ec:3d:4a:e4:d1:1b:48:d4:a0:5e:06:4f:a0:ab:e6: 76:de:62:f6:88:8e:cc:ec:b9:de:39:db:8c:a0:00:3e:57:41: 73:09:90:e9:64:4c:0a:01:70:0b:ac:43:f2:28:0a:1a:77:c9: b2:20:ef:30:d6:3d:5b:7b:a0:5a:5d:dc:1a:95:63:4b:e8:11: e9:f6:53:8b:42:83:cb:34:cc:cc:25:94:de:f9:54:77:a4:1f: 6a:12:27:77:e2:fc:48:3b:56:58:08:f2:47:0c:f2:4d:52:ed: 0e:ba:e6:76:47:d5:d5:6f:de:44:5d:73:3d:ff:14:13:b1:d0: aa:da:ee:6e:4d:84:d7:34:e9:4f:0f:fe:aa:9f:da:6e:a9:bd: 2b:aa:3e:82:2b:91:f4:37:bd:38:08:99:94:95:0b:98:3b:93: 81:bf:cc:6a:80:31:f5:73:4f:45:e3:5f:53:25:a3:d9:95:03: c7:27:e8:44:c1:97:9d:cb:8d:26:9d:69:d3:0d:ba:6d:a8:1b: 6f:47:e9:fb:9e:ad:9c:f5:e9:9c:b0:50:be:e2:35:44:2b:c5: 6b:c6:36:3d:52:e5:d1:5a:6c:56:13:57:6f:67:e5:5b:ba:1d: 5c:d4:5b:81:9b:e7:c2:9e:99:c7:7b:ea:48:ff:3c:70:5d:96: 50:20:18:1a [root@localhost crl]# |
crt证书文件可以配置到http服务器当中,这样就可以用https的访问站点,实现交换数据的全。
至此私有CA搭建和证书签署已经完成。此文只为个人知识总结便于以后查阅用。