对 AIR 文件进行数字签名

如果用公认的认证机构 (CA) 颁发的证书对 AIR 安装文件进行数字签名,则可以为您的用户提供他们所安装的应用程序未经无意或恶意修改的重要保证,并能证明您的签名者(发行商)身份。在使用受信任的证书或与安装计算机上受信任证书关联的证书对 AIR 安装程序进行签名后,AIR 在安装期间将显示发行商名称:

由受信任证书签名的应用程序的安装确认对话框

如果使用自签名证书(或与受信任证书没有关联的证书)对应用程序进行签名,则用户在安装应用程序时必须承担更大的安全风险。安装对话框会反映这种额外风险:

查看完全大小图形
由自签名证书签名的应用程序的安装确认对话框
重要说明: 如果恶意实体以某种方式获取您的签名 keystore 文件或发现您的私钥,则可以以您的身份伪造 AIR 文件。

代码签名证书

证书实行声明 (CPS) 和由颁发证书的认证机构发布的订户协议中拟定了涉及代码签名证书使用的安全保证、限制和法律义务。有关当前颁发 AIR 代码签名证书的证书颁发机构的协议的详细信息,请参阅:

ChosenSecurity (http://www.chosensecurity.com/products/tc_publisher_id_adobe_air.htm)

ChosenSecurity CPS (http://www.chosensecurity.com/resource_center/repository.htm)

GlobalSign (http://www.globalsign.com/code-signing/index.html)

GlobalSign CPS (http://www.globalsign.com/repository/index.htm)

Thawte CPS (http://www.thawte.com/cps/index.html)

VeriSign CPS (http://www.verisign.com/repository/CPS/)

VeriSign Subscriber's Agreement (https://www.verisign.com/repository/subscriber/SUBAGR.html)

关于 AIR 代码签名

对 AIR 文件进行签名后,安装文件中将包含一个数字签名。此签名包括程序包的摘要,用于证实 AIR 文件自签名以来未经修改;此签名还包括有关签名证书的信息,用于证实发行商身份。

AIR 使用通过操作系统的证书存储区支持的公钥基础结构 (PKI) 来确定证书是否可信。安装 AIR 应用程序的计算机必须直接信任用于对此 AIR 应用程序进行签名的证书,或者必须信任将该证书链接到受信认证机构的证书链,才能核实发行商信息。

如果 AIR 文件用未链至其中一个受信根证书(通常,这些证书包括所有自签名证书)的证书进行签名,则无法核实发行商信息。虽然 AIR 可以确定 AIR 程序包自签名以来未经修改,但无法知道文件的实际创建者和签名者。

注: 用户可以选择信任自签名证书,这样,用该证书签名的任何 AIR 应用程序就会显示该证书中的公共名称字段的值作为发行商名称。AIR 不为用户提供任何将证书指定为可信证书的方法。必须单独为用户提供证书(不包括私钥),且用户必须使用操作系统提供的某种机制或适当的工具将证书导入系统证书存储区中的正确位置。

关于 AIR 发行商标识符

重要说明: 从 AIR 1.5.3 开始,将弃用发行商 ID,并且不再基于代码签名证书计算发行商 ID。新应用程序不需要并且不应使用发行商 ID。更新现有应用程序时,必须在应用程序描述符文件中指定原始发行商 ID。

在 AIR 1.5.3 之前,AIR 应用程序安装程序在安装 AIR 文件的过程中生成发行商 ID。这是用于对 AIR 文件进行签名的证书的唯一标识符。如果对多个 AIR 应用程序重复使用同一个证书,它们将得到相同的发行商 ID。使用不同的证书(有时甚至使用原始证书的续签实例)对应用程序更新进行签名都会更改发行商 ID。

在 AIR 1.5.3 和更高版本中,发行商 ID 不是由 AIR 分配的。使用 AIR 1.5.3 发布的应用程序可以在应用程序描述符中指定发行商 ID 字符串。只有针对最初为 AIR 1.5.3 之前的版本发布的应用程序发布更新时,才应指定发行商 ID。如果在应用程序描述符中没有指定原始 ID,则新 AIR 包不会被视为现有应用程序的更新。

要确定原始发行商 ID,请在安装原始应用程序的 META-INF/AIR 子目录中查找 publisherid 文件。此文件中的字符串就是发行商 ID。要手动指定发行商 ID,应用程序描述符必须在应用程序描述符文件的命名空间声明中指定 AIR 1.5.3 运行时(或更高版本)。

发行商 ID(如果存在)用于以下用途:

  • 作为加密本地存储加密密钥的一部分

  • 作为应用程序存储目录路径的一部分

  • 作为本地连接的连接字符串的一部分

  • 作为用于使用 AIR 浏览器内 API 来调用应用程序的标识字符串的一部分

  • 作为 OSID(在创建自定义安装/卸载程序时使用)的一部分

当发行商 ID 改变时,所有依赖该 ID 的 AIR 功能的行为也会改变。例如,将无法访问现有加密本地存储中的数据,所有创建到应用程序的本地连接的 Flash 或 AIR 实例必须使用连接字符串中的新 ID。在 AIR 1.5.3 或更高版本中,无法更改已安装应用程序的发行商 ID。如果在发布 AIR 包时使用不同的发行商 ID,安装程序会将新包视为不同的应用程序而不是更新。

关于证书格式

AIR 签名工具接受任何可通过 Java 加密体系结构 (JCA) 访问的 Keystore。这包括基于文件的 Keystore(例如 PKCS12 格式的文件,通常使用 .pfx 或 .p12 文件扩展名)、Java .keystore 文件、PKCS11 硬件 Keystore 和系统 Keystore。ADT 可以访问的 Keystore 格式取决于用于运行 ADT 的 Java 运行时的版本和配置。访问某些类型的 Keystore(例如 PKCS11 硬件令牌)可能需要安装和配置附加的软件驱动程序和 JCA 插件。

若要对 AIR 文件进行签名,可以使用大部分现有的代码签名证书,也可以获取一个专门为对 AIR 应用程序进行签名而颁发的新证书。例如,可以使用 VeriSign、Thawte、GlobalSign 或 ChosenSecurity 所颁发的以下任何类型的证书:

  • ChosenSecurity

    • 用于 Adobe AIR 的 TC Publisher ID

  • GlobalSign

    • ObjectSign 代码签名证书

  • Thawte

    • AIR 开发人员证书 (AIR Developer Certificate)

    • Apple 开发人员证书 (Apple Developer Certificate)

    • JavaSoft 开发人员证书 (JavaSoft Developer Certificate)

    • Microsoft 验证码证书 (Microsoft Authenticode Certificate)

  • VeriSign

    • Adobe AIR 数字 ID

    • Microsoft 验证码数字 ID (Microsoft Authenticode Digital ID)

    • Sun Java 签名数字 ID (Sun Java Signing Digital ID)

注: 必须创建证书才能进行代码签名。不能使用 SSL 或其他证书类型对 AIR 文件进行签名。

时间戳

对 AIR 文件进行签名时,打包工具会查询时间戳机构的服务器,以获取可独立验证的签名日期和时间。获取的时间戳嵌入在 AIR 文件中。只要签名时签名证书有效,即使在证书过期后也可以安装 AIR 文件。另一方面,如果未获取时间戳,则在证书过期或被吊销之后,AIR 文件将变得不可安装。

默认情况下,AIR 打包工具会获取时间戳。然而,若要允许在时间戳服务不可用时打包应用程序,您可以禁用时间戳。Adobe 建议使所有公开分发的 AIR 文件都包含一个时间戳。

AIR 打包工具所采用的默认时间戳机构是 Geotrust。

获取证书

若要获取证书,您通常需要访问认证机构的网站,完成该公司的购买流程。使用何种工具生成 AIR 工具所需的 Keystore 文件,取决于所购买的证书的类型、证书在接收计算机上的存储方式,在某些情况下,还取决于用于获取证书的浏览器。例如,若要从 Thawte 获得和导出 Adobe Developer 证书,必须使用 Mozilla Firefox。然后可以直接从 Firefox 用户界面中以 .p12 或 .pfx 文件的形式导出证书。

注: Java 1.5 版及更高版本不允许在用于保护 PKCS12 证书文件的密码中使用高位 ASCII 字符。Java 由 AIR 开发工具用以创建签名的 AIR 包。将证书导出为 .p12 或 .pfx 文件时,只允许在密码中使用常规的 ASCII 字符。

可以使用用于打包 Air 安装文件的 Air 开发工具 (ADT) 生成自签名证书。也可以使用某些第三方工具。

有关如何生成自签名证书的说明以及有关对 AIR 文件进行签名的说明,请参阅 AIR Developer Tool (ADT)。您还可以使用 Flash Builder、Dreamweaver 和 AIR update for Flash 导出并对 AIR 文件进行签名。

下面的示例说明如何从 Thawte 认证机构获取 AIR 开发人员证书并准备好将它与 ADT 搭配使用。

示例:从 Thawte 获取 AIR 开发人员证书

注: 有众多方法可用来获取和准备代码签名证书以供使用,此示例仅说明了其中的一种。每个证书颁发机构都有其自己的策略和程序。

若要购买 AIR 开发人员证书,Thawte 网站要求您使用 Mozilla Firefox 浏览器。此证书的私钥存储在浏览器的 Keystore 内。请确保 Firefox Keystore 受主密码保护并且计算机本身在物理上是安全的。(完成购买流程后,您就可以从浏览器 Keystore 中导出和删除证书及私钥。)

在证书注册过程中,将生成一个私钥/公钥对。私钥自动存储在 Firefox Keystore 内。从 Thawte 的网站请求和取回证书时,必须使用相同的计算机和浏览器。

  1. 访问 Thawte 网站,并浏览至代码签名证书的产品页

  2. 从“Code Signing Certificates”列表中,选择“Adobe AIR Developer Certificate”。

  3. 完成三步注册过程。您需要提供您所在单位的信息和联系信息。Thawte 随后将执行其身份验证过程,并且可能要求提供其他信息。验证完成后,Thawte 将向您发送电子邮件,邮件中包含有关如何取回此证书的说明。

    注: 可以在此处找到有关所需文档类型的其他信息:https://www.thawte.com/ssl-digital-certificates/free-guides-whitepapers/pdf/enroll_codesign_eng.pdf
  4. 从 Thawte 网站取回颁发的证书。证书会自动保存到 Firefox Keystore。

  5. 按照以下步骤从 Firefox Keystore 导出包含私钥和证书的 Keystore 文件:

    注: 从 Firefox 导出私钥/证书时,它将以 ADT、Flex、Flash 和 Dreamweaver 可以使用的 .p12 (pfx) 格式导出。
    1. 打开 Firefox 的“证书管理器”(Certificate Manager) 对话框:

    2. 在 Windows 中:打开“工具”(Tools) ->“选项”(Options) ->“高级”(Advanced) ->“加密”(Encryption) ->“查看证书”(View Certificates)

    3. 在 Mac OS 中:打开“Firefox”->“首选参数”(Preferences) ->“高级”(Advanced) ->“加密”(Encryption) ->“查看证书”(View Certificates)

    4. 在 Linux 中:打开“编辑”(Edit) ->“首选参数”(Preferences) ->“高级”(Advanced) ->“加密”(Encryption) ->“查看证书”(View Certificates)

    5. 从证书列表中选择“Adobe AIR 代码签名证书”(Adobe AIR Code Signing Certificate),然后单击“备份”(Backup) 按钮。

    6. 输入文件名和 Keystore 文件的导出位置,然后单击“保存”(Save)。

    7. 如果您使用的是 Firefox 主密码,系统将提示您输入软件安全设备的密码才能导出文件。(此密码仅由 Firefox 使用。)

    8. 在“选择证书备份密码”(Choose a Certificate Backup Password) 对话框中,为 Keystore 文件创建一个密码。

      重要说明: 此密码用于保护 Keystore 文件,当使用该文件对 AIR 应用程序进行签名时需要提供此密码。应该选择一个安全密码。
    9. 单击“确定”。您应该会收到一条关于备份密码设置成功的消息。包含私钥和证书的 Keystore 文件以 .p12 文件扩展名保存(采用 PKCS12 格式)。

  6. 通过 ADT、Flash Builder、Flash Professional 或 Dreamweaver 使用导出的 keystore 文件。只要对 AIR 应用程序进行签名,就需要提供为该文件创建的密码。

重要说明: 私钥和证书仍存储在 Firefox Keystore 内。虽然这样使您可以导出证书文件的其他副本,但它同时也提供了另一个访问点,必须对此访问点加以保护才能维护证书和私钥的安全。

更改证书

在某些情况下,必须更改用于对 AIR 应用程序的更新进行签名的证书。此类情况包括:

  • 续签原始签名证书。

  • 从自签名证书升级到认证机构颁发的证书

  • 从即将到期的自签名证书更改为另一个自签名证书

  • 从一个商用证书更改为另一个商用证书,例如,当您的企业标识发生变化时

要使 AIR 将 AIR 文件识别为更新,必须使用同一证书对原始 AIR 文件和更新 AIR 文件进行签名,或者对更新应用证书迁移签名。迁移签名是使用原始证书对更新 AIR 包应用的第二次签名。迁移签名使用原始证书来证明签名者是应用程序的原始发行商。

安装了具有迁移签名的 AIR 文件后,新的证书将成为主要证书。后续更新不需要迁移签名。但是,您应尽可能地使用迁移签名,以便适应跳过更新的用户。

重要说明: 您必须更改证书,并在原始证书过期前使用原始证书为更新应用迁移签名。否则,用户必须卸载应用程序的现有版本,才能安装新的版本。对于 AIR 1.5.3 或更高版本,您可以在证书到期后的 365 天宽限期内使用过期证书来应用迁移签名。不过,您无法使用过期证书来应用主应用程序签名。

更改证书:

  1. 创建应用程序更新

  2. 将 AIR 更新文件打包并使用证书对它进行签名

  3. 使用原始证书再次对此 AIR 文件进行签名(使用 ADT -migrate 命令)

具有迁移签名的 AIR 文件在其他方面与普通 AIR 文件无异。如果应用程序安装在没有原始版本的系统中,则 AIR 会按照平常的安装方式安装新版本。

注: 在 AIR 1.5.3 之前,使用续签证书对 AIR 应用程序进行签名时并不总是需要迁移签名。从 AIR 1.5.3 开始,续签证书将始终需要迁移签名。

对 AIR 应用程序的更新版本进行签名中所述,要应用迁移签名,可使用ADT migrate 命令

注: ADT migrate 命令无法与包含本机扩展的 AIR 桌面应用程序配合使用,因为这些应用程序是作为本机安装程序打包,而不是作为 .air 文件打包。对于包含本机扩展的 AIR 桌面应用程序,要更改其证书,可使用ADT package 命令(带有 -migrate 标志)来打包应用程序。

应用程序标识更改

在 AIR 1.5.3 之前,安装使用迁移签名进行签名的更新时,AIR 应用程序的标识也会更改。更改应用程序的标识具有很多影响,包括:

  • 新应用程序版本无法访问现有的加密本地存储区中的数据。

  • 应用程序存储目录的位置会发生变化。旧位置中的数据不会复制到新目录。(但新应用程序可以根据旧发行商 ID 找到原始目录)。

  • 应用程序无法再使用旧发行商 ID 打开本地连接。

  • 用于从网页访问应用程序的标识字符串发生更改。

  • 应用程序的 OSID 发生更改。(编写自定义安装/卸载程序时会使用 OSID)。

使用 AIR 1.5.3 或更高版本发布更新时,无法更改应用程序标识。在更新 AIR 文件的应用程序描述符中必须指定原始应用程序和发行商 ID。否则,不会将新包识别为更新。

注: 使用 AIR 1.5.3 或更高版本发布新的 AIR 应用程序时,不应指定发行商 ID。

术语

本节提供了一个术语表,阐释在决定如何对要公开发布的应用程序进行签名时应了解的部分关键术语。

术语

说明

认证机构 (CA)

公钥基础结构网络中的一个实体,担当受信的第三方,并最终对公钥所有者的身份进行证实。CA 通常会颁发由它自己的私钥进行签名的数字证书,以证明它已经核实了证书持有者的身份。

证书实行声明 (CPS)

规定认证机构在颁发和核实证书方面的做法和政策。CPS 是 CA 及其订户与信任方达成的合约的一部分。它还拟定了身份核实方面的政策及它们所提供的证书具备的保证程度。

证书吊销列表 (CRL)

已被吊销而不应再受到信任的已颁发证书列表。AIR 在对 AIR 应用程序进行签名时检查 CRL,如果不存在时间戳,它会在安装该应用程序时再次进行检查。

证书链

证书链是一个证书序列,链中的每个证书已由下一个证书进行签名。

数字证书

一种数字文档,包含所有者的身份、所有者的公钥以及证书本身的标识的有关信息。由认证机构颁发的证书本身由属于颁发证书的 CA 的证书进行签名。

数字签名

经过加密的消息或摘要,只能用公钥-私钥对的公钥部分解密。在 PKI 中,数字签名包含一个或多个最终来源于认证机构的数字证书。数字签名可用来证实消息(或计算机文件)自签名以来未经修改(在所用的加密算法提供的保证限制范围内);此外,假如使用者信任颁发证书的认证机构,也可以用数字签名来证实签名者的身份。

Keystore

包含数字证书、在某些情况下也包含相关私钥的数据库。

Java 加密体系结构 (JCA)

一种用于管理和访问 Keystore 的可扩展体系结构。有关详细信息,请参阅 Java 加密体系结构参考指南

PKCS #11

由 RSA Laboratories 提出的加密令牌接口标准。也是一种基于硬件令牌的 Keystore。

PKCS #12

由 RSA Laboratories 提出的个人信息交换语法标准。也是一种基于文件的 Keystore,通常包含私钥及其关联的数字证书。

私钥

由两部分组成的公钥-私钥非对称加密体系的私有部分。私钥必须保密,绝不应该通过网络传送。进行数字签名的消息由签名者通过私钥进行加密。

公钥

由两部分组成的公钥-私钥非对称加密体系的公开部分。公钥是公开提供的,用于解密用私钥加密的消息。

公钥基础结构 (PKI)

认证机构用来证明公钥所有者身份的一种信任体系。网络客户端依靠受信的 CA 颁发的数字证书来核实数字消息(或文件)签名者的身份。

时间戳

包含事件发生日期和时间的经过数字签名的数据。ADT 可以将符合 RFC 3161 的时间服务器中的时间戳包含在 AIR 包中。如果存在时间戳,AIR 便在签名时使用时间戳确定证书的有效性。这样,AIR 应用程序便可在其签名证书过期后安装。

时间戳机构

颁发时间戳的机构。为了使 AIR 能够识别,时间戳必须符合 RFC 3161,并且时间戳签名必须链至安装计算机上的可信根证书。

iOS 证书

Apple 颁发的代码签名证书用于对 iOS 应用程序进行签名,包括那些使用 Adobe AIR 开发的应用程序。要在测试设备上安装应用程序,必须使用 Apple 开发证书应用签名。要分发最终完成的应用程序,必须使用分发证书应用签名。

若要对应用程序进行签名,ADT 需要访问代码签名证书和关联的私钥。证书文件本身不包括私钥。您必须创建一个个人信息交换文件(.p12 或 .pfx)形式的 keystore,该文件中同时包含证书和私钥。请参阅将开发人员证书转换为 P12 keystore 文件

生成证书签名请求

若要获取开发人员证书,应生成证书签名请求,然后在 Apple iOS Provisioning Portal 中提交该请求。

证书签名请求过程会生成一个公钥私钥对。私钥会保留在您的计算机上。您将包含公钥的签名请求以及您的标识信息发送给 Apple(该公司担任证书颁发机构)。Apple 会利用自己的 World Wide Developer Relations 证书签署您的证书。

在 Mac OS 上生成证书签名请求

在 Mac OS 上,您可以使用钥匙串访问应用程序生成代码签名请求。钥匙串应用程序位于“应用程序”目录的“实用工具”子目录中。您可以在 Apple iOS Provisioning Portal 中查看有关生成证书签名请求的说明。

在 Windows 上生成证书签名请求

对于 Windows 开发人员,在 Mac 计算机上获取 iPhone 开发人员证书可能最容易。但是,也可以在 Windows 计算机上获取证书。首先,使用 OpenSSL 创建一个证书签名请求(CSR 文件):

  1. 将 OpenSSL 安装在 Windows 计算机上。(请访问 http://www.openssl.org/related/binaries.html。)

    您可能还需要安装 Open SSL 下载页上列出的 Visual C++ 2008 Redistributable 文件。(需要在您计算机上安装 Visual C++。)

  2. 打开 Windows 命令会话,使用命令 CD 到 OpenSSL bin 目录(例如 c:\OpenSSL\bin\)。

  3. 通过在命令行中输入下列内容创建私钥:

    openssl genrsa -out mykey.key 2048

    保存此私钥文件。稍后您将使用它。

    当使用 OpenSSL 时,请不要忽略错误消息。即使 OpenSSL 生成错误消息,它也可能输出文件。不过,这些文件可能不可用。如果发现错误,请检查语法并再次运行命令。

  4. 通过在命令行中输入下列内容创建 CSR 文件:

    openssl req -new -key mykey.key -out CertificateSigningRequest.certSigningRequest  -subj "/emailAddress=yourAddress@example.com, CN=John Doe, C=US"

    使用您自己的电子邮件地址、CN(证书名称)和 C(国家/地区)替换现有值。

  5. 将 CSR 文件上载到 Apple 的 iPhone 开发人员站点。(请参阅“申请 iPhone 开发人员证书并创建供给配置文件”。)

将开发人员证书转换为 P12 keystore 文件

若要创建 P12 keystore,您必须将 Apple 开发人员证书和关联的私钥合并到一个文件中。创建 keystore 文件的过程取决于您用于生成原始证书签名请求的方法以及存储私钥的位置。

在 Mac OS 上将 iPhone 开发人员证书转换为 P12 文件

从 Apple 下载 Apple iPhone 证书后,将其导出为 P12 keystore 格式。在 Mac® OS 上执行以下操作:

  1. 打开钥匙串访问应用程序(位于应用程序/实用工具文件夹中)。

  2. 如果尚未将该证书添加到钥匙串,请选择“文件”>“导入”。然后浏览到您从 Apple 获取的证书文件(.cer 文件)。

  3. 在钥匙串访问中选择密钥类别。

  4. 选择与 iPhone 开发证书相关联的私钥。

    该私钥由 iPhone 开发人员识别:与之配对的<名字><姓氏>公共证书。

  5. 按住 Command 键单击 iPhone 开发人员证书,并选择 Export “iPhone Developer: Name...”

  6. 以个人信息交换 (.p12) 文件格式保存您的 keystore。

  7. 系统将提示您创建一个密码,当您使用 keystore 对应用程序进行签名或者将在某个 keystore 中的密钥和证书传递到另一 keystore 时会用到该密码。

在 Windows 上将 Apple 开发人员证书转换为 P12 文件

若要开发 AIR for iOS 应用程序,必须使用 P12 证书文件。基于从 Apple 收到的 Apple iPhone 开发人员证书文件生成此证书。

  1. 将从 Apple 收到的开发人员证书文件转换成 PEM 证书文件。从 OpenSSL bin 目录运行以下命令行语句:

    openssl x509 -in developer_identity.cer -inform DER -out developer_identity.pem -outform PEM
  2. 如果您使用的是 Mac 计算机上钥匙串中的私钥,则将其转换成 PEM 密钥:

    openssl pkcs12 -nocerts -in mykey.p12 -out mykey.pem
  3. 现在,您可以基于密钥和 PEM 版本的 iPhone 开发人员证书生成有效的 P12 文件:

    openssl pkcs12 -export -inkey mykey.key -in developer_identity.pem -out iphone_dev.p12

    如果您使用的是 Mac OS 钥匙串中的密钥,则使用上一步骤中生成的 PEM 版本。否则,请使用以前生成的 OpenSSL 密钥(位于 Windows 上)。