7.1. Basic Message Flow with Early Media and SIP Identity
セッション確立前に Alice と Bob は自己署名証明書を生成し, 単一セッション用に使うか, より一般的には複数セッションで再利用する. 本例では Alice が Bob を呼び出し, 同一プロキシを共有すると仮定する.
本例では Alice が passive, Bob が active である. Bob が offer の m= 行に DTLS を指定した INVITE を受け取るとすぐ, RTP と RTCP の双方で Alice との DTLS association 交渉を始める. Bob が Alice に DTLS Finished を送ると早期メディア (RTP/RTCP) が流れ始める. Alice が SIP 200 を受信し Alice が DTLS Finished を送った後に双方向メディアが流れる.
Alice からプロキシへの SIP シグナリングは TLS で運び, Alice と身元サービス間の整合性保護を確保する. プロキシ間も保護すべきであり, 特に SIP Identity 非使用時はそうである.
The SIP signaling from Alice to her proxy is transported over TLS to ensure an integrity protected channel between Alice and her identity service. Transport between proxies should also be protected somehow, especially if SIP Identity is not in use.
Alice Proxies Bob |(1) INVITE | | |---------------->| | | |(2) INVITE | | |----------------->| | |(3) hello | |<-----------------------------------| |(4) hello | | |----------------------------------->| | |(5) finished | |<-----------------------------------| | |(6) media | |<-----------------------------------| |(7) finished | | |----------------------------------->| | |(8) 200 OK | | <------------------| |(9) 200 OK | | |<----------------| | | |(10) media | |<---------------------------------->| |(11) ACK | | |----------------------------------->|
Message (1): INVITE Alice -> Proxy
Alice から Bob への初期 INVITE を TLS でプロキシに送る (プロキシが Alice の身元サービス). SDP の a=setup:actpass で active/passive いずれも可とする. Bob は DTLS クライアントとしてセッションを開始する. SDP には Alice の自己署名証明書から計算した fingerprint がある.
デフォルト m= は RTP を提示し answerer が SRTP 非対応でも動くようにする. ただし SRTP 輸送の潜在設定を優先する. 詳細は [MMUSIC-SDP].
INVITE sip:[email protected] SIP/2.0 To: sip:[email protected] From: "Alice"sip:[email protected];tag=843c7b0b Via: SIP/2.0/TLS ua1.example.com;branch=z9hG4bK-0e53sadfkasldkfj Contact: sip:[email protected] Call-ID: 6076913b1c39c212@REVMTEpG CSeq: 1 INVITE Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, UPDATE Max-Forwards: 70 Content-Type: application/sdp Content-Length: xxxx Supported: from-change
v=0
o=- 1181923068 1181923196 IN IP4 ua1.example.com
s=example1
c=IN IP4 ua1.example.com
a=setup:actpass
a=fingerprint: SHA-1
4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB
t=0 0
m=audio 6056 RTP/AVP 0
a=sendrecv
a=tcap:1 UDP/TLS/RTP/SAVP RTP/AVP
a=pcfg:1 t=1
Message (2): INVITE Proxy -> Bob
Alice (と Bob) のプロキシから Bob へ INVITE を中継する. Alice のプロキシが Identity と Identity-Info を挿入する. 簡略化のためプロキシは一要素として描く. Bob は INVITE の身元を検証する.
INVITE sip:[email protected] SIP/2.0 To: sip:[email protected] From: "Alice"sip:[email protected];tag=843c7b0b Via: SIP/2.0/TLS proxy.example.com;branch=z9hG4bK-0e53sadfkasldk Via: SIP/2.0/TLS ua1.example.com;branch=z9hG4bK-0e53sadfkasldkfj Record-Route: sip:proxy.example.com;lr Contact: sip:[email protected] Call-ID: 6076913b1c39c212@REVMTEpG CSeq: 1 INVITE Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, UPDATE Max-Forwards: 69 Identity: CyI4+nAkHrH3ntmaxgr01TMxTmtjP7MASwliNRdupRI1vpkXRvZXx1ja9k 3W+v1PDsy32MaqZi0M5WfEkXxbgTnPYW0jIoK8HMyY1VT7egt0kk4XrKFC HYWGCl0nB2sNsM9CG4hq+YJZTMaSROoMUBhikVIjnQ8ykeD6UXNOyfI= Identity-Info: https://example.com/cert Content-Type: application/sdp Content-Length: xxxx Supported: from-change
v=0
o=- 1181923068 1181923196 IN IP4 ua1.example.com
s=example1
c=IN IP4 ua1.example.com
a=setup:actpass
a=fingerprint: SHA-1
4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB
t=0 0
m=audio 6056 RTP/AVP 0
a=sendrecv
a=tcap:1 UDP/TLS/RTP/SAVP RTP/AVP
a=pcfg:1 t=1
Message (3): ClientHello Bob -> Alice
Alice の身元が有効なら, 図の (3) は Bob が Alice に DTLS ClientHello を直接送ることを示す. 本例では RTP 用 ua1.example.com:6056 と RTCP 用 6057 の 2 本を送るが図は 1 本に省略.
Message (4): ServerHello+Certificate Alice -> Bob
Alice は RTP/RTCP 双方の association に ServerHello, Certificate, ServerHelloDone を返す. 同一証明書を使う. [RFC5761] 多重化なら association は 1 つでよい.
Message (5): Certificate Bob -> Alice
Bob は RTP/RTCP 双方に Certificate, ClientKeyExchange, CertificateVerify, change_cipher_spec, Finished を送る. 同一サーバ証明書を使う.
Message (6): Early Media Bob -> Alice
Bob は早期メディアを送り始められる. Alice は fingerprint 未受信のためメディアをまだ信頼できない. UA UI で示す.
Message (7): Finished Alice -> Bob
Bob が該当メッセージを受け取った後, Alice は change_cipher_spec と Finished を送る.
Message (8): 200 OK Bob -> Alice
Bob は応答時に自身の証明書 fingerprint を含む 200 OK を送る. acfg で DTLS 上 SRTP の実輸送を示す.
SIP/2.0 200 OK To: sip:[email protected];tag=6418913922105372816 From: "Alice" sip:[email protected];tag=843c7b0b Via: SIP/2.0/TLS proxy.example.com:5061;branch=z9hG4bK-0e53sadfkasldk Via: SIP/2.0/TLS ua1.example.com;branch=z9hG4bK-0e53sadfkasldkfj Record-Route: sip:proxy.example.com;lr Call-ID: 6076913b1c39c212@REVMTEpG CSeq: 1 INVITE Contact: sip:[email protected] Content-Type: application/sdp Content-Length: xxxx Supported: from-change
v=0
o=- 6418913922105372816 2105372818 IN IP4 ua2.example.com
s=example2
c=IN IP4 ua2.example.com
a=setup:active
a=fingerprint: SHA-1
FF:FF:FF:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB
t=0 0
m=audio 12000 UDP/TLS/RTP/SAVP 0
a=acfg:1 t=1
Message (9): 200 OK Proxy -> Alice
Alice はプロキシから受信し, (7) の流れで提示された証明書を検証する. 端点は呼が保護されたことを示せる.
Message (10): RTP+RTCP Alice -> Bob
Alice も RTP/RTCP を Bob に送り始められる.
Message (11): ACK Alice -> Bob
最後に Alice が SIP ACK を送る.