如何在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);
答案 0 :(得分:1)
希望这个答案迟到总比没有好。
在来自OP的代码示例中,提供的证书是客户端连接到侦听端口时将使用的证书。换句话说,这是一个服务器证书,可用于连接客户端。取决于客户端,证书的通用名称将需要与在其上创建TLS通道的主机名匹配,否则客户端将拒绝SSL协商,并显示诸如RemoteCertificateNameMismatch
之类的错误。
要建立传出SSL连接,无需指定证书(sipsorcery库当前不支持客户端证书身份验证)。需要指定的是期望的证书名称。需要使用的SendRequest
重载是:
void Send(IPEndPoint dstEndPoint, byte[] buffer, string serverCertificateName)
实际上,通常不必担心要使用哪个Send
重载。而是这些步骤是:
Send
,SIP传输类负责创建传出TCP连接和SSL协商。