• Azure编程笔记(4):配置Cloud Service的证书


    

    我们在Microsoft Azure中部署CloudService的时候,可能会用到证书。通常在两种情况下须要用到证书。一是把证书安装在server端。此时证书用来建立HTTPS/SSL连接,以便保护传输中的数据。

    二是把证书部署在client。此时client发起连接请求时。它会把证书信息加入到请求中。server端收到请求之后,会验证当中的证书是不是合法的证书。这样的情况下证书是用来验证用户的。接下来我们分两种情况来讨论怎样管理证书。

    把证书安装在server端

    假设我们用ASP .NETWeb API开发一个WebRoleCloudService。假设我们希望用户连接这个由WebAPI开发的server端时须要建立HTTPS连接,那么我们就得在server端安装证书。CloudService是部署在Azure的虚拟机上。我们自然不喜欢每次部署CloudService的时候都远程登陆到虚拟机上手动安装证书。

    为了能够在部署Cloud Service的时候自己主动安装证书,我们首先须要把证书上传到CloudService上。

    Azure的管理站点(https://manage.windowsazure.cn)的CloudService相应的网页上。我们能够找到管理证书的页面,例如以下图所看到的:

     

    接着我们在Cloud ServiceServiceDefinition.csdef文件里加入例如以下内容:

       

    <Certificates>
      <Certificate name="xxxxyyyy" storeLocation="LocalMachine" storeName="My" />
    </Certificates>
    

    这里我们指定了Cloud Service须要用到一个证书。该证书正是我们刚刚上传的证书。在部署CloudService时,Azure会自己主动把该证书安装到虚拟机上去。

    接下来我们打开一个HTTPS的port。这须要在CloudServiceServiceDefinition.csdef文件里再加入例如以下内容:

    <Sites>
        <Site name="Web">
        <Bindings>
            <Binding name="Endpoint1" endpointName="Endpoint1" />
        </Bindings>
        </Site>
    </Sites>
    <Endpoints>
        <InputEndpoint name="Endpoint1" protocol="https" port="443" certificate="xxxxyyyy"/>
    </Endpoints>
    

    在上述内容中我们定义了一个port是443EndPoint,与这个EndPoint连接的协议是HTTPS。我们还设置了建立HTTPS须要的证书。当client试图连接该server端时,部署着CloudService的虚拟机上的IIS就会自己主动找到该证书,并用该证书建立HTTPS连接。

    把证书安装在client

    我们在开发一个server端程序时。常常会限制仅仅有特定的用户才干连接该server。

    通常有两种办法实现限制。一种办法是给合法的用户建立账号和password,让合法的用户在使用服务之前先输入username和password进行验证。还有一种办法是给合法用户一张证书。这些用户来建立连接使用服务的时候都要附上证书。server端会依据请求中的证书来验证请求是否合法。

    假设是用证书来验证用户,那么须要在client安装证书。假设client用HttpClient和server端建立连接,那么client能够通过例如以下代码在请求中附上证书信息:

    X509Certificate2 certificate = GetCertificateByThumprint(thumprint);
    var webRequestHandler = new WebRequestHandler();
    webRequestHandler.ClientCertificateOptions= ClientCertificateOption.Manual;
    webRequestHandler.UseDefaultCredentials= false;
    webRequestHandler.ClientCertificates.Add(certificate);
    
    httpClient= new HttpClient(webRequestHandler);
    

    为了让server端在接收到请求时验证证书信息,我们首先要在server端的配置中加入一个MessageHandler

    假设是用ASP.NETWEBAPI实现server端,能够在WebApiApplication. Application_Start加入例如以下代码:

    GlobalConfiguration.Configuration.MessageHandlers.Add(new CertificateAuthenticationHandler());
    

    Handler能够用例如以下代码实现:

    public class CertificateAuthenticationHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            X509Certificate2 certificate = request.GetClientCertificate();
            if(!CertificateValidator.IsValid(certificate))
            {
                return Task<HttpResponseMessage>.Factory.StartNew(() =>
                    request.CreateResponse(HttpStatusCode.Unauthorized));
            }
    
            return base.SendAsync(request, cancellationToken);
        }
    }
    

    在上述代码中,我们每收到一个请求。都会从请求中得到附带的证书信息,然后再验证证书是否合法。假设证书无效,则返回代码为401HTTP错误代码。

    上述代码并没有问题,但是当我们运行server端代码是。就会发现并没有从请求中读出的证书信息总是null

    不能从请求中读出证书信息的原因是server端的IIS没有接收证书。在IIS里有一个SSL选项是用来决定是否接收证书。它的默认设置例如以下:

     

    IIS的默认设置里,来自client的证书被忽视了。那么自然前面的代码不能得到证书信息。因此我们不得不让server端的IIS接受来自client的证书。为了实现这一目的,我们首先须要在server端代码的web.config文件里加入例如以下内容:

    <system.webServer>
      <security xdt:Transform="Insert">
        <access sslFlags="Ssl, SslNegotiateCert" />
      </security>
    </system.webServer>
    

    上述配置文件定了IIS的配置參数。接下来我们须要写一个脚本来改动IIS的配置參数:

    %windir%system32inetsrvappcmd unlock config/section:system.webServer/security/access

    为了让server端程序相应的Web Role在启动的时候自己主动调用上述脚本(假设命名为UnlockConfig.cmd),我们在CloudServiceServiceDefinition.csdef中加入例如以下内容:

    <Startup>
        <Task commandLine="StartupTasksUnlockConfig.cmd" executionContext="elevated" taskType="background" />
    </Startup>
    

    上述内容定义了在Web Role启动的时候须要运行一个任务,即在Web Role启动的时候自己主动运行前面的脚本文件改动IIS的配置,接收来自client的证书。

    在改动IIS的配置參数之后,IIS的界面显演示样例如以下:

  • 相关阅读:
    4header组件开发
    3组件骨架开发
    2项目目录设计
    1项目相关的一些简介
    21AJax与Comet
    20JSON
    获取特定筛选条件下数据的四分位点
    动态长度字符串的解析拆分问题
    myBase Desktop 7无限免费试用方法
    VBA 将Excel工作簿中所有表格进行一键排版
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10917601.html
Copyright © 2020-2023  润新知