Certificate between IoT hub and devices connection

There are a lot of questions from our customers about certificate issues during the TLS connection between IoT devices and IoT hub. So here I write this article to reveal something that you need to know when you are trying to connect your IoT devices to Azure IoT hub. IoT Hub requires all device communication…

0

如何在Windows Store应用程序中进行TLS/SSL通讯

Windows Store应用程序经常需要使用各种Web服务,为了安全起见,这些服务最好是通过https来访问。那么我们如何在Windows Store应用中使用证书来进行安全的通讯呢,我这里就做一个简单的小结。 首先,如果服务端使用了服务端认证,那么Windows Store应用作为客户端连接服务器的时候,需要验证该服务端证书在客户端是受信任的。那么分两种情况: 一.         如果该证书是被受信任的机构签发的,而且该机构的Root证书已经缺省安装到了客户端,那么,Windows Store应用程序只需要在Package.appxmanifest文件中加入对Shared Uer Certigficates这个Capability的支持,应用程序会自动到系统的Certificate Store中找到该Root证书并通过验证。不过这种方法也有一个问题,由于客户端只验证服务端证书是否来自于同一个Root,所以我们可以很容易的伪造一张服务端证书来通过验证。 二.         如果该证书是一张自签名的证书,那么确实情况下客户端是不会安装这张证书的。那么这时候Windows Store应用程序就无法通过证书的验证。这个问题也好解决,向第一种情况靠拢呗。如果在客户端已经手动安装了这张自签名的证书,那就没问题啦。所以我们需要做的就是将这个自签名的证书从服务端下载下来,然后一台一台的安装到客户端Certificate Store的Root目录下。 可是,这个方法也太不靠谱啦!在很多情况下,我是没有办法将自签名证书一台一台安装到客户端的呀。有没有其他办法呢?有的!我们可以将证书放在Windows Store应用程序中,然后通过Package.appxmanifest的Declarations添加这张证书: 1.       在Available Declarations中选择Certificates,点击Add。 2.       在右边的Trust flags勾选上Exclusive Trust,加上这个以后,就能够保证不是随随便便用一张服务端证书就能够把客户端应用糊弄过去啦。 3.       在右边的Certificates中点击Add New, Store Name需填写Root,Content中添加你所要验证的服务端证书。 4.       在添加以后,该服务端证书会自动添加到你的项目中,我们需要在该证书的文件属性中将Copy to Output Directory改为Copy if newer。 这样,我们就可以很方便的完成服务端验证了,而且也不用担心有人通过伪造服务端证书来截取通讯内容。 接下来我们看一下需要客户端认证的情形。这种情况下,我们需要做两件事: 一.保证客户端已经正确安装了客户端证书。你可以把你的证书文件放在项目中或者远程服务器上。当你的Windows Store应用获得了PKCS12格式的证书数据以后,就可以调用 CertificateEnrollmentManager.UserCertificateEnrollmentManager.ImportPfxDataAsync或者CertificateEnrollmentManager.InstallCertificateAsync来安装该证书。 二.一旦客户端已经正确安装了客户端证书,那么就需要在Windows store应用中获得该证书的实例,这可以通过CertificateStores.FindAllAsync来枚举所有的证书实例,然后找出你所需要的那个,FindAllAsync也支持传入一个CertificateQuery参数来进行筛选。 在获得证书实例之后,我们就可以通过HttpBaseProtocolFilter来设置客户端证书,然后将HttpBaseProtocolFilter作为参数传入HttpClient中实现客户端验证,示例代码如下: var certificates = await CertificateStores.FindAllAsync(); var certificate = certificates.Where(w => w.Subject.Equals(SUBJECTNAME)).FirstOrDefault();…

0

流媒体发布–在Windows Store应用中使用Azure媒体服务之三

