S/MIME

本文详细介绍了SIP(Session Initiation Protocol)中使用S/MIME(Secure/Multipurpose Internet Mail Extensions)进行消息加密和认证的过程。内容包括S/MIME在SIP中的应用,如消息体的保密性和完整性,S/MIME认证方法,密钥交换,以及加密MIME包体的处理。此外,还讨论了SIP头域的隐私和完整性保护,以及S/MIME隧道的使用场景。

SIP消息可以加载一个MIME 消息体,并且MIME标准包括了MIME内容的保密机制,确保完整性和机密性(包括“multipart/signed”和“application/pkcs7-mime”的MIME类别,参见RFC 1847[22],RFC 2630[23],RFC2633[24])。实现中应当注意,不管怎样,也会有很少的网络节点(不是典型的proxy服务器),会依赖于查看修改SIP消息(特别是SDP),采用加密的MIME可以防止这类网络节点操作。

 

这个实现特别对某些类型防火墙有效。

 

在RFC2543描述的对于SIP头域和包体的PGP加密机制,已经不建议使用了。

 

1. S/MIME 认证

用于区别服务器使用的S/MIME而进行的最终用户的鉴定,有一种重要的特点-这些信任状的持有者是被最终用户地址鉴定的,而不是由一个特定的hostname所鉴定的。这个地址是由SIP或者SIPS URI的“userinfo”“@”和“domainname”组成的(换句话说,就是用的email格式,类似bob@biloxi.com),最常见的就是和用户的address-of-record对应的地址。

 

这些认证也同样和用于标记或者加密SIP消息包体的密钥相关联。包体由发送方的私钥所标记(这个发送方在适当情况下,可以包含他们的公钥),并且包体是由被接受方的公钥所加密。显然,发送方必须事先知道接受方的公钥,这样才能加密包体。公钥可以在UA的一个虚拟的钥匙环上保存。

 

每一个支持S/MIME的UA都必须包含用于终端用户验证的一个特定密钥组。这个密钥组应当由address-of-record和相应的认证信息的映射组成。在时间上,当用户产生具有相同address-of-record的原始的信号URI(From头域)时,用户应当使用相同的认证信息。

 

任何依赖于现存的终端用户认证的机制都是严格受限于:事实上,目前没有一个统一的权威认证机构为终端用户应用提供认证。不过,用户应当从已知的公共认证机构获得认证。作为替代,用户可以创建自标记(self-signed)的信任书。self-signed信任书。在实现中,也可以采用在配置中存放预先配置的信任书,这个配置中存放的是上次SIP实体之间的信任关系。

 

在获得终端用户的认证问题上,很少有广为人知的集中发布终端用户认证的目录机构。信任书的拥有者应当在一些公共的目录机构中,适当的发布自己的信任书。类似的,UAC应当支持从与SIP请求的目标URI有关的公共目录机构导入信任书(手工或者自动的)。

 

2. S/MIME 密钥交换

SIP自身可以根据下列的方法发布公钥。

 

无论何时SIP的S/MIME使用了CMS SignedData消息,他必须包含由公钥所加密的信任书,用于检查签名。

 

当UAC发送一个创建对话的请求,包含了一个S/MIME包体,或者在对话外发送一个非INVITE请求,UAC应当创建一个S/MIME ‘multipart/signed’CMS SignedData包体结构的包体。

 

如果特定的CMS服务时EnvelopedData(并且知道目标用户的公钥),UAC应当在一个SignedData消息中发送EnvelopedData消息。

 

