S/MIME协议是端对端协议,也就是说,只有发送人和接收人都支持S/MIME协议,才可以使用S/MIME协议收发邮件,如果接收人不支持S/MIME协议,对方会收到一封只有附件的邮件,附件名为:smime.p7m。
MIME 协议是一个互联网标准,全称是多用途互联网邮件扩展(Multipurpose Internet Mail Extensions),它扩展了电子邮件标准,使其能够支撑更多形式的信息(如二进制,声音,图像等),而 S/MIME 则是在 MIME 的基础上支持签名和加密,他们的关系类似 http 和 https 的关系。
为什么要使用 S/MIME 协议
S/MIME 主要提供两种安全服务:
1.数字签名
2.邮件加密
数字签名可以保证邮件内容不被篡改,从而保证邮件的发件人和发件内容不被伪造(这同时也保证可以邮件确实出自发件人,即可以用来作为发件人发件的证据), 邮件加密可以保证邮件内容不会泄露,只有邮件的接收人可以看到邮件的内容,从而保证邮件的安全性。
特别说明:S/MIME 协议是端对端协议,也就是说,只有发送人和接收人都支持 S/MIME 协议,才可以使用 S/MIME 协议收发邮件,如果接收人不支持 S/MIME 协议,对方会收到一封只有附件的邮件,附件名为:smime.p7m。
S/MIME 协议工作流程
S/MIME 分发送方和接受方,发送方需要签名和加密:
1.捕获邮件。
2.检索用来唯一标识发件人的信息。
3.检索用来唯一标识收件人的信息。
4.使用发件人的唯一信息对邮件执行签名操作,以产生数字签名。
5.将数字签名附加到邮件中。
6.使用收件人的信息对邮件执行加密操作,以产生加密的邮件。
7.用加密后的邮件替换原始邮件。
8.发送邮件。
这里第 2,3,7 需要特殊说明一下。
2 中,检索唯一标识发件人的信息,要求发件人要在发件客户端安装私钥,用于邮件签名。
3 中,检索用来唯一标识收件人的信息,需要在发件客户端安装收件人证书,用于邮件加密。
7 中,为了让接收方能够验证签名,需要在邮件中附上发送方的证书。
对于接受方,需要解密和验证签名:
1.接收邮件。
2.检索加密邮件。
3.检索用来唯一标识收件人的信息。
4.使用收件人的唯一信息对加密邮件执行解密操作,以产生未加密的邮件。
5.返回未加密的邮件。
6.将未加密的邮件返回给收件人。
7.从未加密的邮件中检索数字签名。
8.检索用来标识发件人的信息。
9.使用发件人的信息对未加密的邮件执行签名操作,以产生数字签名。
10.将邮件所附带的数字签名与收到邮件后所产生的数字签名进行比较。
11.如果数字签名匹配,则说明邮件有效。
这里 4,9 需要进行特殊说明。
4 中,需要在接收端客户端安装接收人的私钥,用来给加密邮件进行解密,只有解密后的邮件才能进行签名校验。
9 中,解密邮件后,可以拿到邮件签名和发送方证书,接收方需要对证书进行验证,验证有效后,即可利用证书的公钥对邮件的签名进行校验,校验通过则说明邮件没有被篡改,是可信的。
S/MIME 证书
看了前面的收发信流程,你是否有如下问题?
1.如何保证加密结果只有收件人能解密?
2.使用发件人提供的证书校验签名,如何确认证书不是和邮件一起被篡改的?
3.如何确定证书是可信任的?
非对称加密
对于第一个问题,S/MIME 协议如何保证邮件内容只有收件人可以解密呢?这里实际上采用的是非对称加密算法。
在 S/MIME 协议中,每一个人申请证书时,都会收到至少两个证书:公钥证书和私钥证书,公钥证书是可以公开的,私钥证书是需要自己保存并且不能泄露的。
在给收件人发送邮件时,需要先获取到收件人公钥,公钥可以先找收件人提供,或者通过服务器获取(协议中没有规定如何获取收件人公钥,因此获取方法也不是固定的)。
拿到公钥加密后,密文内容就只有收件人的私钥可以解密了,因此能看到密文内容的人,就只有持有收件人私钥的人了。
签名校验
我们知道,签名算法是私钥签名,公钥按照特定算法计算得到签名,然后比较私钥签名结果和公钥签名,相同即可确认签名有效。
从这个算法可以看出,当邮件内容签名可以用公钥验证时,至少可以保证邮件内容与私钥-公钥是对应的(如果公钥被篡改,原来的私钥校验肯定不通过),此时我们假设公钥是正确的,没有被篡改,说明邮件内容是可信的,没有被篡改。
如何确定证书是可信的
在签名校验的环节,我们假设了证书是可靠的,没有被篡改,因此得出邮件内容是可靠的,没有被篡改,那么如何用验证证书是可靠的这个假设呢?
这里就涉及证书校验的知识了。
严格来说,证书没有可靠和不可靠的说法,只有信任和不信任,什么样的证书是受信任的,什么样的证书是不受信任的,这里就不仅仅涉及技术问题了,也有一些约定的关系。