Hi All,

Am using Kamailio 5.1.9 version.

Below is my tls.cfg

[server:default]
method = TLSv1+
verify_certificate = no
require_certificate = no
private_key = server.key
certificate = server.crt
ca_list = bundle.crt
cipher_list = RSA
verify_depth = 9

[client:default]
verify_certificate = no
require_certificate = no


[server:10.211.160.172:5061]
method = TLSv1+
verify_certificate = yes
require_certificate = yes
private_key = /root/mahesh_openssl/profile2/btip_172_server_private.key
certificate = /root/mahesh_openssl/profile2/btip_172_server_public.crt
ca_list = /root/mahesh_openssl/profile2/btip_ca_public.crt
cipher_list = RSA
verify_depth = 9
server_name = btip.172.com


[server:10.211.160.172:5061]
method = TLSv1+
verify_certificate = yes
require_certificate = yes
private_key = /root/mahesh_openssl/profile1/ctip_172_server_private.key
certificate = /root/mahesh_openssl/profile1/ctip_172_server_public.crt
ca_list = /root/mahesh_openssl/profile1/ctip_ca_public.crt
cipher_list = RSA
verify_depth = 9
server_name = ctip.172.com

My Kamailio server ip is 10.211.160.172

i)When i initiate a tls connection from remote server(which is also a kamailio server) say 10.211.160.176 to 10.211.160.172 
  In the client hello am setting sni name as btip.172.com => so on 10.211.160.172 side it is picking up the server profile with serve_name btip.172.com for the tls handshake.// Working as expected

ii)When i initiate a tls connection from another remote server(Which is also a kamailio server) say 10.211.160.163 to 10.211.160.172
  In the client hello am setting sni name as ctip.172.com => so on 10.211.160.172 side it is picking up the server profile with serve_name ctip.172.com for the tls handshake.// Working as expected

iii)When i initiate a tls connection from another remote server(Which is also a kamailio server) say 10.211.160.175 to 10.211.160.172
  In the client hello am NOT setting sni name  => so on 10.211.160.172 side should it pick up the server default profile or the first profile to which IP and port matches ?
  what i observe from logs is that it is picking up the server profile with server_name ctip.172.com for the tls handshake.


  I had a look at the code in function tls_lookup_cfg, from the debug prints i understand it is trying to match profile for IP and port

if ((p->port==0 || p->port == port) && ip_addr_cmp(&p->ip, ip)) // IP and port matched
{
      if(sname && sname->len>0)     //Incoming Client hello dint have sname, so it will hit the else part
     {
                 if(p->server_name.s && p->server_name.len==sname->len
                 && strncasecmp(p->server_name.s, sname->s, sname->len)==0) 
                {
                  LM_DBG("socket+server_name based TLS server domain found\n");
                 return p;
                }
   } 
   else
   {
      return p; // so it is returning the first profile to which IP and port matched.
   }
}


Am i missing anything or is this a bug ? if in the clienthello there is no sni , what needs to be done to make use of the default profile for the tls handshake ? Or is this something fixed in latest.
I just Tried and Modified the code as below, after which it is giving the server default profile when no sni in Incoming Client Hello.

if ((p->port==0 || p->port == port) && ip_addr_cmp(&p->ip, ip)) 
{
      if(sname && sname->len>0)    
     {
                 if(p->server_name.s && p->server_name.len==sname->len
                 && strncasecmp(p->server_name.s, sname->s, sname->len)==0) 
                {
                  LM_DBG("socket+server_name based TLS server domain found\n");
                 return p;
                }
   } 
   else
   {
              if( (type & TLS_DOMAIN_SRV) && (p->server_name.s) ) 
              {
                 LM_DBG("Inside %s at %d\n",__FUNCTION__,__LINE__);
                return cfg->srv_default;
             } 
             else 
            {
                LM_DBG("Inside %s at %d\n",__FUNCTION__,__LINE__);
               return p;
            }
    }
}

Regards,
Mahesh.B