2011-09-06 19 views
0

這裏是簡短的總結: 我有一個WCF客戶端(.NET 4.0),在Windows 7(64位)上表現良好,但在XP(32位)。由於我有很多XP客戶,這是一個巨大的問題。具有智能卡認證的WCF客戶端在Win7上工作,但不在XP上

  • 客戶端是從服務提供商提供的wsdl文件生成的。
  • 服務是SOAP 1.2 SSL上,與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更少一樣MtomMessageEncodingB參與重寫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, working example (same code): 
System.Net Information: 0 : [3748] SecureChannel#23960260 - Certificate is of type X509Certificate2 and contains the private key. 
System.Net Information: 0 : [3748] AcquireCredentialsHandle(package = Microsoft Unified Security Protocol Provider, intent = Outbound, scc  = System.Net.SecureCredential) 
System.Net Information: 0 : [3748] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = (null), targetName = cistest.apis-it.hr, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation) 
System.Net Information: 0 : [3748] InitializeSecurityContext(In-Buffer length=0, Out-Buffer length=122, returned code=ContinueNeeded). 
System.Net.Sockets Verbose: 0 : [3748] Socket#46340781::Send() 
System.Net.Sockets Verbose: 0 : [3748] Data from Socket#46340781::Send 
System.Net.Sockets Verbose: 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 Verbose: 0 : [3748] 00000010 : C6 C9 65 17 D7 EC C1 A1-15 72 E1 56 80 F4 5A BB : ..e......r.V..Z. 
System.Net.Sockets Verbose: 0 : [3748] 00000020 : A8 4C 50 54 84 D4 3E 86-29 68 CA 00 00 18 00 2F : .LPT..>.)h...../ 
System.Net.Sockets Verbose: 0 : [3748] 00000030 : 00 35 00 05 00 0A C0 13-C0 14 C0 09 C0 0A 00 32 : .5.............2 
System.Net.Sockets Verbose: 0 : [3748] 00000040 : 00 38 00 13 00 04 01 00-00 30 FF 01 00 01 00 00 : .8.......0...... 
System.Net.Sockets Verbose: 0 : [3748] 00000050 : 00 00 17 00 15 00 00 12-63 69 73 74 65 73 74 2E : ........cistest. 
System.Net.Sockets Verbose: 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 Verbose: 0 : [3748] 00000070 : 00 17 00 18 00 0B 00 02-01 00     : .......... 
System.Net.Sockets Verbose: 0 : [3748] Exiting Socket#46340781::Send() -> 122#122 

XP, not working example (same code): 
System.Net Information: 0 : [2272] SecureChannel#7307181 - Certificate is of type X509Certificate2 and contains the private key. 
System.Net Information: 0 : [2272] AcquireCredentialsHandle(package = Microsoft Unified Security Protocol Provider, intent = Outbound, scc  = System.Net.SecureCredential) 
System.Net Information: 0 : [2272] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = (null), targetName = cistest.apis-it.hr, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation) 
System.Net Information: 0 : [2272] InitializeSecurityContext(In-Buffer length=0, Out-Buffer length=77, returned code=ContinueNeeded). 
System.Net.Sockets Verbose: 0 : [2272] Socket#32308990::Send() 
System.Net.Sockets Verbose: 0 : [2272] Data from Socket#32308990::Send 
System.Net.Sockets Verbose: 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 Verbose: 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 Verbose: 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 Verbose: 0 : [2272] 00000030 : 00 05 00 0A 00 09 00 64-00 62 00 03 00 06 00 13 : .......d.b...... 
System.Net.Sockets Verbose: 0 : [2272] 00000040 : 00 12 00 63 01 00 00 05-FF 01 00 01 00   : ...c......... 
System.Net.Sockets Verbose: 0 : [2272] Exiting Socket#32308990::Send() -> 77#77 
System.Net.Sockets Verbose: 0 : [2272] Socket#32308990::Receive() 
System.Net.Sockets Verbose: 0 : [2272] Data from Socket#32308990::Receive 
System.Net.Sockets Verbose: 0 : [2272] 00000000 : 15 03 01 00 02         : ..... 
... 
System.Net.Sockets Verbose: 0 : [2272] Exiting Socket#32308990::Receive() -> 5#5 
System.Net.Sockets Verbose: 0 : [2272] Socket#32308990::Receive() 
System.Net.Sockets Verbose: 0 : [2272] Data from Socket#32308990::Receive 
System.Net.Sockets Verbose: 0 : [2272] 00000005 : 02 28           : .(
System.Net.Sockets Verbose: 0 : [2272] Exiting Socket#32308990::Receive() -> 2#2 
System.Net.Sockets Verbose: 0 : [2272] Socket#32308990::Receive() 
System.Net.Sockets Verbose: 0 : [2272] Data from Socket#32308990::Receive 
System.Net.Sockets Verbose: 0 : [2272] 00000007 :             : 
System.Net.Sockets Verbose: 0 : [2272] Exiting Socket#32308990::Receive() -> 0#0 
System.Net.Sockets Verbose: 0 : [2272] Socket#32308990::Dispose() 

回答

1

好,一個月後左右試圖解決這個問題,結論是:此問題可能無法解決。至少它不能用本地.NET和OS支持解決。 的Windows XP顯然是太老了微軟支持AES 256位加密,SHA 256位的簽名與RSA密鑰交換。世界上仍有40%的用戶仍在使用XP,所以這個決定真的很奇怪。

這種支持加入到Windows server 2003(我一直在努力,從2003年加入的Schannel.dll和Rsaenh.dll到XP,一些進展,但遠不夠理想)。

正式高級技術支持的回答是:「目前的情況看起來並不樂觀,有過去從另一個客戶的要求有KB文章948963的XP版本,但該請求被我們的產品組拒絕。這些安全功能是在Vista中引入的,兩個平臺之間的6 - 7年差異使得難以對XP進行更改。「

所以,對於SOAP和Web服務,我會建議.NET,至少不會爲企業服務,你不用管兩側。

感嘆!

相關問題