On 01.12.2012 00:25, Andreas Granig wrote:
Hi,
Hope to get some guidance here over the usage of "sips" and "sip plus transport=tls" when following RFC3263.
The RFC3263 says that a NATPR record could return something like this for a query like "host -t NAPTR example.com":
; order pref flags service regexp replacement IN NAPTR 50 50 "s" "SIPS+D2T" "" _sips._tcp.example.com. IN NAPTR 90 50 "s" "SIP+D2T" "" _sip._tcp.example.com IN NAPTR 100 50 "s" "SIP+D2U" "" _sip._udp.example.com.
This means that the client should use sips if possible when contacting example.com.
Concluding from that, I suppose it should perform an SRV lookup "host -t SRV _sips._tcp.example.com", and the result would be:
;; Priority Weight Port Target IN SRV 0 1 5061 server1.example.com IN SRV 0 2 5061 server2.example.com
What I'm curious about is how requests towards one of these servers should look like, and how they are being handled by kamailio.
(Disclaimer: non normative - this is how I understand SIP and how I would use it)
The request URI should look like the one which the user enters. E.g. if user enters "sip:12345@example.com" then the request URI should be "sip:12345@example.com" - regardless of the transport protocol chosen by the transport layer.
Thus, if NAPTR records tell you to use SIP over TLS, then use SIP over TLS but do not change the request URI.
The contact header could be any transport - but of course it makes sense if the client uses the same transport protocol as used for sending the request (which is usually the same used for registration).
When a user enters "sips:12345@example.com", then of course a secure transport must be used, which basically means that TLS will be used. Nevertheless the request URI is still "sips:12345@example.com" without any transport identifier.
The request URI only contains a transport parameter if the user entered one (e.g. to force its client to use a certain transport), or if the call forwarding logic in the proxy requires a certain transport. In this case, NAPTR lookups will be skipped (as transport is already defined).
In case if a SIPS URI entered by the user, the contact URI must be SIPS too. In a proxy it usually does not makes sense to manually change a request URI from SIP to SIPS - but there may be certain scenarios where things may get complex, e.g. the Sipwise "SIP Provider" setup:
Client1 <---TLS/TCP/UDP ----> Proxy <---UDP--> sems/b2bua / Client2 <---TLS/TCP/UDP --
As long as SIP URIs are used, there is no problem in converting from TLS to UDP. If client 1 uses a SIPS URI to call client 2, then may be problems: From standard point of view it should be fine to convert TLS to UDP, as the transport is secured by other means (in this case a local hop via loopback interface). The question is how the SIP client will react, when receiving SIP requests for SIPs URIs, but the contact contains a SIP URI. A workaround of course would be to change sems's contact to "sips:...;transport=tls" in the proxy, but still use UDP between proxy and sems.
A lot of clients and servers are sending "sip:user@example.com;transport=tls" in request URIs and Contact headers and Record-Route headers, and you can check with uri_param("transport","tls") which transport socket to use. This is pretty useful as you can determine hop-by-hop whether or not to use TLS. This approach has been obsoleted by RFC3261 though, and there doesn't seem to be a mechanism in RFC3263 to indicate "use schema sip, but use transport=tls".
RFC3263 does not enforce the format of the URI. It just tells you to use TLS/TCP/UDP - as said above, the RURI should not be changed due to NAPTR lookups.
On encounter of a NAPTR record like the one above, how does kamailio act? Does it set a "sips" schema for the next hop?
Hopefully not. The RURI should not be changed.
And what's the general take on this "sips" schema? As far as I understand RFC3261, it means that if a client sends a request to a sips-URI, the request is sent to the domain via TLS, and from there "the request is sent securely to the callee, but with security mechanisms that depend on the policy of the domain of the callee." (RFC3261, Chapter 4). What does this really mean in practice? Are you allowed to rewrite the schema to "sip" and pass it on for example via UDP to the callee if the callee didn't indicate transport=tls (deprecated anyways) or "sips:" in the Contact of the registration? Or should you keep "sips" as schema, but still send it via UDP, because you know based on local policy or based on client registration that the next hop is not supporting TLS? How would widespread clients react when getting a call to a "sips" URI, especially if they receive it via UDP?
Yes, there are lots of open issues and sips itself is broken by design as it enforces encryption between all hops, but there is no way to control or enforce that encryption is really used between all hops.
So, I personally would mandate to drop the SIPS schema completely, as it can not guarantee secure transport on all hops. The only hop where a client can enforce a secure transport is the first hop - and this can be done also with the SIPS schema.
regards Klaus