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