1

我的 Windows Phone 应用程序使用来自使用 Apache Tomcat 的远程服务的数据。到目前为止,对服务的每次调用都是使用http://协议进行的,但最近服务开发人员添加了一个安全层,现在我必须使用https://协议发出请求。

我知道 Windows Phone 的默认行为是避免每个自签名证书,最佳情况是拥有由证书颁发机构签名的证书,但我没有。在网上搜索我发现可以在WP设备上安装自签名证书,有两种选择:

  1. 发送邮件并附上.cer文件。当我们尝试打开它时,WP 开始安装过程。
  2. .cer文件放在服务器的公共空间中,可通过http://协议访问。在应用程序首次启动时,我们尝试使用设备浏览器打开其 URL,然后 WP 开始安装过程。

b 选项对用户来说不那么烦人,所以我就是这样做的。

我在我的 PC 上使用 Internet Explorer创建* .cer 文件。我不知道我这一步做得好不好。我知道可以使用 Mozilla Firefox 导出,但列表中没有.cer文件格式。

对服务的请求返回此错误:“远程服务器返回错误:NotFound。”</p>

这是我在未实施安全性时使用的方法:

public void Start()
{
    String requestString = url + method + parameters;
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestString);
    request.BeginGetResponse(FinishHttpWebRequest, request);
}

public void FinishHttpWebRequest(IAsyncResult result)
{
    HttpWebRequest request = result.AsyncState as HttpWebRequest;
    if (request != null)
    {
         try
         {
               WebResponse response = request.EndGetResponse(result);
               Stream streamResponse = response.GetResponseStream();
               string responseString = new StreamReader(streamResponse).ReadToEnd();
         }
         catch (WebException e)
         {
                …
         }
     }
 }

对于开发,我通过邮件发送.cer文件并使用 Windows Phone Emulator 打开它,Windows Phone 告诉安装成功但仍然出现错误。

这些是我正在使用的选项:

选项 A. 与http协议完全相同的方法

private void Start(string url)
{
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
     request.UseDefaultCredentials = true;
     request.AllowAutoRedirect = true;
     request.BeginGetResponse(FinishWebRequest, request);
}


public void FinishWebRequest(IAsyncResult result)
{
     HttpWebRequest request = result.AsyncState as HttpWebRequest;
     if (request != null)
     {
          try
          {
                WebResponse response = request.EndGetResponse(result);
                Stream streamResponse = response.GetResponseStream();
                string responseString = new StreamReader(streamResponse).ReadToEnd();
          }
          catch (WebException ex)
          {
             …
          }
     }
 }

选项 B. 使用 Web 客户端

private WebClient myWebClient;

public void Start(string requestString)
{
     myWebClient = new WebClient();
     myWebClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(DownloadStringCompleted);
     myWebClient.DownloadStringAsync(new System.Uri(requestString));
}

void DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
     try
     {
         string Text = e.Result;
     }
     catch
     {
         ...
     }
}

选项 3 与httpwebrequest 的 msdn 页面底部的示例非常相似,也与选项 1 非常相似。

我错过了什么?认证安装是否正确?

如果您需要更多信息,请索取

感谢您的帮助。

编辑 2013/07/18 我添加了更多信息,我认为它是可用的。

我使用 Microsoft Internet Explorer导出到.CER文件的步骤(我的 Windows 安装不是英文的,所以我确信不是每个选项都与我写的完全一样),类似于:

  1. 打开https://myWebApp.com
  2. 加载窗口:“此网站的安全证书有问题”
  3. 点击“继续浏览本网站”
  4. 在顶部,我单击“查看证书”
  5. 在“详细信息”选项卡中执行“复制到文件”。
  6. 通过邮件发送生成的文件并在 Windows Phone 模拟器中打开它。

我不知道证书是否必须在之前导出它的根权限证书中,我不知道。

我得到的 WebException ex 具有以下数据:

信息:

   "The remote server returned an error: NotFound."

地位:

   UnknownError      

堆栈跟踪:

   at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
   at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
   at MyApp.Model.Webservice.SecureRestClient.FinishWebRequest(IAsyncResult result)
   at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2)
   at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadPool.WorkItem.doWork(Object o)
   at System.Threading.Timer.ring()

编辑 2

在文档 Windows® Phone 7 和证书中说,建议重新启动设备以激活最近安装的证书。

我将证书发送到我的 HTC Radar 并且安装成功。但是,当我使用 Internet Explorer 打开https://myWebApp.com时,会加载窗口:“有问题……”所以我想我在导出.cer文件时遗漏了一些东西。

编辑 3

现在可以在设备上调试(解锁步骤),但情况没有改变。您需要更多信息吗?我错过了什么?我总是得到未找到的异常。

谢谢!

4

1 回答 1

0

尝试将您的证书导出到 P7B 文件并在 Windows Phone 上导入它。 更多细节在这里

于 2013-11-17T17:22:49.440 回答