什么加密,签名
下面这个博客解释的很好: https://www.cnblogs.com/f-ck-need-u/p/6089523.html
签名
在保证了数据的安全性后,还需要保证数据的完整性、一致性以及数据来源的可靠性。
对于数据的完整性和一致性,使用单向加密算法,通过hash函数计算出数据独一无二的校验码,这个校验码称为“信息摘要(Message Digest)”。
对于数据来源可靠性,使用自己的私钥加密即可验证身份,因为获得数据后使用公钥不能解密的就证明数据不是配对私钥加密的。但是私钥加密速度慢,所以只用私钥加密摘要信息,加密后的摘要信息称为“数字签名(Signature)”。
用户获得数字签名后的数据,首先使用数据来源方的公钥解密,这样获得了数据和信息摘要部分,并确认了数据来源的可靠性。由于这时候数据部分是没有被加密的,所以用户也可以使用同种单向加密算法计算出摘要信息,然后对比来源方的摘要信息和自己计算出的摘要信息,如果相等则证明数据完全未被修改过,是完整一致的。
因此只要使用数字签名就能保证数据来源的可靠性、数据的完整性和一致性。
什么是CA:
CA(Certificate Authority)是数字证书认证中心的简称,是指发放、管理、废除数字证书的机构。
CA的作用是检查证书持有者身份的合法性,并签发证书(在证书上签字),以防证书被伪造或篡改,以及对证书和密钥进行管理。
SSL证书中DN(Distiguish Name)识别名的结构:
遵循x.500标准,标识名的目的就是为每个网络实体提供一个唯一的名字。为了达到这一目的,DN有一种分层结构。一个DN由一些列的RDN(Relative distinguished name,相对标识名)构成。
RDN的乘此结构依次为:
C = US, ST = Beijing, L = Beijing, O = RTFM, OU = Consulting, CN = Eric
(C->Country, ST-> State or Provice Name, L->Locality Name, O->Organization, OU->Organization Unit, CN->Common Name)
生成自签名证书的步骤:
一、建立CA:
1. 在任意目录建立文件夹,文件夹名称任意
/home/gouxu/gx/key/
2. 进入到新建立的文件夹key
cd /home/gouxu/gx/key/
3. 生成CA私钥
openssl genrsa -out ca.key 2048
参数说明:
genrsa:生成rsa秘钥;
-out ca.key 生成的秘钥文件为ca.key;
2048: 秘钥长度为2048.
4. 用CA私钥生成CA的证书
openssl req -new -x509 -days 36500 -key ca.key -out ca.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=Teamsun/OU=Teamsun"
(-x509选项会生成自签名证书。)
5. 建立CA相应目录
进入到key文件夹执行如下命令:
mkdir demoCA
cd demoCA/
mkdir newcerts
touch index.txt
echo '01' > serial
二、生成server端证书
1. 进入key文件夹
cd key/
2. 生成server私钥
openssl genrsa -out server.key 2048
3. 使用server私钥生成server端证书请求文件
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Teamsun/OU=guoxu/CN=guoxu"
(没有-x509选项则生成证书请求文件。)
4. 使用server证书请求文件通过CA生成自签名证书
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
5. 验证server证书
gouxu@gouxu-pc:~/gx/key$ openssl verify -CAfile ca.crt server.crt
server.crt: OK
gouxu@gouxu-pc:~/gx/key$
三、双向认证需要生成client证书
1. 进入key文件夹
cd key/
2. 生成client私钥
openssl genrsa -out client.key 2048
3. 使用client私钥生成client端证书请求文件
openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Teamsun/OU=guog/CN=guog"
注意:如果出现如下错误需要更改OU域与CN域重新生成证书请求文件。
Sign the certificate? [y/n]:y
failed to update database
TXT_DB error number 2
4. 使用client证书请求文件生成自签名证书
openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key
5. 验证client证书
gouxu@gouxu-pc:~/gx/test$ openssl verify -CAfile ca.crt client.crt
client.crt: OK
gouxu@gouxu-pc:~/gx/test$
四、测试
4.1 使用server证书测试单向认证
1. 打开窗口1启动server
gouxu@gouxu-pc:~/gx/test$ openssl s_server -accept 10001 -key server.key -cert server.crt
Using default temp DH parameters
Using default temp ECDH parameters
ACCEPT
2. 打开窗口2启动客户端
gouxu@gouxu-pc:~$ openssl s_client -connect localhost:10001
CONNECTED(00000003)
... ...
(命令应该写成 openssl s_client -connect localhost:10001 -CAfile /tmp/key/ca.crt , 如果不倒入CA证书,虽然不影响SSL通道建立过程,但是在verify服务端证书的过程中会有错误提示,添加了CA证书后错误提示消失。)
3. 连接成功后在任意一个窗口输入字符串会传输到另外一个窗口回显。
4.2 使用server证书和客户端证书做双向测试
1. 打开窗口1启动server。(带有Verify参数,强制要求client证书)
gouxu@gouxu-pc:~/gx/test$ openssl s_server -accept 10001 -key server.key -cert server.crt -Verify 5
2. 打开窗口2启动客户端
gouxu@gouxu-pc:~/gx/test$ openssl s_client -connect localhost:10001 -cert client.crt -key client.key
3. 双向证书正确则连接成功,否则连接失败。
4. 通过控制台可以双向发送消息。