当UAS接收到一个包含S/MIME CMS包体的请求,并且这个包体包含一个信任书,UAS应当首先检查这个信任书,如果可能,使用以后的root信任书来进行信任书检查。UAS也应当检查信任书的主题(subject)(对于S/MIME,SubjectAltName应当包含了适当的标记)并且,把这个值和请求From头域进行比较。如果信任书不被通过,因为它是self-signed(自签发),或者被置位的信任机构所颁发的,或者它是可信任的,但是他的主题和请求的From头域不匹配,UAS必须把这个通知用户(包括信任书的主题,签发者,和密钥指纹信息),并且在继续处理之前,要求用户确认。如果信任书成功通过认证,并且信任书的主题(subject)和SIP请求的From头域相同,或者如果用户(在知会之后)批准了这个信任书的使用,那么UAS应当增加这个信任书到本地密钥组中(keyring),并且用信任书拥有者的address-of-record作为索引。

 

当UAS要发送一个包含S/MIME消息体的应答,这个应答回应了在对话中的前一个请求,或者是给对话外的一个非INVITE请求的应答,UAS应当构造一个S/MIME‘multipart/signed’CMS SignedData包体。如果给定的CMS服务要求EnvelopedData,UAS应当发送一个EnvelopedData的SignedData消息

 

当UAC收到一个包含S/MIME CMS包体的应答,这个应答中包含了一个信任书,UAC应当首先检查这个信任书,如果可能,使用任何适当的root信任书来进行检查。UAC应当同样检查信任书的主题(subject),并且和应答的To头域进行比较;虽然两个可能完全不同,这个也没有必要当作是不安全的。如果因为self-signed,或者由未知认证机关颁发而导致信任书不能通过认证,那么UAC应当通知它的使用者这个状态(包含信任书的主题,它的签发者,以及密钥的指纹信息),并且在继续操作之前,要求使用者确认。如果信任书通过了认证,并且信任书的主题和应答的To头域相同,或者用户(在提示确认后)明确,确认这个信任书以后,UAC应当把这个信任书放在本地密钥组中,用这个信任书的拥有者的address-of-record作为索引。如果UAC没有把自己的信任书事先传送给UAS,它在下一个请求或者应答时应当使用一个CMS SignedData包体。

 

在以后,当UA接收到包括一个From头域的请求或者应答,并且这个From头域和本地的一个密钥组的索引匹配,那么UA应当比较消息中的信任书和这个密钥组对应索引的信任书。如果他们不匹配,那么UA必须通知用户信任书改变了(更合适的是提示这个可能是一个潜在的安全冲突),并且在继续处理前要求用户的确认。如果用户确认了这个信任书,它应当在本地密钥组的这个address-of-record项的前一个值旁边附加这个信任书。

 

注意,这个值的改变机制,在self-signed信任书的情况或者未知机关颁发的信任书情况下,并不保证密钥变更的安全性,并且这个缺陷被广为人知的攻击。在本文的作者看来,它提供的安全性当然比什么也没有要强;实际上可以和广泛应用的SSH应用相比。

 

如果UA接收到了一个S/MIME包体,并且是由本接受方所不知道的公钥加密的,它必须用493(Undecipherable)拒绝这个请求。这个应答应当回答一个合法的信任书(相应的,如果可能,给被拒绝请求的To头域指出的全部地址),这个信任书包含一个“certs-only”和“smime-type”参数的MIME包体。。

 

一个没有任何信任书信息的493(Undecipherable)应答表示回答者不能或者不会利用S/MIME加密信息,虽然他们可以依旧支持S/MIME标记。

 

注意UA接收到一个包含一个S/MIME包体的请求(这个请求包含了Content-Disposition头域和“required”的“handling”参数),如果这个MIME类型是不被支持的,那么就必须用415 Unsupported MediaType来拒绝这个请求。当UA接收到这个应答,并且这个应答表示的是对方不支持刚才发送的S/MIME类型的请求,那么UA应当通知它的使用者对方不支持这个S/MIME类型,并且如果可以,他可以在随后的请求中不包含S/MIME部分;另外,这个415应答可以制造一个下级的攻击。

 

