联合身份验证设备注册

本部分提供使用联合身份验证策略的移动设备注册协议的示例。 当身份验证策略设置为 Federated 时,注册客户端将使用 Web 身份验证代理来获取安全令牌。 注册客户端在响应消息中调用 Web 身份验证代理 API 以启动该过程。 服务器应生成适合设备屏幕的 Web 身份验证代理页,并且应与现有注册 UI 保持一致。 注册客户端在客户端证书请求调用期间,从中转站返回的不透明安全令牌用作设备安全机密。

<AuthenticationServiceURL>发现响应消息的元素指定 Web 身份验证代理页起始 URL。

有关适用于 Windows 的Microsoft移动设备注册协议的详细信息,请参阅 [MS-MDE2]:移动设备注册协议版本 2

注意

有关 Windows 中不支持的注册方案的列表,请参阅 不支持注册方案

发现服务

发现 Web 服务提供用户向管理服务注册手机所需的配置信息。 该服务是仅) 通过 HTTPS (服务器身份验证的静态 Web 服务。

注意

发现服务的管理员必须创建地址 enterpriseenrollment.<domain_name>.com为 的主机。

设备的自动发现流使用登录期间提交到工作区设置屏幕的电子邮件地址的域名。 自动发现系统通过将子域 enterpriseenrollment 追加到电子邮件地址的域,并通过追加路径 /EnrollmentServer/Discovery.svc来构造使用此主机名的 URI。 例如,如果电子邮件地址为 sample@contoso.com,则第一个 Get 请求的结果 URI 将为: http://enterpriseenrollment.contoso.com/EnrollmentServer/Discovery.svc

第一个请求是标准 HTTP GET 请求。

以下示例演示通过 HTTP GET 向作为电子邮件地址提供的 user@contoso.com 发现服务器的请求。

Request Full Url: http://EnterpriseEnrollment.contoso.com/EnrollmentServer/Discovery.svc
Content Type: unknown
Header Byte Count: 153
Body Byte Count: 0
GET /EnrollmentServer/Discovery.svc HTTP/1.1
User-Agent: Windows Phone 8 Enrollment Client
Host: EnterpriseEnrollment.contoso.com
Pragma: no-cache
Request Full Url: http://EnterpriseEnrollment.contoso.com/EnrollmentServer/Discovery.svc
Content Type: text/html
Header Byte Count: 248
Body Byte Count: 0
HTTP/1.1 200 OK
Connection: Keep-Alive
Pragma: no-cache
Cache-Control: no-cache
Content-Type: text/html
Content-Length: 0

设备从服务器获取响应后,设备将向 发送 POST 请求 enterpriseenrollment.<domain_name>/EnrollmentServer/Discovery.svc。 从服务器 (获取另一个响应后,该响应应告知设备注册服务器) 的位置,则从设备发送的下一条消息是发送到 enterpriseenrollment.<domain_name> 注册服务器。

将应用以下逻辑:

  1. 设备首先尝试 HTTPS。 如果设备不信任服务器证书,HTTPS 尝试将失败。
  2. 如果失败,设备会尝试 HTTP 查看它是否已重定向:
    • 如果未重定向设备,系统会提示用户输入服务器地址。
    • 如果设备已重定向,系统会提示用户允许重定向。

以下示例显示了通过 HTTP POST 命令向作为电子邮件地址提供的 user@contoso.com 发现 Web 服务的请求

https://EnterpriseEnrollment.Contoso.com/EnrollmentServer/Discovery.svc

以下示例显示了发现服务请求。

<?xml version="1.0"?>
<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing"
    xmlns:s="http://www.w3.org/2003/05/soap-envelope">
    <s:Header>
        <a:Action s:mustUnderstand="1">
            http://schemas.microsoft.com/windows/management/2012/01/enrollment/IDiscoveryService/Discover
        </a:Action>
        <a:MessageID>urn:uuid: 748132ec-a575-4329-b01b-6171a9cf8478</a:MessageID>
        <a:ReplyTo>
            <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
        </a:ReplyTo>
        <a:To s:mustUnderstand="1">
            https://ENROLLTEST.CONTOSO.COM/EnrollmentServer/Discovery.svc
        </a:To>
    </s:Header>
    <s:Body>
        <Discover xmlns="http://schemas.microsoft.com/windows/management/2012/01/enrollment/">
            <request xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <EmailAddress>user@contoso.com</EmailAddress>
                <OSEdition>3</OSEdition>
                <!-- New -->
                <RequestVersion>3.0</RequestVersion>
                <!-- Updated -->
                <DeviceType>WindowsPhone</DeviceType>
                <!-- Updated -->
                <ApplicationVersion>10.0.0.0</ApplicationVersion>
                <AuthPolicies>
                    <AuthPolicy>OnPremise</AuthPolicy>
                    <AuthPolicy>Federated</AuthPolicy>
                </AuthPolicies>
            </request>
        </Discover>
    </s:Body>
</s:Envelope>

发现响应采用 XML 格式,包含以下字段:

  • 注册服务 URL (EnrollmentServiceUrl) - 指定管理服务公开的注册终结点的 URL。 设备应在对用户进行身份验证后调用此 URL。 此字段是必需的。
  • 身份验证策略 (AuthPolicy) - 指示需要哪种类型的身份验证。 对于 MDM 服务器,OnPremise 是受支持的值,这意味着在调用管理服务 URL 时对用户进行身份验证。 此字段是必需的。
  • 在 Windows 中,Federated 添加为另一个受支持的值。 此添加允许服务器使用 Web 身份验证代理执行自定义用户身份验证和使用期限接受。

注意

HTTP 服务器响应不得将 Transfer-Encoding 设置为 Chunked;它必须作为一条消息发送。

当身份验证策略设置为联合身份验证时,注册客户端将使用 Web 身份验证代理 (WAB) 来获取安全令牌。 WAB 起始页 URL 由响应消息中的发现服务提供。 注册客户端在响应消息中调用 WAB API 以启动 WAB 进程。 WAB 页是服务器托管的网页。 服务器应生成这些页面以很好地适应设备屏幕,并尽可能与 MDM 注册 UI 中的其他版本保持一致。 在客户端证书注册请求调用期间,注册客户端使用从 WAB 作为结束页返回的不透明安全令牌作为设备安全机密。

注意

使用以下指南,而不是依赖于在身份验证期间传递的用户代理字符串来获取信息(例如 OS 版本):

  • 从发现请求期间发送的数据分析 OS 版本。
  • 在 AuthenticationServiceURL 中追加 OS 版本作为参数。
  • 当 OS 发送身份验证响应时,从 AuthenticiationServiceURL 分析 OS 版本。

DiscoveryResponse XML 中引入了新的 XML 标记 AuthenticationServiceUrl,以允许服务器指定 WAB 页面起始 URL。 对于联合身份验证,此 XML 标记必须存在。

注意

注册客户端与用于进行身份验证和返回安全令牌的协议流无关。 虽然服务器可能会直接提示输入用户凭据或与其他服务器和目录服务进入联合协议,但注册客户端对所有这些操作都是不可知的。 为了保持不可知性,与涉及注册客户端的身份验证相关的所有协议流都是被动的,即浏览器实现的。

以下是服务器的明确要求。

  • 元素 <DiscoveryResponse>``<AuthenticationServiceUrl> 必须支持 HTTPS。
  • 身份验证服务器必须使用设备受信任的根证书。 否则,WAP 调用将失败。
  • 在 WAB 身份验证期间,WP 不支持适用于 ADFS 的 Windows 集成身份验证 (WIA) 。 ADFS 2012 R2(如果需要将它配置为不尝试 WIA for Windows 设备)。

注册客户端发出 HTTPS 请求,如下所示:

AuthenticationServiceUrl?appru=<appid>&amp;login_hint=<User Principal Name>
  • <appid> 为 窗体 ms-app://string
  • <User Principal Name> 是注册用户的名称,例如, user@constoso.com 作为用户在注册登录页中的输入。 此属性的值用作身份验证服务器在身份验证过程中使用的提示。

身份验证完成后,身份验证服务器应返回 HTML 表单文档,其中包含查询字符串参数中标识的 appid 的 POST 方法操作。

注意

若要使应用程序与严格的内容安全策略兼容,通常需要对 HTML 模板和客户端代码进行一些更改,添加策略标头,并在部署策略后测试一切是否正常工作。

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Vary: Accept-Encoding
Content-Length: 556

<!DOCTYPE>
<html>
   <head>
      <title>Working...</title>
      <script>
         function formSubmit() {
            document.forms[0].submit();
         }
           window.onload=formSubmit;
      </script>
   </head>
   <body>
    <!-- appid below in post command must be same as appid in previous client https request. -->
      <form method="post" action="ms-app://appid">
         <p><input type="hidden" name="wresult" value="token value"/></p>
         <input type="submit"/>
      </form>
   </body>
</html>

服务器必须向格式的 ms-app://string 重定向 URL 发送 POST, (URL 方案是 ms-app) ,如 POST 方法操作中所示。 安全令牌值是 EncodingType 属性中包含的 <wsse:BinarySecurityToken> base64 编码字符串http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\#base64binary。 Windows 在将二进制编码发回注册服务器时执行二进制编码,形式仅为 HTML 编码。 此字符串对注册客户端不透明;客户端不解释字符串。

以下示例显示了从发现 Web 服务收到的需要通过 WAB 进行身份验证的响应。

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
    xmlns:a="http://www.w3.org/2005/08/addressing">
    <s:Header>
        <a:Action s:mustUnderstand="1">
            http://schemas.microsoft.com/windows/management/2012/01/enrollment/IDiscoveryService/DiscoverResponse
        </a:Action>
        <ActivityId>
            d9eb2fdd-e38a-46ee-bd93-aea9dc86a3b8
        </ActivityId>
        <a:RelatesTo>urn:uuid: 748132ec-a575-4329-b01b-6171a9cf8478</a:RelatesTo>
    </s:Header>
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <DiscoverResponse xmlns="http://schemas.microsoft.com/windows/management/2012/01/enrollment">
            <DiscoverResult>
                <AuthPolicy>Federated</AuthPolicy>
                <EnrollmentVersion>3.0</EnrollmentVersion>
                <EnrollmentPolicyServiceUrl>
                    https://enrolltest.contoso.com/ENROLLMENTSERVER/DEVICEENROLLMENTWEBSERVICE.SVC
                </EnrollmentPolicyServiceUrl>
                <EnrollmentServiceUrl>
                    https://enrolltest.contoso.com/ENROLLMENTSERVER/DEVICEENROLLMENTWEBSERVICE.SVC
                </EnrollmentServiceUrl>
                <AuthenticationServiceUrl>
                    https://portal.manage.contoso.com/LoginRedirect.aspx
                </AuthenticationServiceUrl>
            </DiscoverResult>
        </DiscoverResponse>
    </s:Body>
</s:Envelope>

注册策略 Web 服务

策略服务是可选的。 默认情况下,如果未指定策略,则最小密钥长度为 2k,哈希算法为 SHA-1。

此 Web 服务实现 X.509 证书注册策略协议 (MS-XCEP) 规范,该规范允许自定义证书注册,以匹配企业在不同时间的不同安全需求, (加密灵活性) 。 该服务处理来自客户端的 GetPolicies 消息,对客户端进行身份验证,并在 GetPoliciesResponse 消息中返回匹配的注册策略。

对于联合身份验证策略,使用 元素 [WSS] 在请求消息 <wsse:BinarySecurityToken> 中提供安全令牌凭据。 将按发现响应部分中所述检索安全令牌。 身份验证信息如下所示:

  • wsse:Security:注册客户端实现 <wsse:Security> [WSS] 第 5 节中定义的元素。 元素 <wsse:Security> 必须是 元素的 <s:Header> 子元素。
  • wsse:BinarySecurityToken:注册客户端实现 <wsse:BinarySecurityToken> [WSS] 节 6.3 中定义的元素。 元素 <wsse:BinarySecurityToken> 必须作为 SOAP 标头中的 元素的 <wsse:Security> 子级包含。

如发现响应部分中所述,元素的<wsse:BinarySecurityToken>包含对注册客户端是不透明的,并且客户端不会解释字符串,并且包含元素由安全令牌身份验证服务器 ((在 元素中<AuthenticationServiceUrl><DiscoveryResponse>标识)和企业服务器中达成一致。

元素 <wsse:BinarySecurityToken> 包含 base64 编码的字符串。 注册客户端使用从身份验证服务器接收的安全令牌,并用 base64 编码令牌来填充 <wsse:BinarySecurityToken> 元素。

  • wsse:BinarySecurityToken/attributes/ValueType:ValueType <wsse:BinarySecurityToken> 属性必须为 http://schemas.microsoft.com/5.0.0.0/ConfigurationManager/Enrollment/DeviceEnrollmentUserToken

  • wsse:BinarySecurityToken/attributes/EncodingType:EncodingType <wsse:BinarySecurityToken> 属性必须为 http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\#base64binary

以下示例是一个注册策略请求,其中收到的安全令牌作为客户端凭据。

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
    xmlns:a="http://www.w3.org/2005/08/addressing"
    xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
    xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512"
    xmlns:ac="http://schemas.xmlsoap.org/ws/2006/12/authorization">
    <s:Header>
        <a:Action s:mustUnderstand="1">
            http://schemas.microsoft.com/windows/pki/2009/01/enrollmentpolicy/IPolicy/GetPolicies
        </a:Action>
        <a:MessageID>urn:uuid:72048B64-0F19-448F-8C2E-B4C661860AA0</a:MessageID>
        <a:ReplyTo>
            <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
        </a:ReplyTo>
        <a:To s:mustUnderstand="1">
             https://enrolltest.contoso.com/ENROLLMENTSERVER/DEVICEENROLLMENTWEBSERVICE.SVC
        </a:To>
        <wsse:Security s:mustUnderstand="1">
            <wsse:BinarySecurityToken ValueType="http://schemas.microsoft.com/5.0.0.0/ConfigurationManager/Enrollment/DeviceEnrollmentUserToken" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd#base64binary"
                xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
                B64EncodedSampleBinarySecurityToken
            </wsse:BinarySecurityToken>
        </wsse:Security>
    </s:Header>
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <GetPolicies xmlns="http://schemas.microsoft.com/windows/pki/2009/01/enrollmentpolicy">
            <client>
                <lastUpdate xsi:nil="true"/>
                <preferredLanguage xsi:nil="true"/>
            </client>
            <requestFilter xsi:nil="true"/>
        </GetPolicies>
    </s:Body>
</s:Envelope>

对用户进行身份验证后,Web 服务将检索用户应注册的证书模板,并根据证书模板属性创建注册策略。 可以在 MSDN 上找到响应示例。

MS-XCEP 支持使用各种复杂类型和属性的灵活注册策略。 对于 Windows 设备,我们将首先支持 minimalKeyLength、hashAlgorithmOIDReference 策略和 CryptoProviders。 hashAlgorithmOIDReference 在 GetPolicesResponse 中具有相关的 OID 和 OIDReferenceID 和 policySchema。 策略Schema 是指证书模板版本。 MS-XCEP 版本 3 支持哈希算法。

注意

HTTP 服务器响应不得将 Transfer-Encoding 设置为 Chunked;它必须作为一条消息发送。

以下代码片段显示了策略 Web 服务响应。

<s:Envelope
   xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
   xmlns:s="http://www.w3.org/2003/05/soap-envelope"
   xmlns:a="http://www.w3.org/2005/08/addressing">
  <s:Header>
    <a:Action s:mustUnderstand="1">
      http://schemas.microsoft.com/windows/pki/2009/01/enrollmentpolicy/IPolicy/GetPoliciesResponse
    </a:Action>
    <a:RelatesTo>urn:uuid: 69960163-adad-4a72-82d2-bb0e5cff5598</a:RelatesTo>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <GetPoliciesResponse
       xmlns="http://schemas.microsoft.com/windows/pki/2009/01/enrollmentpolicy">
      <response>
      <policyID />
        <policyFriendlyName xsi:nil="true"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
        <nextUpdateHours xsi:nil="true"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
        <policiesNotChanged xsi:nil="true"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
        <policies>
          <policy>
            <policyOIDReference>0</policyOIDReference>
            <cAs xsi:nil="true" />
            <attributes>
              <commonName>CEPUnitTest</commonName>
              <policySchema>3</policySchema>
              <certificateValidity>
                <validityPeriodSeconds>1209600</validityPeriodSeconds>
                <renewalPeriodSeconds>172800</renewalPeriodSeconds>
              </certificateValidity>
              <permission>
                <enroll>true</enroll>
                <autoEnroll>false</autoEnroll>
              </permission>
              <privateKeyAttributes>
                <minimalKeyLength>2048</minimalKeyLength>
                <keySpec xsi:nil="true" />
                <keyUsageProperty xsi:nil="true" />
                <permissions xsi:nil="true" />
                <algorithmOIDReference xsi:nil="true" />
                <cryptoProviders xsi:nil="true" />
              </privateKeyAttributes>
              <revision>
                <majorRevision>101</majorRevision>
                <minorRevision>0</minorRevision>
              </revision>
              <supersededPolicies xsi:nil="true" />
              <privateKeyFlags xsi:nil="true" />
              <subjectNameFlags xsi:nil="true" />
              <enrollmentFlags xsi:nil="true" />
              <generalFlags xsi:nil="true" />
              <hashAlgorithmOIDReference>0</hashAlgorithmOIDReference>
              <rARequirements xsi:nil="true" />
              <keyArchivalAttributes xsi:nil="true" />
              <extensions xsi:nil="true" />
            </attributes>
          </policy>
        </policies>
      </response>
      <cAs xsi:nil="true" />
      <oIDs>
        <oID>
          <value>1.3.14.3.2.29</value>
          <group>1</group>
          <oIDReferenceID>0</oIDReferenceID>
          <defaultName>szOID_OIWSEC_sha1RSASign</defaultName>
        </oID>
      </oIDs>
    </GetPoliciesResponse>
  </s:Body>
</s:Envelope>

注册 Web 服务

此 Web 服务实现 MS-WSTEP 协议。 它处理来自客户端的 RequestSecurityToken (RST) 消息,对客户端进行身份验证,从 CA 请求证书,并在 RequestSecurityTokenResponse (RSTR) 中将其返回给客户端。 除了颁发的证书,响应还包含预配 DMClient 所需的配置。

RequestSecurityToken (RST) 必须具有用户凭据和证书请求。 RST SOAP 信封中的用户凭据与 GetPolicies 中的凭据相同,并且根据身份验证策略是 OnPremise 还是 Federated 而有所不同。 RST SOAP 正文中的 BinarySecurityToken 包含 Base64 编码的 PKCS#10 证书请求,该请求由客户端基于注册策略生成。 在使用 MS-WSTEP 请求证书之前,客户端可以使用 MS-XCEP 请求注册策略。 如果证书颁发机构 (CA) (密钥长度、哈希算法等接受 PKCS#10 证书请求,则与证书模板) 匹配,客户端即可成功注册。

RequestSecurityToken 使用自定义 TokenType (http://schemas.microsoft.com/5.0.0.0/ConfigurationManager/Enrollment/DeviceEnrollmentToken) ,因为我们的注册令牌不仅仅是 X.509 v3 证书。 有关详细信息,请参阅响应部分。

RST 还可以指定许多 AdditionalContext 项,例如 DeviceType 和 Version。 例如,基于这些值,Web 服务可以返回特定于设备和特定于版本的 DM 配置。

注意

策略服务和注册服务必须位于同一服务器上;也就是说,它们必须具有相同的主机名。

以下示例演示联合身份验证的注册 Web 服务请求。

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
   xmlns:a="http://www.w3.org/2005/08/addressing"
   xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
   xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
   xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512"
   xmlns:ac="http://schemas.xmlsoap.org/ws/2006/12/authorization">
  <s:Header>
    <a:Action s:mustUnderstand="1">
      http://schemas.microsoft.com/windows/pki/2009/01/enrollment/RST/wstep
    </a:Action>
    <a:MessageID>urn:uuid:0d5a1441-5891-453b-becf-a2e5f6ea3749</a:MessageID>
    <a:ReplyTo>
      <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
    </a:ReplyTo>
    <a:To s:mustUnderstand="1">
      https://enrolltest.contoso.com:443/ENROLLMENTSERVER/DEVICEENROLLMENTWEBSERVICE.SVC
    </a:To>
    <wsse:Security s:mustUnderstand="1">
      <wsse:BinarySecurityToken
         wsse:ValueType="http://schemas.microsoft.com/5.0.0.0/ConfigurationManager/Enrollment/DeviceEnrollmentUserToken"
         wsse:EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd#base64binary">
      B64EncodedSampleBinarySecurityToken
      </wsse:BinarySecurityToken>
    </wsse:Security>
  </s:Header>
  <s:Body>
    <wst:RequestSecurityToken>
      <wst:TokenType>
        http://schemas.microsoft.com/5.0.0.0/ConfigurationManager/Enrollment/DeviceEnrollmentToken
      </wst:TokenType>
      <wst:RequestType>
        http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue
      </wst:RequestType>
      <wsse:BinarySecurityToken
         ValueType="http://schemas.microsoft.com/windows/pki/2009/01/enrollment#PKCS10"
         EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd#base64binary">
        DER format PKCS#10 certificate request in Base64 encoding Insterted Here
      </wsse:BinarySecurityToken>
      <ac:AdditionalContext xmlns="http://schemas.xmlsoap.org/ws/2006/12/authorization">
           <ac:ContextItem Name="OSEdition">
               <ac:Value> 4</ac:Value>
            </ac:ContextItem>
            <ac:ContextItem Name="OSVersion">
               <ac:Value>10.0.9999.0</ac:Value>
            </ac:ContextItem>
            <ac:ContextItem Name="DeviceName">
               <ac:Value>MY_WINDOWS_DEVICE</ac:Value>
            </ac:ContextItem>
            <ac:ContextItem Name="MAC">
               <ac:Value>FF:FF:FF:FF:FF:FF</ac:Value>
            </ac:ContextItem>
            <ac:ContextItem Name="MAC">
               <ac:Value>CC:CC:CC:CC:CC:CC</ac:Value>
            <ac:ContextItem Name="IMEI">
               <ac:Value>49015420323756</ac:Value>
            </ac:ContextItem>
            <ac:ContextItem Name="IMEI">
               <ac:Value>30215420323756</ac:Value>
            </ac:ContextItem>
            <ac:ContextItem Name="EnrollmentType">
               <ac:Value>Full</ac:Value>
            </ac:ContextItem>
            <ac:ContextItem Name="DeviceType">
               <ac:Value>CIMClient_Windows</ac:Value>
            </ac:ContextItem>
            <ac:ContextItem Name="ApplicationVersion">
               <ac:Value>10.0.9999.0</ac:Value>
            </ac:ContextItem>
            <ac:ContextItem Name="DeviceID">
               <ac:Value>7BA748C8-703E-4DF2-A74A-92984117346A</ac:Value>
            </ac:ContextItem>
            <ac:ContextItem Name="TargetedUserLoggedIn">
               <ac:Value>True</ac:Value>
            </ac:ContextItem>
         </ac:AdditionalContext>
    </wst:RequestSecurityToken>
  </s:Body>
</s:Envelope>

验证请求后,Web 服务将为客户端查找分配的证书模板,根据需要对其进行更新,将 PKCS#10 请求发送到 CA,处理来自 CA 的响应,构造 OMA 客户端预配 XML 格式,并在 RequestSecurityTokenResponse (RSTR) 中返回它。

注意

HTTP 服务器响应不得将 Transfer-Encoding 设置为 Chunked;它必须作为一条消息发送。

与 RST 中的 TokenType 类似,RSTR 使用 BinarySecurityToken (http://schemas.microsoft.com/ConfigurationManager/Enrollment/DeviceEnrollmentProvisionDoc) 中的自定义 ValueType,因为令牌不仅仅是 X.509 v3 证书。

预配 XML 包含:

  • 请求的证书 (必需)
  • DMClient 配置 (必需)

客户端安装客户端证书、企业根证书和中间 CA 证书(如果有)。 DM 配置包括 DM 服务器的名称和地址、要使用的客户端证书,以及计划 DMClient 何时回调服务器。

注册预配 XML 最多应包含一个根证书和一个中间 CA 证书,这是链接 MDM 客户端证书所需的。 在 OMA DM 会话期间,可以预配更多根证书和中间 CA 证书。

预配根证书和中间 CA 证书时,支持的 CSP 节点路径为:用于根证书预配的 CertificateStore/Root/System,用于中间 CA 证书预配的 CertificateStore/My/User。

下面是 RSTR 消息示例和 RSTR 中的 OMA 客户端预配 XML 的示例。 有关配置服务提供程序 (CSP) 预配 XML 的详细信息,请参阅企业设置、策略和应用管理部分。

以下示例显示了注册 Web 服务响应。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:a="http://www.w3.org/2005/08/addressing"
   xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
   <s:Header>
      <a:Action s:mustUnderstand="1" >
         http://schemas.microsoft.com/windows/pki/2009/01/enrollment/RSTRC/wstep
      </a:Action>
      <a:RelatesTo>urn:uuid:81a5419a-496b-474f-a627-5cdd33eed8ab</a:RelatesTo>
      <o:Security s:mustUnderstand="1" xmlns:o=
         "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
         <u:Timestamp u:Id="_0">
            <u:Created>2012-08-02T00:32:59.420Z</u:Created>
            <u:Expires>2012-08-02T00:37:59.420Z</u:Expires>
         </u:Timestamp>
      </o:Security>
   </s:Header>
   <s:Body>
      <RequestSecurityTokenResponseCollection
         xmlns="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
         <RequestSecurityTokenResponse>
            <TokenType>
                http://schemas.microsoft.com/5.0.0.0/ConfigurationManager/Enrollment/DeviceEnrollmentToken
            </TokenType>
             <DispositionMessage xmlns="http://schemas.microsoft.com/windows/pki/2009/01/enrollment"/>
             <RequestedSecurityToken>
               <BinarySecurityToken
                  ValueType="http://schemas.microsoft.com/5.0.0.0/ConfigurationManager/Enrollment/DeviceEnrollmentProvisionDoc"
                  EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd#base64binary"
                  xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
                  B64EncodedSampleBinarySecurityToken
               </BinarySecurityToken>
            </RequestedSecurityToken>
            <RequestID xmlns="http://schemas.microsoft.com/windows/pki/2009/01/enrollment">0</RequestID>
         </RequestSecurityTokenResponse>
      </RequestSecurityTokenResponseCollection>
   </s:Body>
</s:Envelope>

以下代码显示前面的包中作为安全令牌) 呈现的示例预配 XML (:

<wap-provisioningdoc version="1.1">
   <characteristic type="CertificateStore">
      <characteristic type="Root">
         <characteristic type="System">
            <characteristic type="Encoded Root Cert Hash Inserted Here">
               <parm name="EncodedCertificate" value="B64 encoded cert insert here" />
            </characteristic>
         </characteristic>
      </characteristic>
   </characteristic>
   <characteristic type="CertificateStore">
      <characteristic type="My" >
         <characteristic type="User">
            <characteristic type="Encoded Root Cert Hash Inserted Here">
               <parm name="EncodedCertificate" value="B64EncodedCertInsertedHere" />
            </characteristic>
            <characteristic type="PrivateKeyContainer"/>
            <!-- This tag must be present for XML syntax correctness. -->
         </characteristic>
         <characteristic type="WSTEP">
            <characteristic type="Renew">
               <!-If the datatype for ROBOSupport, RenewPeriod, and RetryInterval tags exist, they must be set explicitly. -->
               <parm name="ROBOSupport" value="true" datatype="boolean"/>
               <parm name="RenewPeriod" value="60" datatype="integer"/>
               <parm name="RetryInterval" value="4" datatype="integer"/>
            </characteristic>
         </characteristic>
      </characteristic>
   </characteristic>
   <characteristic type="APPLICATION">
      <parm name="APPID" value="w7"/>
      <parm name="PROVIDER-ID" value="TestMDMServer"/>
      <parm name="NAME" value="Microsoft"/>
      <parm name="ADDR" value="https://DM.contoso.com:443/omadm/Windows.ashx"/>
      <parm name="CONNRETRYFREQ" value="6" />
      <parm name="INITIALBACKOFFTIME" value="30000" />
      <parm name="MAXBACKOFFTIME" value="120000" />
      <parm name="BACKCOMPATRETRYDISABLED" />
      <parm name="DEFAULTENCODING" value="application/vnd.syncml.dm+wbxml" />
      <parm name="SSLCLIENTCERTSEARCHCRITERIA" value="Subject=DC%3dcom%2cDC%3dmicrosoft%2cCN%3dUsers%2cCN%3dAdministrator&amp;amp;Stores=My%5CUser"/>
      <characteristic type="APPAUTH">
         <parm name="AAUTHLEVEL" value="CLIENT"/>
         <parm name="AAUTHTYPE" value="DIGEST"/>
         <parm name="AAUTHSECRET" value="password1"/>
         <parm name="AAUTHDATA" value="B64encodedBinaryNonceInsertedHere"/>
      </characteristic>
      <characteristic type="APPAUTH">
         <parm name="AAUTHLEVEL" value="APPSRV"/>
         <parm name="AAUTHTYPE" value="BASIC"/>
         <parm name="AAUTHNAME" value="testclient"/>
         <parm name="AAUTHSECRET" value="password2"/>
      </characteristic>
   </characteristic>
   <characteristic type="DMClient"> <!-- In Windows 10, an enrollment server should use DMClient CSP XML to configure DM polling schedules. -->
      <characteristic type="Provider">
        <!-- ProviderID in DMClient CSP must match to PROVIDER-ID in w7 APPLICATION characteristics -->
        <characteristic type="TestMDMServer">
            <parm name="UPN" value="UserPrincipalName@contoso.com" datatype="string" />
            <parm name="EntDeviceName" value="Administrator_Windows" datatype="string" />
            <characteristic type="Poll">
                <parm name="NumberOfFirstRetries" value="8" datatype="integer" />
                <parm name="IntervalForFirstSetOfRetries" value="15" datatype="integer" />
                <parm name="NumberOfSecondRetries" value="5" datatype="integer" />
                <parm name="IntervalForSecondSetOfRetries" value="3" datatype="integer" />
                <parm name="NumberOfRemainingScheduledRetries" value="0" datatype="integer" />
                <!-- Windows 10 supports MDM push for real-time communication. The DM client long term polling schedule's retry waiting interval should be more than 24 hours (1440) to reduce the impact to data consumption and battery life. Refer to the DMClient Configuration Service Provider section for information about polling schedule parameters.-->
                <parm name="IntervalForRemainingScheduledRetries" value="1560" datatype="integer" />
                <parm name="PollOnLogin" value="true" datatype="boolean" />
            </characteristic>
        </characteristic>
      </characteristic>
   </characteristic>
   <!-- For Windows 10, we removed EnterpriseAppManagement from the enrollment protocol. -->
</wap-provisioningdoc>

注意

  • <Parm name> w7 APPLICATION CSP XML 中的 和 <characteristic type=> 元素区分大小写,并且必须全部为大写。

  • 在 w7 APPLICATION 特征中,应在 XML 中提供 CLIENT 和 APPSRV 凭据。

  • 本文档的企业 设置、策略和应用管理 部分中提供了这些设置的详细说明。

  • PrivateKeyContainer 特征是必需的,并且必须存在于注册的注册预配 XML 中。 其他重要设置包括 PROVIDER-IDNAMEADDR 参数元素,它们需要包含 DM 提供程序的唯一 ID 和名称,以及设备可以连接以用于配置预配的地址。 ID 和 NAME 可以是任意值,但它们必须唯一。

  • SSLCLIENTCERTSEARCHCRITERIA 也很重要,它用于选择要用于客户端身份验证的证书。 搜索基于已签名用户证书的使用者属性。

  • CertificateStore/WSTEP 启用证书续订。 如果服务器不支持它,请不要设置它。