openssl命令、https 、http理解、公钥、私钥、CA证书
附上代码
#!/bin/bash
# 生成随机文件
filename="fake_file.txt"
echo "This is a fake file." > "$filename"
# 生成RSA密钥对
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
openssl rsa -pubout -in private_key.pem -out public_key.pem
# 使用私钥对文件进行签名
signature_file="signature.pem"
openssl dgst -sha1 -sign private_key.pem -out "$signature_file" "$filename"
# 验证签名
RE=$(openssl dgst -verify public_key.pem -sha1 -signature "$signature_file" "$filename") >/dev/null 2>&1
# 检查验证结果
if [ $? -eq 0 ]; then
echo "签名验证成功!"
else
echo "签名验证失败!"
fi
1. openssl 命令
客户端A 与服务端B通过http通讯,
1、通讯过程中明文传输,会遭受拦截、修改等问题,所以引入了加密算法,采用对称加密,即A生成的 对称密钥s,那么B也需要对称密钥s解密A发送的数据,那么此时,生成的s 密钥如何不被篡改和窃取、安全的传输到A呢?
当然可以走单独的安全通道,但是需要具有安全的通道,其次安全带宽有限,再加上密钥更新呢
2、故引入非对称的密钥,即 A、B各自生成自己的公钥、私钥,将公钥发布在网上,谁都可以拿到公钥,举例:传输数据中,A传输给B时,A用B的公钥将数据加密,B收到后使用自己的私钥解密,B到A时,亦然,
但是此时你怎么知道B获得公钥就是A的呢?如果A、B 之间存在中间人呢,如下图
3、所以引入了数字证书概念,
如果A生成的密钥后,由A亲自将自己的公钥放在B的服务上就可以确定该公钥是A的,例如ssh,在访问github时候,一开始需要在自己的电脑上生成密钥对,之后将公钥放在github上,然后就可以通过ssh安全的push和pull,
3.1、SSH,也就是Security Shell,由 IETF 的网络小组(Network Working Group)所制定,是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。
SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH相当于一个隧道,数据通过的时候保护它不被泄露和篡改,为shell提供安全的传输和运用环境。具体来说,通过它可以安全的远程实行另一台UNIX体系上机器的指令。
3.2
SSL不同于SSH,它是安全套接层(Secure Sockets Layer),是一种安全协议,是Netscape公司在推出Web浏览器首版时一起提出的。当浏览器访问以https://开头的URL时,浏览器通过SSL连接使用HTTP。SSL协议会在数据传输之前对数据进行加密再进行网络传输,保证了用户数据在传输链路上的安全。
数字证书
日常通过web页面访问服务端,服务端不可能给每个客户端发送一个公钥,于是 找了个三方机构证明公钥来自于服务端,
服务端先去证书中心申请证书,数字签名是通过一些特定的hash算法计算得到的一串值,证书中心会将 服务端上传的网站信息、公钥加上证书中心添加的数字签名、证书信息组成证书,但是这些都写明文,故通过hash算法得到hash值,之后客户端收到证书后,用同样的hash的算法验证。
如果存在中间人修改证书信息,生成新的hash呢?
所以对于数字签名进行加密,用CA机构的私钥加密, 而CA的 公钥是预装在系统中的,存在有人截取并由CA证书,但是没有CA的私钥,无法将修改的信息加密。
https = http + SSL / TLS
私钥和公钥是一对多,在https单向认证、双向认证、认证完毕后,采用对称加密通讯