在网络和操作系统安全通信中经常涉及到这几个名词: RSA, 公钥,私钥,CA,数字签名,数字证书。

1, 加密: 对称和非对称,公钥和私钥:

加密的两种方式:对称加密和非对称加密。 对称加密:加密的密钥也叫公钥和解密的密钥(也叫私钥)相同。特点是算法公开、计算量小、加密速度快、加密效率高。 非对称加密:加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。RSA是一种非对称加密算法。 RSA是取的研究这个算法的三个专家的首字母。

加密算法中,公钥用于对数据进行加密,私钥用于对数据进行解密。当然了,这个也可以很直观的理解: 公钥就是公开的密钥,其公开了大家才能用它来加密数据。私钥是私有的密钥,谁有这个密钥才能够解密密文。 在签名算法中,私钥用于对数据进行签名,公钥用于对签名进行验证。这也可以直观地进行理解: 对一个文件签名,当然要用私钥,因为我们希望只有自己才能完成签字。验证过程当然希望所有人都能够执行。 大家看到签名都能通过验证证明确实是我自己签的。如果你用私钥加密了,所有人都能查到公钥并解密,所以其实不能叫加解密。

2, 数字签名

数字签名并不是签一个字来证明这个东西是我的,而是做了一个数学计算。数字签名 (Digital Signature)是 先对消息内容做Hash得到一串数字,然后用私钥对这个数 字进行加密。 数字签名就两个目的:证明这消息是你发的;证明这消息内容确实是完整的。(认证和完整性)。

对消息做一次哈希(md5或者sha1都行),然后用你的私钥加密这段哈希作为签名,并一起公布出去

当别人收到你的公告时,他可以用你的公钥解密你的签名,如果解密成功,并且解密出来的哈希值确实和你的公告原文一致, 那么他就证明了两点:这消息确实是你发的,而且内容是完整的。 我们在网上下载文件,经常会有一个长串的字符 MD5值。我们下载资料后,linux可以 用md5sum 检查一下这个资料,命令输出得到的值和网站上的md5值比较。如果一致, 说明文件下载完整。如果不一致,说明下载的文件发生改变。windows可以用winmd5等 软件验证。

3.数字证书 Digital Certificate 和证书中心 Certificate Authority

“服务器”要对外发布公钥,那“服务器”如何把公钥发送给“客户”呢?我们第一反应可能会想到以下的两个方法: a)把公钥放到互联网的某个地方的一个下载地址,事先给“客户”去下载。 b)每次和“客户”开始通信时,“服务器”把公钥发给“客户”。 但是这个两个方法都有一定的问题, 对于a)方法,“客户”无法确定这个下载地址是不是“服务器”发布的,你凭什么就相信这个 地址下载的东西就是“服务器”发布的而不是别人伪造的呢,万一下载到一个假的怎么办? 另外要所有的“客户”都在通信前事先去下载公钥也很不现实。 对于b)方法,也有问题,因为任何人都可以自己生成一对公钥和私钥,他只要向“客户”发送他自己的公钥就可以冒充“服务器”了。

为了解决这个问题,数字证书出现了,它可以解决我们上面的问题。先大概看下什么是数字证书,一个证书包含下面的具体内容:

证书的发布机构 (CA) 证书的有效期 公钥 证书所有者(Subject) 签名所使用的算法 指纹以及指纹算法 利用 CA 的私钥对上述信息进行的数字签名

其中, 最后的数字签名最为重要, 他证明了发布该证书的 CA 身份. 证书发布机构除了给别人发布证书外,他自己本身也有自己的证书. 在我们的操作系统刚安装好时, 这些证书发布机构的数字证书就已经被安装在操作系统中了. 即操作系统已经拥有所有可信任 CA 的公钥. 这些 CA 自己持有与他自己的数字证书对应的私钥, 他会用这个私钥加密所有他发布的证书的指纹作为数字签名. 而操作系统则利用这些可信任 CA 的公钥来验证每一份证书是否由可信任的 CA 发出. 浏览器经常报出的不受信的安全链接错误, 就是指从服务器得到包含签名的证书无法通过可信任 CA 的公钥的验证. 这通常是由于为该网站签发证书的 CA 不被操作系统信任, 当然也可能来自黑客的攻击.

综上, 实现上述安全策略需要两个前提.

  1. CA 是可以信任的 (CA 是一家实实在在的公司, 有信誉).
  2. 操作系统已经把 CA 的数字证书 (公钥) 默认安装在操作系统中, 也就是说操作系统中有 CA 的公钥.

连接的流程为: 服务器向 CA 申请数字证书 (通过发送一个包含服务器公钥的 CSR). CA 生成包含服务器公钥并用 CA 自身私钥签名的服务器的数字证书给服务器. 客户端请求建立与服务器的连接, 然后客户端收到服务器发来的数字证书和加密网页. 客户端用包含在 CA 证书中的 CA 公钥确认该服务器数字证书的确由 CA 签发, 是真实可信的, 从而得到可信的服务器公钥. 有了服务器公钥,客户端就可以解开服务器的加密网页.

非对称加密用于防止发送的数据被攻击者截取. 数字签名用于防止攻击者伪装成发送者发送被替换掉的非法数据. 数字证书用于防止攻击者伪装成接收者给发送者提供一个伪造的公钥.

特别注意: RSA 的私钥是包含公钥的, 从私钥中可以提取出公钥, 但反之不可能.

Openssl 和 ssh-keygen 均可用于操作密钥, 签名和证书. 但两者的证书格式不同.

4, 具体实现: TLS/SSL 协议

更新信任 CA 证书

pacman -S ca-certificates

列出所有信任 CA

trust list

增加一个信任的 CA

trust anchor certificate.crt

移除一个信任的 CA

trust anchor --remove 'pkcs11:id=xxxxxx;type=cert'

临时关闭一个信任的 CA

trust extract --format=pem-bundle --filter='pkcs11:id=xxx;type=cert' /etc/ca-certificates/trust-source/blacklist/untrusted_authority.pem

GnuTLS 实现 TLS/SSL 协议: 安装 gnutls

生成密钥

certtool -p --rsa --bits=4096 --outfile=key1

生成准备提交给 CA 的证书请求

certtool -q --load-privkey private_key --outfile file

生成自签名证书

certtool -s --load-privkey private_key --outfile file