如果一个UA在请求中发送了一个S/MIME包体,但是接收到的应答包含了一个未加密的MIME包体,UAC应当提示用户,这个会话可能是不安全的。可是,如果一个支持S/MIME的UA接收到一个包含未加密的包体的请求,它不应当给出一个包含加密包体的应答,但是如果它希望从发送方获得一个S/MIME(比如,因为发送方的From头域值在它的密钥组中存在关联),UAS应当通知它的使用者这个会话可能是不安全的。

 

当信任书管理不正常的情况下,许多条件都可以导致前边讲的要给用户提示以及确认的情况。使用者可能会问在这个情况下应当怎样做。首先,一个信任书的异常改变,或者在需要安全保护的时候不安全,是导致这个警告出现的原因,但是并非表示正在遭受攻击。使用者可以中断现有的连接或者拒绝连接请求;在电话谈话中,他们可以挂机并且回叫。使用者可能会使用另外的方式来联系对方并且确认他们的密钥是否合法的更改了。注意用户有时候需要强制更改他们的信任书,例如当他们怀疑他们的私钥不够安全的情况。当他们的私钥不再私钥,用户必须合法的产生一个新的密钥并且重新和其他持有旧密钥的用户建立信任关系。

 

最后,如果在对话中UA收到了在一个CMS SignedData Message中的信任书,并且和早先对话中交换的信任书不一致,那么UA必须提示它的使用者这个变化,更好的方法是展示成为一个安全隐患。

 

3. 加密MIME包体

SIP中,总共由两种类型的加密MIME包体:对他们的使用应当遵循S/MIME规范,并且有几点不同:

 

l       multipart/signed只在CMS 分离签名的时候有用。这是为了和非S/MIME规范接受者兼容。

l        S/MIME包体应当包含一个Content-Disposition头域,并且他的“handling”参数的值应当是“required”

l        如果UAC在它的密钥组中没有对应要发送请求的接受者的address-of-record的信任书,它不能发送加密的“application/pkcs7-mime” MIME消息。UAC可以发送一个初始化的请求(比如OPTIONS消息),包含一个为了方便对方处理的CMS分离的签名(签名应当基于一个“message/sip”包体,类型描述在4节)。

注意以后的S/MIME标准工作可以定义基于非信任书的密钥。

l        S/MIME的发送方应当使用“SMIMECapabilities”属性来为以后的通讯介绍他们自己的能力和参数。注意,特别是那些可能用“preferSignedData”的发送方希望接受方应答一个CMS SignedData消息(例如,当发送一个OPTIONS请求的时候)。

l        S/MIME实现必须至少支持SHA1作为数字签名算法,并且3DES作为加密算法。其他的签名和加密算法也可以支持,实现上应当可以用“SMIMECapabilities”属性进行这些算法的协商。

l        在SIP中的每一个S/MIME包体应当只有一个信任书的签名。如果UA接收到的消息有多个信任书,最外边的信任书应当当作这个包体的信任书。并行的签名应当不能使用。

下边是一个SIP中的加密的S/MIME SDP包体的例子:

INVITE sip:bob@biloxi.com SIP/2.0

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8

To: Bob <sip:bob@biloxi.com>

From: Alice <sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

CSeq: 314159 INVITE

Max-Forwards: 70

Contact: <sip:alice@pc33.atlanta.com>

Content-Type: application/pkcs7-mime;smime-type=enveloped-data;

name=smime.p7m

Content-Disposition: attachment; filename=smime.p7m

handling=required

********************************************************************

* Content-Type: application/sdp                                       *

*                                                                                      *

* v=0                                                                                *

* o=alice53655765 2353687637 IN IP4 pc33.atlanta.com       *

* s=-                                                                                 *

* t=0 0                                                                               *

* c=IN IP4 pc33.atlanta.com                                             *

* m=audio 3456 RTP/AVP 0 1 3 99                                         *

* a=rtpmap:0 PCMU/8000                                                        *

********************************************************************

 

 

