实施吊销要求您部署吊销列表,该列表是一个使用可扩展权限标记语言 (XrML) 的 XML 文档,其中列出了不应再对受权限保护的内容具有访问权限的主体。您必须使用 RMS 附带的吊销列表签署工具 (RLsigner.exe) 来创建正确地加盖了时间戳并经过签名的吊销列表。

要使用 RLsigner.exe 签署吊销列表,您必须将吊销列表文件另存为 unicode 文件。

吊销列表示例

本主题中提供了完整的吊销列表示例,其中显示了各个可能的吊销机制。您可以将此示例作为模型来创建自己的吊销列表。

吊销列表是使用 XrML 语言的 XML 文件。

BODY 元素包含下列四个子元素:

  • ISSUEDTIME 。包含颁发吊销列表的日期和时间。RLsigner.exe 将此元素插入文件;示例中提供的元素仅用于演示吊销列表文件的整体结构。
  • DESCRIPTOR 。包含将该文件标识为吊销列表的数据。
  • ISSUER 。包含用于标识颁发吊销列表的实体的数据。
  • REVOCATIONLIST 。包含子 REVOKE 元素,用于指定此列表吊销的实体。
  • 下面显示了一个示例吊销列表文件。

    ISSUEDTIME、PUBLICKEY 和 SIGNATURE 元素可以省略,因为它们由 RLsigner.exe 插入或覆盖。

    <?xml version="1.0" ?> 
    <XrML xml:space=”preserve” version=”1.2”>
      <BODY type="LICENSE" version="3.0">
        <ISSUEDTIME>...</ISSUEDTIME> 
        <DESCRIPTOR>
          <OBJECT type="Revocation-List">
            <ID type="MS-GUID">{d6373cba-01f1-4f32-ac58-260f580af0f8}</ID>
          </OBJECT>
        </DESCRIPTOR>
    <ISSUER>
          <OBJECT type="Revocation-List">
            <ID type="acsii-tag">External revocation authority</ID>
            <NAME>Revocation list name</NAME>
            <ADDRESS type="URL">https://somedomain.com/revocation_list_file</ADDRESS>
          </OBJECT>
          <PUBLICKEY>...</PUBLICKEY>
        </ISSUER>
      <REVOCATIONLIST>
        <REVOKE>...<\REVOKE>
        <REVOKE>...<\REVOKE>
      </REVOCATIONLIST>
      <SIGNATURE>...</SIGNATURE>
    </XrML>
    

    [!CAUTIION]
    当在吊销列表中指定 URL 时,RMS SP1 或 RMS SP2 中不再支持 UNC 路径。您必须使用 URL。

    定义 REVOKE 元素之后即可准备签署吊销列表。

    使用 REVOKE 元素

    在“吊销列表示例”部分的示例吊销列表中,每个 REVOKE 元素均指定要吊销的主体。开始标记具有类别和类型属性,这些属性定义吊销目标和识别条件的依据。不同的 REVOKE 元素具有不同的子元素,具体取决于类别和类型属性指定的操作。

    有关指定 REVOKE 元素的详细信息,请查看下列示例:

  • 根据公钥吊销主体
  • 根据 GUID 吊销证书和许可证
  • 根据哈希值吊销证书和许可证
  • 根据颁发者公钥吊销证书和许可证
  • 根据颁发者 ID 吊销证书和许可证
  • 根据内容 ID 吊销内容
  • 根据主体 ID 吊销证书
  • 根据 Windows Live ID 吊销主体
  • 根据公钥吊销主体

    此示例根据其公钥吊销主体。此处的 标记的内容来自颁发该密钥的证书的 节点。

         <REVOKE category="principal" type="principal-key">
            <PUBLICKEY>
              <ALGORITHM>RSA-1024</ALGORITHM>
              <PARAMETER name="public exponent">
                <VALUE encoding="integer32">65537</VALUE>
              </PARAMETER>
              <PARAMETER name="modulus">
                <VALUE encoding="base64" size="1024">
    6Jn0kEAWU+1AFWtuUmBYL8Jza8tLhUv/BCmgcq/Pc08Au3DvXkH65s+0MEyZjM+71j3F1xaXUSst+wH2FjApkY1RxgL8VAKIuEvIy9hRrvY1YhJx/0Ite5fZeg2crUFrmoQgZzaJ50FvoakA2QMgZZgxoQmwiGE0y40cEJtIlE0=
                </VALUE>
              </PARAMETER>
            </PUBLICKEY>
          </REVOKE>
    

    根据 GUID 吊销证书和许可证

    此示例根据全局唯一标识符 (GUID) 吊销证书或许可证。如果使用此吊销列表,则不能使用具有匹配的 GUID 的证书或许可证。此示例中 标记的内容来自您正在吊销的证书或许可证的 节点。(通过指定应用程序清单的 ID,您还可以通过此机制来吊销应用程序。)

    <REVOKE category="license" type="license-id">
            <OBJECT>
              <ID type="MS-GUID">{06BCB94D-43E5-419f-B180-AA9FD321ED7A}</ID>
            </OBJECT>
          </REVOKE>
    

    通过应用程序清单吊销

    要通过应用程序清单吊销,您必须从应用程序清单中提取颁发者 ID、颁发者公钥、许可证 ID 或许可证哈希。但是,应用程序清单采用 Base 64 编码,因此该信息不能以纯文本格式显示。借助 Rights Management Services 软件开发工具包 (SDK),可以使用 DRMConstructCertificateChain、DRMDeconstructCertificateChain 和 DRMDecode 方法开发程序,以对应用程序清单解码并获取所需的信息。

    如果要防止某个应用程序使用受权限保护的内容,请考虑使用应用程序排除来禁止 RMS 群集向那些应用程序授予用户许可证。排除法的局限在于它不能防止持有有效用户许可证的用户对受权限保护的内容进行解密。有关应用程序排除的详细信息,请参阅本主题中前面的排除应用程序

    根据哈希值吊销证书和许可证

    <REVOKE category="license" type="license-hash">
            <DIGEST>
              <ALGORITHM>SHA1</ALGORITHM>
              <VALUE encoding="base64" size="160">
                ABfB4mcEslVCMEZR9reACqXHCoQ=
              </VALUE>
            </DIGEST>
          </REVOKE>
    

    通过应用程序清单吊销

    要通过应用程序清单吊销,您必须从应用程序清单中提取颁发者 ID、颁发者公钥、许可证 ID 或许可证哈希值。但是,应用程序清单采用 Base 64 编码,因此该信息不能以纯文本格式显示。借助 Rights Management Services SDK,可以使用 DRMConstructCertificateChain、DRMDeconstructCertificateChain 和 DRMDecode 方法开发程序,以对应用程序清单解码并获取所需的信息。

    如果要防止某个应用程序使用受权限保护的内容,请考虑使用应用程序排除来禁止 RMS 群集向那些应用程序授予用户许可证。排除法的局限在于它不能防止持有有效用户许可证的用户对受 RMS 保护的内容进行解密。有关应用程序排除的详细信息,请参阅本主题中前面的排除应用程序

    根据颁发者公钥吊销证书和许可证

    此示例吊销由指定公钥所有者颁发的所有证书和许可证。此处的 标记的内容是您正在吊销的证书或许可证的 节点。

    <REVOKE category="license" type="issuer-key">
            <PUBLICKEY>
              <ALGORITHM>RSA-1024</ALGORITHM>
              <PARAMETER name="public exponent">
                <VALUE encoding="integer32">65537</VALUE>
              </PARAMETER>
              <PARAMETER name="modulus">
                <VALUE encoding="base64" size="1024">
    AAn0kEAWU+1AFWtuUmBYL8Jza8tLhUv/BCmgcq/Pc08Au3DvXkH65s+0MEyZjM+71j3F1xaXUSst+wH2FjApkY1RxgL8VAKIuEvIy9hRrvY1YhJx/0Ite5fZeg2crUFrmoQgZzaJ50FvoakA2QMgZZgxoQmwiGE0y40cEJtIlE0=
                </VALUE>
              </PARAMETER>
            </PUBLICKEY>
          </REVOKE>
    

    根据颁发者 ID 吊销证书和许可证

    此示例根据颁发者 ID 吊销一组证书或许可证。此处的 标记的内容是您正在吊销的证书或许可证的 节点。

     <REVOKE category="license" type="issuer-id">
            <OBJECT type="MS-DRM-Server">
              <ID type="MS-GUID">{2BE9E200-3040-41B9-8832-D4D0445EBBD6}</ID> 
            </OBJECT>
          </REVOKE>
    

    当指定 ID 类型时,请确保全局唯一标识符 (GUID) 和结束标记之间没有回车符。如果无意地添加了回车符,RMS 客户端将无法分析吊销列表。

    根据内容 ID 吊销内容

    此示例根据内容 ID 吊销受保护的内容。这是应用于吊销内容的首选方法,因为对于根据给定发布许可证创建的所有用户许可证而言,内容 ID 都是相同的。此处的 节点的值可以在相关内容的发布许可证或用户许可证的 节点中找到。

    <REVOKE category="content" type="content-id">
            <OBJECT type="Microsoft Office Document">
              <ID type="MS-GUID">{8702641D-3512-4AA4-A584-84C703A5B5C0}</ID>
            </OBJECT>
          </REVOKE>
    

    当指定 ID 类型时,请确保全局唯一标识符 (GUID) 和结束标记之间没有回车符。如果无意地添加了回车符,RMS 客户端将无法分析吊销列表。

    根据 Windows 帐户吊销主体

    此示例根据 Windows 帐户吊销用户或授权主体。此处的 元素的内容来自权限帐户证书或用户许可证的 节点。

    <REVOKE category="principal" type="principal-id">
            <OBJECT type="Group-Identity">
              <ID type="Windows">{Windows account SID}</ID> 
              <NAME>{E-mail address}</NAME> 
            </OBJECT>
          </REVOKE>
    

    当指定 ID 类型时,请确保 Windows 帐户 SID 和结束标记之间没有回车符。如果无意地添加了回车符,RMS 客户端将无法分析吊销列表。

    根据 Windows Live ID 吊销主体

    此示例根据 Windows Live ID 吊销用户或授权主体。此处的 元素的内容来自权限帐户证书或用户许可证的 节点。

    <REVOKE category="principal" type="principal-id">
            <OBJECT type="Group-Identity">
              <ID type="Passport">{PUID}</ID> 
              <NAME>michael@contoso.com</NAME> 
            </OBJECT>
          </REVOKE>
    

    当指定 ID 类型时,请确保主体唯一标识符 (PUID) 和结束标记之间没有回车符。如果无意地添加了回车符,RMS 客户端将无法分析吊销列表。

    在吊销列表中插入签名

    创建吊销列表完毕后,您必须按照本主题所述在吊销列表中插入签名。然后,您可以将该吊销列表存放到在关联的权限策略模板中指定的 URL 下,以便用户访问。

    插入签名时,第一步是使用强名称工具 (Sn.exe) 为吊销列表生成密钥对和密钥文件。Sn.exe 工具包含在 Microsoft .NET Framework SDK 1.1 中,您可以从 Microsoft 网站 https://go.microsoft.com/fwlink/?LinkId=104796(页面可能为英文)下载该 SDK。

    吊销列表文件必须保存为 UNICODE 文件,以便使用 RLsigner.exe 进行签署

    使用 Sn.exe 生成新的密钥对并将该密钥对写入文件中

  • 创建私钥。在命令提示符处键入下列命令,然后按 Enter:

    sn -k 私钥文件**.snk**

    其中,私钥文件是密钥文件的名称。

  • 使用 Sn.exe 从在步骤 1 中创建的密钥对文件中提取公钥,并将它导出到独立的文件中。键入下列命令,然后按 Enter:

    sn -p 私钥文件 公钥文件

    其中,私钥文件是在步骤 1 中创建的私钥文件的名称,而公钥文件是将存储导出的公钥的文件名。

  • 将私钥文件(在步骤 1 中创建)的扩展名从 .snk 更改为 .dat 以与 RLsigner.exe 配合使用。

  • 使用 RLsigner.exe 将签名插入到吊销列表文件中。此工具包含在 RMS 中。默认情况下,它位于 %systemdrive%\Program Files\Windows Rights Management Services\Tools 目录中。

    RLsigner.exe 不支持包括空格的文件名。

    使用 RLsigner.exe

    运行 RLsigner.exe 时,它首先使用密钥文件中提供的私钥创建签名。然后创建基于您提供的吊销列表文件的输出文件。

    吊销列表文件必须保存为 UNICODE 文件以使用 RLsigner.exe。

    要使用 RLsigner.exe 来签署吊销列表,请在命令提示符处键入下列命令:

    rlsigner.exe 输入文件 {-f 密钥文件 | -h 容器名称 CSP} 输出文件

    使用下列信息完成该命令的输入参数:

    rlsigner.exe rl.xml -f key.dat output.xml
  • 使用硬件安全模块的命令行语法示例:
    rlsigner.exe rl.xml -h Container CSP output.xml
  • RLsigner.exe 在返回代码中提供基本的错误信息和成功信息。下表描述了可能的返回代码。

    您可能需要根据为服务器指定的刷新率来计划吊销列表的签署。

    您也可以使用脚本自动完成吊销列表签署过程。下列示例 VBScript 调用 RLsigner.exe,并将结果写入系统事件日志。

    const EVT_SUCCESS       = 0
    const EVT_ERROR         = 1
    const EVT_WARNING       = 2
    const EVT_INFORMATION   = 4
    const EVT_AUDIT_SUCCESS = 8
    const EVT_AUDIT_FAILURE = 16
    Dim WshShell, oExec
    Set WshShell = CreateObject( "WScript.Shell" )
    Set oExec = WshShell.Exec("rlsigner.exe input_file key_file output_file")
    Do While oExec.Status = 0
         WScript.Sleep 100
    if WshShell.ExitCode <> 0 Then
        WshShell.LogEvent EVT_ERROR, "RLsigner failed with error """ + WshShell.ExitCode + """"
        WshShell.LogEvent EVT_SUCCESS, "RLsigner completed successfully"
    end if