0

以下是简要摘要:我有一个 WCF 客户端 (.NET 4.0),它在 Windows 7(64 位)上表现良好,但在 XP(32 位)上失败。由于我有很多 XP 客户,这是一个大问题。

  • 客户端是从服务提供者提供的 wsdl 文件生成的。
  • 服务是基于 SSL 的 SOAP 1.2,带有 MTOM
  • 客户端证书位于智能卡 (ActivIdentity) 上

这是代码:

        ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
        //System.Net.ServicePointManager.SecurityProtocol =System.Net.SecurityProtocolType.Tls;//.Ssl3;

        EndpointAddress addr = new EndpointAddress(g2bservice);
        B2GServiceClient client = new B2GServiceClient(NCTSBinding.Create(), addr);

        client.ClientCredentials.ClientCertificate.Certificate = ccer;  // one that is on SmartCard
        client.Endpoint.Behaviors.Add(new MyCustomBehavior());

        echo e = new echo();
        e.Msg = "Hello, World!";

        echoResponse r = client.echo(e);

这个绑定是这样创建的:

        BindingElement[] be = new BindingElement[2];
        be[0] = new NCTSMessageEncodingBindingElement();
        HttpsTransportBindingElement hbe = new HttpsTransportBindingElement();
        hbe.RequireClientCertificate = true;
        be[1] = hbe;
        CustomBinding _b = new CustomBinding(be);
        return _b;

其中 NCTSMessageEncodingBinding 与带有 overriden 的 MtomMessageEncodingBinding 几乎相同IsContentTypeSupported(...)

因此,此代码适用于 Win7,对话框要求输入 PIN 码以从智能卡中获取“私人部分”。在 XP 上,输入 PIN 的对话框永远不会发出,而是出现错误消息:

"An error occurred while making the HTTP request to https://cistest.apis-it.hr:8446/g2bservis. This could be due to the fact that the server certificate is not configured properly with HTTP.SYS in the HTTPS case. This could also be caused by a mismatch of the security binding between the client and the server."

请问有什么线索吗?XP和Win7在支持基础架构上有什么区别?

小更新:请注意工作和非工作跟踪日志中不同的粗体行。出于某种原因,在 Windows 7 机器上,初始消息在消息中包含服务名称 (cistest.apis-it.hr),而在 XP 上则缺少此信息。收到此消息后,XP 上的套接字已关闭...

Windows 7,工作示例(相同代码):
System.Net 信息:0:[3748] SecureChannel#23960260 - 证书的类型为 X509Certificate2,包含私钥。
System.Net 信息:0:[3748] AcquireCredentialsHandle(包 = Microsoft 统一安全协议提供程序,意图 = 出站,scc = System.Net.SecureCredential)
System.Net 信息:0:[3748] InitializeSecurityContext(凭据 = System.Net.SafeFreeCredential_SECURITY,上下文 =(空),targetName = cistest.apis-it.hr,inFlags = ReplayDetect,SequenceDetect,机密,AllocateMemory,InitManualCredValidation)
System.Net 信息:0:[3748] InitializeSecurityContext(缓冲区内长度=0,缓冲区外长度=122,返回代码=ContinueNeeded)。
System.Net.Sockets 详细:0:[3748] Socket#46340781::Send()
System.Net.Sockets 详细:0:[3748] 来自 Socket#46340781::Send 的数据
System.Net.Sockets 详细:0:[3748] 00000000:16 03 01 00 75 01 00 00-71 03 01 4E 67 4E 6A 26:....u...q..NgNj&
System.Net.Sockets 详细:0:[3748] 00000010:C6 C9 65 17 D7 EC C1 A1-15 72 E1 56 80 F4 5A BB:..e......rV.Z.
System.Net.Sockets 详细:0:[3748] 00000020:A8 4C 50 54 84 D4 3E 86-29 68 CA 00 00 18 00 2F:.LPT..>.)h ...../
System.Net.Sockets 详细:0:[3748] 00000030:00 35 00 05 00 0A C0 13-C0 14 C0 09 C0 0A 00 32:.5.......................2
System.Net.Sockets 详细:0:[3748] 00000040:00 38 00 13 00 04 01 00-00 30 FF 01 00 01 00 00:.8.......0......
System.Net.Sockets 详细:0:[3748] 00000050:00 00 17 00 15 00 00 12-63 69 73 74 65 73 74 2E:........cistest。
System.Net.Sockets 详细:0:[3748] 00000060:61 70 69 73 2D 69 74 2E-68 72 00 0A 00 06 00 04:apis-it.hr......
System.Net.Sockets 详细:0:[3748] 00000070:00 17 00 18 00 0B 00 02-01 00:......
System.Net.Sockets 详细:0:[3748] 退出 Socket#46340781::Send() -> 122#122