4. SIP头隐私和用S/MIME的完整性:SIP地道

作为提供端到端的某种程度认证来说,SIP头域的完整性或者机密性,SI/MIME可以把SIP消息通过“message/sip”的包体类型,整个装入一个MIME包体,并且接着就像处理普通SIP包体一样,对这个大的包体用MIME安全性来保护。这些被封装的SIP请求和应答并不产生另外的对话或者事务,他们只是一个用来检验完整性的或者提供附加信息的“outer”外部包装消息。

 

如果UAS接收到一个请求,包含一个“message/sip”隧道的S/MIME包体,它应当把应答用同样的SMIME-TYPE封装成一个“message/sip”隧道包体。

 

任何传统的MIME包体(比如SDP),应当附加为“inner”内部消息,这样他们可以使用到S/MIME安全性。注意,如果在请求中需要传送未加密的MIME类型的内容,那么“message/sip”包体可以作为MIME “multipart/mixed”包体的一部分存在,

 

4.1.  SIP头的完整性和机密属性

当应用了S/MIME完整性或者机密性机制,那么在“inner”消息和“outer”消息中的值可能会有差异。对于所有头域来说,处理这些差异的规则在本节指出。

 

注意,由于松散的时间戳,所有的在“message/sip”隧道中的SIP消息应当在“inner”和“outer”消息中都包含一个Date头域。

 

4.1.1. 完整性

无论何时,当完整性被检查,头域的完整性应当通过检查被封装包体中的头域值和“outer”消息的头域值。

 

头域可以被proxy服务器合法修改的是:Request-URI, Via,Record-Route, Route, Max-Forwards, 和Proxy-Authorization。如果这些头域不完全相等,实现中不应当认为是一个安全错误。对于其他头域的修改就是破坏了完整性,必须通知使用者关于这个差异。

 

4.1.2. 机密性

当消息加密以后,头域可以在加密的包体中存在,而不用在“outer”消息中存在。

 

有一些头域必须有一个明码格式的版本,因为他们是请求和应答中必须要求的头域-他们是:To、From、Call-ID、Cseq和Contact。虽然提供一个额外的Call-ID、Cseq或者Contact的加密版本没有什么用处,我们允许把To/From 放一份在“outer”消息的To或者From头域中。注意这些加密包体中的值并不用作鉴别事务或者对话――加密包体中的这些值仅仅作为提示信息使用。如果在加密包体中的From头域和在“outer”消息中的值不一样,那么这个加密包体中的值应当显示给用户,但是不能用于后续“outer”消息的头域中。

 

首先,UA应当希望加密有着端到端语义的头域,包括:Subject,Replay-To,Organization,Accept,Accept-Encoding,Accept-Language,Alter-Info,Error-Info,Authentication-Info , Expires, In-Replay-To, Require, Supported, Unsupported,Retry-After, User-Agent, Server, 和Warning。 如果这些头域在加密包体中出现,那么就应当替换在“outer”消息中的头域,而不管这个头域是显示给用户的还是设置UA内部状态的。他们应当在后续消息中不在在“outer”消息的头域中使用。

 

如果存在Date头域,那么Date头域必须在“inner”和“outer”头域中的值一样。

 

由于MIME包体是在“inner”消息中的,实现中通常会加密MIME指定的头域,包括:MIME-Version,Content-Type,Content-Length,Content-Language, Content-Encoding, 和Content-Disposition。“outer”消息会为S/MIME包体使用适当的MIME头域。这些头域(和他们开始的任何MIME包体)在SIP消息中,应当作为普通的MIME头域和包体接收。

 

对下边这些头域的加密并不是特别有用: Min-Expires, Timestamp,Authorization, Priority, 和 WWWAuthenticate。这类头域包含了那些能够被proxy服务器所更改的头域(在前边章节有讲述)。如果这些头域不出现在“outer”消息中,那么UA应当不在“inner”消息中包含这些头域。如果UA在加密的包体中接收到这些头域,应当忽略到这些加密的值。

 

