正在使用X509实现WCF安全性,每个请求都有一个新通道

本文关键字:有一个 请求 新通道 通道 X509 实现 安全性 WCF | 更新日期: 2023-09-27 18:27:27

我能做些什么让X509更好地执行遵循新通道每个请求的最佳实践吗?还是这种缓慢的协商是使用X509实现WCF安全性的固有缺点?

对于tl;dr跳到末尾的更新3以获取此消息的来源

WCF通道的最佳实践似乎是"重用ChannelFactory,但为每个请求创建一个新通道",我一直都是这样做的。例如,单WCF通道性能与多通道

我目前正在尝试使用X509证书作为安全凭据,每次CreateChannel都需要很长时间(15秒以上)。重用通道随后会产生良好的性能(如果我理解正确的话,因为对称密钥是在调用CreateChannel时发生的初始公钥/私钥身份验证之后使用的),但这是一种糟糕的做法。

在服务器端:

var managerCertificate = new X509Certificate2(@"Manager.pfx", "");
var host = new ServiceHost(typeof(ManagerService));
host.Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
host.Credentials.ClientCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;
host.Credentials.ServiceCertificate.Certificate = managerCertificate;
host.Open();
Console.ReadLine();

在工作端(减缓每个请求):

var workerCertificate = new X509Certificate2(@"Worker.pfx", "");
var cfact = new ChannelFactory<IManagerService>("client");
cfact.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
cfact.Credentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;
cfact.Credentials.ClientCertificate.Certificate = workerCertificate;
for (int i = 0; i < 10; i++)
{
    using (IManagerService channel = cfact.CreateChannel()
    {
         Console.WriteLine(channel.GetMyData("test data" + i));
    }
}

如果我将CreateChannel调用移到for循环之外以重用它,那么只有第一个请求需要相当长的时间。

此外,我正在使用NetTcpBinding。

更新1:结果的短样本:

0: 546.875ms
1: 281.25ms
2: 281.25ms
3: 17484.375ms
4: 250ms
5: 234.375ms
6: 250ms
7: 250ms
8: 265.625ms
9: 250ms

250毫秒并不是一个太可怕的每次呼叫开销(尽管与重复使用信道相比是巨大的),但它似乎是时断时续的(见17秒),频率各不相同,有时是三分之一。如果服务器在运行客户端exe之间保持正常,那么在随后的运行中,初始协商成本就会消失,所以这很好。

更新2:可能与防火墙/防病毒无关,因为我在禁用了股票XP和防火墙的虚拟机中尝试了这一操作,结果极不一致。一次是可预测的(每次通话400毫秒),另一次是疯狂的停顿。

更新3:在浏览跟踪日志后,每次创建新通道时消耗时间的服务器活动(以及导致偶尔暂停的活动)似乎是:

<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
  <System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
    <EventID>0</EventID>
    <Type>3</Type>
    <SubType Name="Transfer">0</SubType>
    <Level>255</Level>
    <TimeCreated SystemTime="2012-03-10T15:02:27.2968750Z" />
    <Source Name="System.ServiceModel" />
    <Correlation ActivityID="{9e5e819b-e837-40b8-81b1-9f3c18e54595}" RelatedActivityID="{2faaac57-4e24-41ad-a3e5-85d81bddfa3b}" />
    <Execution ProcessName="WcfCertExample" ProcessID="420" ThreadID="4" />
    <Channel />
    <Computer>MYCOMPUTER</Computer>
  </System>
  <ApplicationData></ApplicationData>
</E2ETraceEvent>

日志还显示:相关活动名称:流程操作http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue"。

因此,如果有人知道为什么这可能会持续17.5秒,以及正常情况下是否总是要花费250秒,那么你就会回答我的问题!

正在使用X509实现WCF安全性,每个请求都有一个新通道

基于您正在使用自签名证书的注释。

WCF和自签名证书存在已知的性能问题,请参阅:WCF和证书的糟糕性能(相互身份验证)

当您使用来自证书颁发机构的证书时,这不是问题。