一个TCPTLS侦听器上的多个连接SIPSorcery

时间:2017-11-08 09:01:26

标签: c# sip

如何在SIPSorcery中使用一个SIPTLSChannel,使用不同的证书连接不同的远程服务器,但使用相同的本地端口?

据我所知,SIPTLSChannel将X509Certificate2作为构造函数中的参数,并且无法在此通道中加载更多证书,也无法使用相同的LocalEndPoint但不同的证书添加多个SIPTLSChannel实例,如SIPTransport将报告此EndPoint已存在。

以下示例将抛出"已存在的异常":

SIPTransport transport = new SIPTransport(SIPDNSManager.ResolveSIPService, new SIPTransactionEngine(), true);
var localEndPoint = new IPEndPoint(IPAddress.Loopback, 8443);

var cert1 = new X509Certificate2 ("c:\\mycerts\\*****.cer");
var channel1 = new SIPTLSChannel(cert1, localEndPoint);
transport.AddSIPChannel(channel1);

var cert2 = new X509Certificate2 ("c:\\mycerts\\*****.cer");
var channel2 = new SIPTLSChannel(cert2, localEndPoint);
transport.AddSIPChannel(channel2);

1 个答案:

答案 0 :(得分:1)

希望这个答案迟到总比没有好。

在来自OP的代码示例中,提供的证书是客户端连接到侦听端口时将使用的证书。换句话说,这是一个服务器证书,可用于连接客户端。取决于客户端,证书的通用名称将需要与在其上创建TLS通道的主机名匹配,否则客户端将拒绝SSL协商,并显示诸如RemoteCertificateNameMismatch之类的错误。

要建立传出SSL连接,无需指定证书(sipsorcery库当前不支持客户端证书身份验证)。需要指定的是期望的证书名称。需要使用的SendRequest重载是:

void Send(IPEndPoint dstEndPoint, byte[] buffer, string serverCertificateName)

实际上,通常不必担心要使用哪个Send重载。而是这些步骤是:

  • 创建一个SIPTLSChannel,如问题示例所示,
  • 使用需要TLS传输的URI创建SIP请求:
    • sips:100@sipsorcery.com
    • sip:100@sipsorcery.com; transport = tls
  • 使用请求调用Send,SIP传输类负责创建传出TCP连接和SSL协商。