有没有办法使用FtpWebRequest使用C#中的客户端证书对FTP进行身份验证,这也可以在iis中运行?

时间:2018-05-21 09:51:08

标签: c#

我尝试过stackoverflow给出的解决方案。

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com");
        request.Credentials = new NetworkCredential("username", "");

// Query certificate from store

X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
const string tp = "2b6f8ac51a85cbaf429474a55304313968667611";
X509Certificate2 cert2 = store.Certificates.Find(X509FindType.FindByThumbprint, tp, true)[0];
store.Close();    

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com");
request.Credentials = new NetworkCredential("username", "");

// Query certificate from store

X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
const string tp = "2b6f8ac51a85cbaf429474a55304313968667611";
X509Certificate2 cert2 = store.Certificates.Find(X509FindType.FindByThumbprint, tp, true)[0];
store.Close();

// Add certificate into request
request.ClientCertificates.Add(cert2);

这适用于从控制台应用程序运行时。但是我已经在iis中部署了这个并且在发生错误之后从iis运行。

An exception of type 'System.Security.Authentication.AuthenticationException' occurred in System.dll but was not handled in user code
Additional information: A call to SSPI failed, see inner exception.
Inner exception:
{"An unknown error occurred while processing the certificate"}
at System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
   at System.Net.FtpWebRequest.RequestCallback(Object obj)
   at System.Net.CommandStream.Dispose(Boolean disposing)
   at System.IO.Stream.Close()
   at System.IO.Stream.Dispose()
   at System.Net.ConnectionPool.Destroy(PooledStream pooledStream)
   at System.Net.ConnectionPool.PutConnection(PooledStream pooledStream, Object owningObject, Int32 creationTimeout, Boolean canReuse)
   at System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage)
   at System.Net.FtpWebRequest.GetResponse()
   at Demo.Controllers.HomeController.GetAndDownloadFTPFile()
   at Demo.Controllers.HomeController.Index()
   at lambda_method(Closure , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f()

有人可以指导我吗?

2 个答案:

答案 0 :(得分:0)

我不确定其他所有内容,但是您的IIS apppool可能无法访问您认为在StoreLocation.CurrentUser

中的证书
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);

即我的假设是它无法找到证书

答案 1 :(得分:0)

我的问题是已解决的安装p12证书与受信任的证书文件夹。双击p12认证并将其与本地用户和最后一个浏览文件夹一起安装并添加到可信文件夹中。它对我有用。