经过前面的努力,我们终于完成了视频文件的上传和编码,那么接下来的最后一步就是将如何该视频发布出去了。相对应前面的步骤,这一次就要简单的多了。  首先,在确认编码已经成功之后,我们可以获得输出的媒体的Asset编号:  private async Task<string> CreateAssetFile(string accessToken, string assetId) {     var request = (HttpWebRequest)HttpWebRequest.Create(“https://wamshknclus001rest-hs.cloudapp.net/api/Files”);     request.Method = “POST”;     request.ContentType = “application/json;odata=verbose”;     request.Accept = “application/json;odata=verbose”;       string requestbody =     “{\”Name\”:\”test.wmv\”, \”ContentFileSize\”:\”0\”,\”MimeType\”:\”video/x-ms-wmv\”,\”ParentAssetId\”:\”” + assetId + “\”}”;       request.Headers[“DataServiceVersion”] = “3.0”;     request.Headers[“MaxDataServiceVersion”] = “3.0”;     request.Headers[“x-ms-version”] = “2.7”;     request.Headers[“Authorization”] =…

0

媒体编码–在Windows Store应用中使用Azure媒体服务之二

在上一篇文章里,我们已经了解了如何使用REST API将多媒体数据上传给Azure的媒体服务,但这只是万里长征走完了第一步,为了能够使用多媒体数据,我们需要使用Azure强大的处理功能将数据编码成我们合适的格式,然后分发出去,在这一篇里我们就来讨论多媒体数据编码的问题。 使用用REST API,我们可以将任意格式的文件上传到服务器上,但是为了使媒体数据能够正确的发布,Azure Media需要安装了合适的编码器来做编解码的工作。Azure Media上已经内置了缺省的编码器,可以支持市面上主流的流媒体格式,同时,第三方也可以为Azure Media开发自己的编码器。 上一篇文章中我们已经把媒体文件上传到Azure Media服务器上,但是如果需要encoder的话,这个上传还是不完全的,我们需要在上传之前建立一个Asset文件: private async Task<string> CreateAssetFile(string accessToken, string assetId) {     var request = (HttpWebRequest)HttpWebRequest.Create(“https://wamshknclus001rest-hs.cloudapp.net/api/Files”);     request.Method = “POST”;     request.ContentType = “application/json;odata=verbose”;     request.Accept = “application/json;odata=verbose”;       string requestbody =     “{\”Name\”:\”test.wmv\”, \”ContentFileSize\”:\”0\”,\”MimeType\”:\”video/x-ms-wmv\”,\”ParentAssetId\”:\”” + assetId + “\”}”;       request.Headers[“DataServiceVersion”] = “3.0”;     request.Headers[“MaxDataServiceVersion”] = “3.0”;…

0

媒体上传–在Windows Store应用中使用Azure媒体服务之一

Windows Azure的媒体服务预览已经于8月15日在中国上线,我已经迫不及待的想在在Windows Store应用中加入媒体服务功能带来的便利了。可是,一个很让人沮丧的事情是,目前的Azure Media的SDK还不支持windows Store应用。不过没关系,我们还有REST API可以使用,这里我就讲解一下如何在Windows store应用中完成媒体文件的上传,编码及发布。在这一篇blog中,我们首先来看一下媒体文件的上传。 为了使用Azure Media,你首先需要在Azure上创建一个媒体服务账号。该账号用以提供访问该媒体服务所需的信息。下面是创建媒体服务账号的步骤: 1.       登录进入Azure管理门户: https://manage.windowsazure.com/ 如果你还没有Windows Azure的账号,那么有两种办法可以免费试用Windows Azure: a.  因为Windows Azure已经在中国落地,你可以到http://www.windowsazure.cn上去申请试用,这段时间1元试用可是有大礼包送的哦。 b.  你可以登录全球的Windows Azure网站http://www.windowsazure.com来建立一个试用账号。在建立使用账号过程中如果无法进行电话或者短信验证的话,可以到以下网址提交一个问题来要求免去电话和短信验证步骤: https://support.microsoft.com/oas/default.aspx?prid=14238&ln=en-us&st=1&wfxredirect=1   在提交问题的时候,你需要设定如下支持类型   然后再后续的邮件中再描述一下你遇到的问题,要求免去电话和短信验证步骤就可以了。 2.  点击新建->应用服务->媒体服务->快速创建,输入所需的名称,选择媒体服务存放的地点以及存储服务的账户。如果你之前没有建立存储服务的账户的话,你也可以选择“新建存储账户”。然后点击“创建媒体服务”就创建了一个媒体服务账号:     3.       点击新创建的媒体服务账号->管理密钥,你就可以获得访问该媒体服务所需的账户名称以及访问密钥,请将这两个字符串拷贝出来,后面我们会在编程的时候使用到:   在配置完Azure Media以后,我们就可以在Windows Store应用程序中通过REST API来传文件了。 首先,我们创建一个新的Windows Store应用,然后为项目添加两个引用: Microsoft.WindowsAzure.Storage Newtonsoft.Json   为了演示视频文件的上传,我们可以在示例代码中加入一个Button,然后在Button的处理函数中添加相关的代码。我们需要定义两个string来存放前面获得的Account Name和Access Key。另外,我们还需要定义两个string来存放对应的存储账户的Account Name和Access Key以便于后续对存储容器的直接访问。对应的存储账户信息可以从媒体服务的仪表板中获得:   接下来就是具体的实现代码了,对于要发送的http报文的内容,下面的MSDN链接已经有详细的描述,我这边就不再重复了: http://msdn.microsoft.com/en-us/library/azure/jj129593.aspx 根据上述的描述,我们首先要获得一个Access Token,代码如下: public class AcsToken…

0

Turn off Notification Hub in Azure Mobile Service to use Legacy Push

Currently when you create a new Windows Azure Mobile Service to send push notification(detailed information can be found in Get started with push notifications in Mobile Services ),  the  notification hub is by default integrated with your mobile service, we really want people to move away from the legacy push, however, for the rare cases…

0

注意Windows Phone代码文件的大小

我们收到一些反馈说某些Windows Phone应用程序无法通过应用程序商店进行安装。最终用户在安装应用的时候可能会遇到以下错误:   这个问题是因为过大的程序集文件导致的。如果你在开发应用的时候将所有的代码放在一个项目中,然后生成了一个很大的dll文件,这个dll可能会因为内存限制无法通过安装流程。目前为止,您可以通过将该dll分割成功多个小的dll来解决该问题。  

0

Take care of your Windows Phone code assembly size.

It’s reported that there are some Windows Phone applications which can’t be deployed onto the phones via Windows Phone store. The end user may encounter following error:   This problem can be caused by large size of the assembly. If you put all the code into one Widnwos Phone project and generate a single large dll. The dll…

0

使用Windbg分析Windows Store 应用的崩溃问题

对于上架的windows store应用程序,微软提供了反馈机制让用户在程序崩溃的时候可以自动上传迷你转储(mini dump)文件。这些dump文件对于分析用户遇到的问题是相当有帮助的,这里我就如何使用windbg分析转储文件来做一个示范,我的目标是让即使是没用过windbg的人也能够使用它来分析转储文件,所以如果你发现文章中哪里有让你迷惑的地方,请告诉我。:) 首先,你需要有windows debugger tools,也就是windbg。这是一个强大的系统级调试工具,它附属于Windows WDK和Windows SDK安装包中,WDK这玩意儿太小众了,我们这边暂且不提,所以安装windbg的最佳办法就是安装Windows SDK了,Windows SDK很大,你在安装的时候你可以选择只安装Debugging Tools for Windows。Windows SDK for Windows 8.1的下载地址如下: http://msdn.microsoft.com/en-US/windows/desktop/bg162891 在安装完windbg以后,我们就可以来分析转储文件了。但是且慢,转储文件呢,转储文件到哪里去找? 如果你找不到的话,那么请随我来。当你的windows store应用上架以后,你就可以看到一个“报告”按钮。   点击这个“报告”按钮,你就可以看到应用程序的统计数据以及左边菜单栏中的“质量”链接:   点击“质量”链接你会看到程序关于质量方面统计数据,这里直接忽略前面的三项看第四项“最常见的崩溃情况”,这里就提供了客户上传的转储文件。   选取你想要看的转储文件,然后下载,下载的文件是一个cab格式的压缩包,将它解压缩就得到了dmp后缀的转储文件了。我们会在这里演示两个转储文件的分析。 用windbg打开第一个转储文件,windbg会在命令窗口中显示报错的代码,这通常是在系统的组件中,对我们查抄问题并没有帮助。比如以下就是载入转储文件后显示的内容: Windows 8.1 Version 9600 MP (4 procs) Free x86 compatible Product: WinNt, suite: SingleUserTS Personal Built by: 6.3.9600.16384 (winblue_rtm.130821-1623) Machine Name: Debug session time: Tue Jan 28…

0

如何在WP8应用中安全的使用Azure Blob存储

在前面一篇文章中,我们演示了在Windows store应用中安全的使用Azure Blob存储的步骤。Windows Phone上的步骤与此类似,只是在客户端代码以及设置方面有一些区别。但是为了方便读者阅读,我这里将就Windows Phone应用中如何安全的使用Azure Blob存储单独写一遍。这样对于Windows Phone开发者来说,只需要看这篇文章就够了。 我们已经在这篇文章中演示了在Windows Phone应用中使用Azure Blob存储的基本步骤,但是,对于一个商业应用来说,保证数据的安全性是很重要的一环。上次文章的代码中,对Blob的访问权限是通过PublicAccess来控制的,理论上如果PublicAccess设置为OFF,那么第三方就应该无法访问该Blob。但是这里有一个明显的安全隐患:我们的代码中明文存储了Access Key字符串,而通过一些反编译工具第三方能够很容易的获得这个字符串。如果这个Access Key被暴露的话,那么Blob中的内容就毫无秘密可言了。为此,我们需要找到一个可靠的办法来保证验证信息的安全。 为了解决这个问题,我们需要做到以下两条: 1.保证用户在未经授权的情况下无法获得验证信息。 2.用户通过授权后获得的验证信息不能被重复使用。 对于第一条,我们可以自己建立一个服务器,与该服务器的连接需要先进行身份验证,然后从服务器上获得用于连接Windows Azure 存储服务的验证信息。不过我们既然已经使用了Windows Azure,那么完全可以使用Windows Azure  云服务来为我们做同样的事情。 对于第二条,Windows Azure 存储服务提供了共享访问签名(Shared Access Signature)来保证验证信息的时效性。共享访问签名是一个在特定时间间隔内授予容器、Blob以及其他存储对象受限访问权限的 URI。也就是说,共享访问签名是一个URI, 客户端通过这个URI能够在规定时间内访问容器和Blob, 而超过了时间段的话这个URI就无效了,需要重新获取。 结合这两种方式,那么我们就能够实现对验证信息的保护了。我们将生成共享访问签名的代码放在Windows Azure云服务上,客户端通过访问云服务接口获得共享访问签名来访问Windows Azure存储服务商的Blob。 那么让我们来看看如果要安全的实现与前一篇文章相同的功能所需要完成的步骤。 一.   创建云服务并实现服务接口: 1. 从以下链接下载并安装Azure Cloud Service SDK For .NET: http://www.windowsazure.com/en-us/downloads/?sdk=net 针对不同的Visual Studio版本,您需要安装相应的SDK,这样在您的Visual Studio的项目模板中会出现Azure Cloud Service的模板。 2. 通过Azure Cloud Service模板创建一个Cloud服务,在项目向导中加入WCF Service Web Role:  …

0