XP,不工作的例子(相同的代码):
System.Net 信息:0:[2272] SecureChannel#7307181 - 证书的类型为 X509Certificate2,包含私钥。
System.Net 信息:0:[2272] AcquireCredentialsHandle(包 = Microsoft 统一安全协议提供程序,意图 = 出站,scc = System.Net.SecureCredential)
System.Net 信息:0:[2272] InitializeSecurityContext(凭据 = System.Net.SafeFreeCredential_SECURITY,上下文 =(空),targetName = cistest.apis-it.hr,inFlags = ReplayDetect,SequenceDetect,机密,AllocateMemory,InitManualCredValidation)
System.Net 信息:0:[2272] InitializeSecurityContext(缓冲区内长度=0,缓冲区外长度=77,返回代码=ContinueNeeded)。
System.Net.Sockets 详细:0:[2272] Socket#32308990::Send()
System.Net.Sockets 详细:0:[2272] 来自 Socket#32308990::Send 的数据
System.Net.Sockets 详细:0:[2272] 00000000:16 03 01 00 48 01 00 00-44 03 01 4E 67 4E 1E C1:..H..D..NgN..
System.Net.Sockets 详细:0:[2272] 00000010:32 BD E0 57 87 A8 68 8B-32 77 00 18 DE 3F 69 3D:2..W..h.2w...?i=
System.Net.Sockets 详细:0:[2272] 00000020:D7 B1 7B 76 AD 26 A6 63-6B BB 49 00 00 16 00 04:..{v.&.ck.I.....
System.Net.Sockets 详细:0:[2272] 00000030:00 05 00 0A 00 09 00 64-00 62 00 03 00 06 00 13:.......db.......
System.Net.Sockets 详细:0:[2272] 00000040:00 12 00 63 01 00 00 05-FF 01 00 01 00:...c.........
System.Net.Sockets 详细:0:[2272] 退出 Socket#32308990::Send() -> 77#77
System.Net.Sockets 详细:0:[2272] Socket#32308990::Receive()
System.Net.Sockets 详细:0:[2272] 来自 Socket#32308990::Receive 的数据
System.Net.Sockets 详细:0:[2272] 00000000:15 03 01 00 02:.....
...
System.Net.Sockets 详细:0:[2272] 退出 Socket#32308990::Receive() -> 5#5
System.Net.Sockets 详细:0:[2272] Socket#32308990::Receive()
System.Net.Sockets 详细:0:[2272] 来自 Socket#32308990::Receive 的数据
System.Net.Sockets 详细:0:[2272] 00000005:02 28:.(
System.Net.Sockets 详细:0:[2272] 退出 Socket#32308990::Receive() -> 2#2
System.Net.Sockets 详细:0:[2272] Socket#32308990::Receive()
System.Net.Sockets 详细:0:[2272] 来自 Socket#32308990::Receive 的数据
System.Net.Sockets 详细:0:[2272] 00000007::
System.Net.Sockets 详细:0:[2272] 退出 Socket#32308990::Receive() -> 0#0
System.Net.Sockets 详细:0:[2272] Socket#32308990::Dispose()
4

1 回答 1

1

好吧,在尝试解决这个问题一个月左右之后,结论是这个问题无法解决。至少它不能通过原生 .NET 和 OS 支持来解决。对于 Microsoft 来说,Windows XP 显然太旧了,无法支持 AES 256 位加密、使用 RSA 进行密钥交换的 SHA 256 位签名。世界上有 40% 的用户还在使用 XP,所以这个决定真的很奇怪。

Windows server 2003中添加了这种支持(我尝试将 2003 年的 schannel.dll 和 rsaenh.dll 添加到 XP,取得了一些进展,但远非理想)。

官方高级技术支持回答是:“目前情况看起来不太乐观,过去曾有另一位客户要求拥有知识库文章948963的 XP 版本,但该请求被我们的产品组拒绝。引入了这些安全功能在 Vista 中以及这两个平台之间 6 到 7 年的差异使得对 XP 做出这种改变是很困难的。”

因此,对于 SOAP 和 WebServices,我推荐 .NET,至少对于您无法控制双方的企业服务而言,我不推荐。

叹!

于 2011-09-22T07:29:20.077 回答