2016-03-02 138 views
-1

我想問一下解釋。我使用X.509 certificate,當我試圖在我的數據發佈到一個webservice,我想,我收到以下錯誤溝通:「SSL握手期間未提供客戶端證書

No client certificate was presented during SSL Handshake

可以請您給我解釋一下什麼是問題

注:我使用.NET Framework 3.5/C#

我所做的恰恰是:首先,我將證書導入到店,然後我用下面的代碼,以便找到它,然後收到(使用AskForToken功能)令牌不過。 ,當我發送我的數據時,我得到了握手失敗。

我的第一個問題是爲什麼我成功獲得令牌(如果我沒有弄錯,客戶端(這是我的應用程序)將證書發送到服務器並獲得令牌,這意味着連接已完成)?

我的第二個問題,我必須改變或檢查以擺脫這種握手失敗。

private static string RequestSecurityToken() 
     { 
      WSTrustChannelFactory trustChannelFactory = new Microsoft.IdentityModel.Protocols.WSTrust.WSTrustChannelFactory(
         new CertificateWSTrustBinding(SecurityMode.TransportWithMessageCredential), 
         new EndpointAddress(new Uri(stsAddress))); 

      trustChannelFactory.TrustVersion = TrustVersion.WSTrust13; 

      string thumb = "fe14593dd66b2406c5269d742d04b6e1ab03adb1"; 
      trustChannelFactory.Credentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindByThumbprint, thumb); 
      trustChannelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust; 
      cert = trustChannelFactory.Credentials.ClientCertificate.Certificate; 

      var tokenString = AskForToken(serviceURL, trustChannelFactory); 
      trustChannelFactory.Close(); 
      return tokenString; 
     } 

回答

0

SSL有可能要求客戶端驗證。因此,客戶端(您的應用程序)必須在連接建立之前發送服務器信任的證書。看起來這個客戶端認證失敗了,因爲你的應用程序不會發送這樣的證書。

根據您嘗試使用的網絡服務,不可能創建這樣的證書,因爲服務器只信任來自例如應用程序的應用程序。某個公司。

+0

謝謝@DerKasper的回答,您可以在我發送證書的代碼中看到。任何想法可能是什麼問題。 謝謝 –

+0

@ R.You:我不知道ChannelFactory的工作方式,只是ssl如何工作,但我的方法是: - 首先檢查您的代碼是否不僅發送證書,而且是真正從您的PC。使用Wireshark(對於ssl使用過濾器),因爲您應該使用證書請求從服務器中找到消息,並應找到客戶端發送證書。 如果發送證書,則問題不在應用程序中,而在服務器中,該服務器拒絕您的證書。服務器將不得不被改變,以便他接受你的證書。你能從任何應用程序連接到服務器嗎? – DerKasper

+0

謝謝@DerKasper,不幸的是我無法從任何應用程序連接到服務器。 我使用Wireshark的,你建議報告,並逮住交流的順序如下: 1)_ **客戶你好** _ 2)_ **服務器你好** _ 3)_ **認證** _ 4)_ **證書請求,服務器問候完成** _ 5)_ **證書,客戶端密鑰交換,變更密碼說明,加密握手消息** _ 6)_ **更改密碼規範,加密的握手消息** _。 你能解釋一下這是什麼意思?它有助於解決我的問題嗎? –

0

在SSL握手過程中,客戶端將其公鑰顯示給另一方,顯然沒有發生。

我不是C#程序員,所以無法提供代碼。但是您需要創建一個SSL密鑰對(私鑰+公鑰對)並使用它來定義您的SSL套接字等。