原理
在说具体操作之前,我们先研究下数据加密的原理。首先就要理解一些概念
对称加密、非对称加密、公钥、私钥、签名
一般的加密是用一个密码加密文件,然后对方使用这个密码去解密。类似于我们使用一对锁和钥匙,密码是一样的,这就是我们经常说的对称加密。那么什么是非对称加密呢?根据对称加密去理解的话,就是使用一个密码去加密,而使用另一个密码去解密。这个对于一般人不是很好理解,不同的钥匙怎么去开同一把锁?这是数学上的一个素数积求因子的原理的应用,它会生成一对“钥匙”(秘钥),用这一组秘钥中的一个来加密数据,可以且只能用另一个解开。当需要数据加密相互通信的时候,我们可以把一个“钥匙”给对方,因为给了别人,所以称为公钥;另一个留给自己,就称为私钥。他会先用你给他的公钥加密数据,你收到后再用保留的私钥解密数据,这样就实现了数据加密传输。
同理,如果你用你的私钥对数据进行加密,那这个数据就只有配对的公钥可以解开,有这个私钥的只有你,所以如果配对的公钥解开了数据,就说明这数据是你发的。这个被称为签名。
RSA、DSA、SHA、MD5
RSA、DSA是著名的非对称加密算法,RSA可以用于加/解密,也可以用于签名验签,DSA则只能用于签名。SHA、MD5是一种摘要算法,通过这种算法,依据数据内容生成一种固定长度的摘要,这串摘要值与原数据存在对应关系,就是原数据会生成这个摘要,但是,这个摘要是不能还原成原数据的。但是我们可以通过这段摘要来确定数据内容是否有变更,这也是为什么我们经常通过对比文件的md5值来确认文件是否相同。
在实际应用过程中,因为需要加密的数据可能会很大,进行加密费时费力,所以一般都会把原数据先进行摘要,然后对这个摘要值进行加密。再将原数据的明文和加密后的摘要值一起传输,解开加密后的摘要值,再和得到的数据进行的摘要值对应一下就可以知道数据有没有被修改了,而且,因为私钥只有你有,只有你能解密摘要值,所以别人就算把原数据做了修改,然后生成一个假的摘要给你也是不行的,你这边用密钥也根本解不开。
CA
CA,Certificate Authority,证书颁发机构。是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。一般的公钥不会用明文传输给别人的,正常情况下都会生成一个文件,这个文件就是公钥文件,然后这个文件可以交给其他人用于加密,但是传输过程中如果有人恶意破坏,将你的公钥换成了他的公钥,然后得到公钥的一方加密数据,他就可以用他自己的密钥解密看到数据了。为了解决这个问题,需要一个公证方确认公钥是谁发的。这就是CA。我们也可以自己做一个自签名的证书文件,我们自己作为CA,就是自己生成一对密钥,然后再用自己生成的另外一对密钥对这对密钥进行签名。
生成证书
秘钥文件可以通过openssl命令来生成,这章节来介绍下如何生成证书。
在要生成证书的目录下建立几个文件和文件夹,因为使用的是/usr/lib/ssl/openssl.cnf
配置文件,我们就是用默认的配置,创建demoCA文件夹。然后我们在myca建立几个文件和文件夹。newcerts目录用来保存我们的CA颁发的所有的证书。serial文件用来跟踪最后一次颁发的证书的序列号,初始化为01。index.txt文件是一个排序数据库,用来跟踪已经颁发的证书,文件内容为空。
root@8f3e03c2db43:~/demoCA# tree
.
├── index.txt
├── newcerts
└── serial
1.生成X509格式的CA自签名证书
#openssl req -new -x509 -keyout ca.key -out ca.crt
2.生成服务端的私钥(key文件)及csr文件
#openssl genrsa -des3 -out server.key 1024
#openssl req -new -key server.key -out server.csr
3.生成客户端的私钥(key文件)及csr文件
#openssl genrsa -des3 -out client.key 1024
#openssl req -new -key client.key -out client.csr
4.用生成的CA的证书为刚才生成的server.csr,client.csr文件签名
#openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
#openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key
5.生成p12格式证书
#openssl pkcs12 -export -inkey client.key -in client.crt -out client.pfx
#openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx
6.生成pem格式证书
有时需要用到pem格式的证书,可以用以下方式合并证书文件(crt)和私钥文件(key)来生成
#cat client.crt client.key> client.pem
#cat server.crt server.key > server.pem
7.PFX文件转换为X509证书文件和RSA密钥文件
#openssl pkcs12 -in server.pfx -nodes -out server.pem
#openssl rsa -in server.pem -out server2.key
#openssl x509 -in server.pem -out server2.crt
这样生成服务端证书:ca.crt, server.key, server.crt, server.pem, server.pfx,客户端证书:ca.crt, client.key, client.crt, client.pem, client.pfx