2013-08-07 74 views
3

我已经下载了通过https提供API的产品的试用版。目前我的asp.net mvc的web应用程序中我做了以下执行的API调用该产品的试用版: -Security.Authentication.AuthenticationException:根据验证程序,远程证书无效

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create(RackJoin rj, FormCollection formValues) 
     { 
      string controllername = RouteData.Values["controller"].ToString(); 
      if (ModelState.IsValid) 
      { 
       var message = ""; 
       var status = ""; 
       long assetid = new long(); 
       XmlDocument doc = new XmlDocument(); 
       using (var client = new WebClient()) 
       { 
        var query = HttpUtility.ParseQueryString(string.Empty); 
        foreach (string key in formValues) 
        { 
         query[key] = this.Request.Form[key]; 
        } 

query["username"] = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiUserName"]; 
query["password"] = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiPassword"]; 
string apiurl = "https://win-spdev:8400/servlets/AssetServlet"; 
//code goes here….. 
        var url = new UriBuilder(apiurl); 
        url.Query = query.ToString(); 

,但我会出现以下情况例外: -

发生错误:System.Security.Authentication.AuthenticationException: 根据验证 过程,远程证书无效。在 System.Net.Security.SslState.StartSendAuthResetSignal在 System.Net.Security.SslState(ProtocolToken 消息,AsyncProtocolRequest asyncRequest,例外的例外)在 System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken 消息,AsyncProtocolRequest asyncRequest) .StartSendBlob(字节[]来电,的Int32 计数,AsyncProtocolRequest asyncRequest)在 System.Net.Security.SslState.ProcessReceivedBlob(字节[]缓冲液,的Int32 计数,AsyncProtocolRequest asyncRequest)在 System.Net.Security.SslState.StartReadFrame (Byte [] buffer,Int32 readBytes,AsyncProtocolRequest asyncRequest)at System.Net.Security.SslState.StartReceiveBlob(字节[]缓冲液, AsyncProtocolRequest asyncRequest)在 System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken 消息,AsyncProtocolRequest asyncRequest)在 System.Net.Security.SslState.StartSendBlob(字节[]来电,的Int32 计数,AsyncProtocolRequest asyncRequest)处 System.Net.Security.SslState.StartReadFrame(字节[]缓冲 System.Net.Security.SslState.ProcessReceivedBlob(字节[]缓冲液,的Int32 计数,AsyncProtocolRequest asyncRequest)的Int32 的ReadBytes,AsyncProtocolRequest asyncRequest)在 System.Net.Security.SslState.StartReceiveBlob(Byte [] buffer, AsyncProtocolRequest asyncRequest)at S ystem.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken 消息,AsyncProtocolRequest asyncRequest)在 System.Net.Security.SslState.StartSendBlob(字节[]来电,的Int32 计数,AsyncProtocolRequest asyncRequest)在 System.Net.Security.SslState .ProcessReceivedBlob(字节[]缓冲液,的Int32 计数,AsyncProtocolRequest asyncRequest)在 System.Net.Security.SslState.StartReadFrame(字节[]缓冲液,的Int32 的ReadBytes,AsyncProtocolRequest asyncRequest)在 System.Net.Security.SslState.StartReceiveBlob (Byte [] buffer, AsyncProtocolRequest asyncRequest)at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message,As yncProtocolRequest asyncRequest)在 System.Net.Security.SslState.StartSendBlob(字节[]来电,的Int32 计数,AsyncProtocolRequest asyncRequest)在 System.Net.Security.SslState.ForceAuthentication(布尔receiveFirst, 字节[]缓冲液,AsyncProtocolRequest asyncRequest )在在 System.Threading.ExecutionContext.RunInternal(ExecutionContext中 的ExecutionContext在System.Net.TlsStream.CallProcessAuthentication System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)(对象 状态),ContextCallback回调,对象的状态,布尔型 preserveSyncCtx) 系统。Threading.ExecutionContext.Run(的ExecutionContext 的ExecutionContext,ContextCallback回调,对象的状态,布尔 preserveSyncCtx)在 System.Threading.ExecutionContext.Run(的ExecutionContext 的ExecutionContext,ContextCallback回调,对象状态)在 System.Net.TlsStream.ProcessAuthentication( LazyAsyncResult结果) System.Net.TlsStream.Write(Byte [] buffer,Int32 offset,Int32 size)at System.Net.PooledStream.Write(Byte [] buffer,Int32 offset,Int32 size) at System.Net .ConnectStream.WriteHeaders(布尔异步)

巴林在米IND,我可以调用API没有任何问题,如果我直接从我的Web浏览器中调用的API如下: -

https://win-spdev:8400/servlets/AssetServlet?username=tmsservice&password=test2test2&assetType=Rack&operation=UpdateAsset&assetName=rack9090909858585&accountName=GROUP&siteName=test%20site&productName=rackproductone 

那么,这个问题涉及到的是,API是通过https,而且因为我在我的开发机器内部使用产品的试用版时,是否应该安装有效的证书?或者问题与安全认证无关? 谢谢

回答

24

问题是您尚未配置有效的SSL证书。由于有效的SSL证书花费金钱,为了开发目的,我猜你使用了自动签名证书。您可以通过设置忽略这些错误ServerCertificateValidationCallback静态属性在Application_Start

System.Net.ServicePointManager.ServerCertificateValidationCallback += 
    (s, cert, chain, sslPolicyErrors) => true; 

注意:避免在生产中这样做。在LIVE上部署时,请确保您使用的是有效的SSL证书。

+0

非常感谢它运作良好,并确保生产我将使用有效的证书。 –

+0

我得到同样的错误,而从控制台应用程序连接smtp服务器,在主函数的开始使用代码,它解决了问题....非常感谢你分享它。 –

0

随着点头达林季米特洛夫... VB.NET人就可以使用这个(在我的web应用程序的Global.asax.vb):

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) 
System.Net.ServicePointManager.ServerCertificateValidationCallback = Function(s, cert, chain, sslPolicyErrors) 
                     Return True 
                    End Function 
End Sub 
相关问题