注意,SIP的扩展可能会定义附加的头域;那么这些扩展的作者应当描述这些头域的完整性和机密性特性。如果一个SIP UA遇到了一个不认识的头域,并且产生了一个完整性冲突,它必须忽略掉这个头域。

 

4.2.  隧道的完整性和身份认证

通过S/MIME包体的SIP消息隧道可以提供SIP头域的完整性保证,只要发送方把这个包整个打包放在用CMS分离签名的“message/sip”MIME包体中。

 

假设那个“message/sip”包体包含了最基本的对话要素(最小集合)(To, From, Call-ID和CSeq),并且一个签名的MIME包体可以提供优先的身份认证。在这个特别的最小集合上,如果接受方不认识用于签名MIME包体的信任状,并且不能被检验,那么在同一个信任状拥有者所初始化的会话中,这个信任状拥有者可以稍后发送一个在会话中的请求,包含这个签名来进行确认。如果签名MIME包体的接受方选择信任这个信任书(他们可以检验信任书,他们已经从信任列表中检查了,或者他们经常使用这个信任书),那么这个签名就和这个信任书的主题有着相同的身份一致性。

 

为了排出可能的对实体包头域增加减少相关困惑,发送方应当把请求的所有头域放在签名的包体中。任何需要完整性保护的包体都必须添加到“inner”消息中。

 

如果有一个签名包体的消息中包含一个Date头域,接受方应当比较它自己的内部时钟和这个头域值。如果检测到了时差(比如超过1个小时或者更多),UA应当警告使用者,并且提示这个可能是安全隐患。

 

如果接受方检测到消息的完整性破坏了,如果是这个消息是请求,那么应当使用403(Forbidden)来拒绝这个请求,或者终止现存的对话。UA应当提示用户这个情况,并且要求明确的操作指示。

 

下边是一个使用隧道“message/sip”的例子:

 

INVITE sip:bob@biloxi.com SIP/2.0

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8

To: Bob <sip:bob@biloxi.com>

From: Alice<sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

CSeq: 314159 INVITE

Max-Forwards: 70

Date: Thu, 21 Feb 2002 13:02:03 GMT

Contact: <sip:alice@pc33.atlanta.com>

Content-Type: multipart/signed;

protocol="application/pkcs7-signature";

micalg=sha1; boundary=boundary42

Content-Length: 568

 

--boundary42

Content-Type: message/sip

 

INVITE sip:bob@biloxi.com SIP/2.0

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8

To: Bob <bob@biloxi.com>

From: Alice <alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

CSeq: 314159 INVITE

Max-Forwards: 70

Date: Thu, 21 Feb 2002 13:02:03 GMT

Contact: <sip:alice@pc33.atlanta.com>

Content-Type: application/sdp

Content-Length: 147

 

v=0

o=UserA 2890844526 2890844526 IN IP4 here.com

s=Session SDP

c=IN IP4 pc33.atlanta.com

t=0 0

m=audio 49172 RTP/AVP 0

a=rtpmap:0 PCMU/8000

 

--boundary42

Content-Type: application/pkcs7-signature;name=smime.p7s

Content-Transfer-Encoding: base64

Content-Disposition: attachment; filename=smime.p7s;

handling=required

ghyHhHUujhJhjH77n8HHGTrfvbnj756tbB9HG4VQpfyF467GhIGfHfYT6

4VQpfyF467GhIGfHfYT6jH77n8HHGghyHhHUujhJh756tbB9HGTrfvbnj

n8HHGTrfvhJhjH776tbB9HG4VQbnj7567GhIGfHfYT6ghyHhHUujpfyF4

7GhIGfHfYT64VQbnj756

 

--boundary42-

 

 

4.3.  隧道加密

把“message/sip”MIME包体用CMS EnvelopedData消息S/MIME包体进行加密是值得的,但是在实践中,大部分头域都是用于网络的;而通常使用S/MIME进行的加密都是加密类似SDP的消息体的,而不是消息头的。有一部分头域的信息,比如Subject或者Organization或许需要端到端的安全保证。以后的SIP应用可能会定义其他的头域,这些头域也或许需要端到端的安全保证。

 

另一个加密头域的可能的应用是选择性匿名。可以构造一个没有个人信息的From头域(比如sip:anonymous@anonymizer.invalid)。不过,第二个From头域包含了真实的请求者的address-of-record信息,并且加密存放在“message/sip”MIME包体中,并且只会在对话的对方节点被看到。

 

注意如果这个机制用于匿名,那么将接受方将不再用From头域来作为密钥组的索引,并且也不用于从密钥组查询合适的发送方的S/MIME密钥。这个消息必须首先被解密,并且“inner”From头域必须当作一个索引。

 

为了提供端到端的完整性,加密的“message/sip”MIME包体应当由发送方签名。这个创建了一个包含一个加密包体和一个签名的“multipart/signed” MIME包体,包体类型都是“application/pkcs7-mime”。

 

在下边这个例子中,是一个加密和签名的消息,在*括起来的文字是加密的:

 

INVITE sip:bob@biloxi.com SIP/2.0

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8

To: Bob <sip:bob@biloxi.com>

From: Anonymous <sip:anonymous@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

CSeq: 314159 INVITE

Max-Forwards: 70

Date: Thu, 21 Feb 2002 13:02:03 GMT

Contact: <sip:pc33.atlanta.com>

Content-Type: multipart/signed;

protocol="application/pkcs7-signature";

micalg=sha1; boundary=boundary42

Content-Length: 568

 

--boundary42

Content-Type: application/pkcs7-mime;smime-type=enveloped-data;

name=smime.p7m

Content-Transfer-Encoding: base64

Content-Disposition: attachment; filename=smime.p7m

handling=required

Content-Length: 231

 

******************************************************************************

* Content-Type: message/sip                                                         *

*                                                                                                     *

* INVITE sip:bob@biloxi.com SIP/2.0                                              *

* Via: SIP/2.0/UDPpc33.atlanta.com;branch=z9hG4bKnashds8      *

* To: Bob <bob@biloxi.com>                                                          *

* From: Alice <alice@atlanta.com>;tag=1928301774                     *

* Call-ID: a84b4c76e66710                                                            *

* CSeq: 314159 INVITE                                                                  *

* Max-Forwards: 70                                                                         *

* Date: Thu, 21 Feb 2002 13:02:03 GMT                                      *

* Contact: <sip:alice@pc33.atlanta.com>                                       *

*                                                                                                     *

* Content-Type: application/sdp                                                     *

*                                                                                                     *

* v=0                                                                                              *

* o=alice53655765 2353687637 IN IP4 pc33.atlanta.com                    *

* s=Session SDP                                                                            *

* t=0 0                                                                                            *

* c=IN IP4 pc33.atlanta.com                                                           *

* m=audio 3456 RTP/AVP 0 1 3 99                                                       *

* a=rtpmap:0 PCMU/8000                                                                     *

******************************************************************************

 

--boundary42

Content-Type: application/pkcs7-signature;name=smime.p7s

Content-Transfer-Encoding: base64

Content-Disposition: attachment; filename=smime.p7s;

handling=required

 

ghyHhHUujhJhjH77n8HHGTrfvbnj756tbB9HG4VQpfyF467GhIGfHfYT6

4VQpfyF467GhIGfHfYT6jH77n8HHGghyHhHUujhJh756tbB9HGTrfvbnj

n8HHGTrfvhJhjH776tbB9HG4VQbnj7567GhIGfHfYT6ghyHhHUujpfyF4

7GhIGfHfYT64VQbnj756

 

--boundary42-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值