本文简要介绍软件开发人员所需的安全措施,以及如何在发布桌面、移动应用和可执行软件之前签署代码。
初学者应首先了解以下技术术语,以理解代码签名与发布流程:
软件(Software):由个人或公司开发、供计算机和/或移动设备使用的程序。
代码(Code):为特定目的设计软件而组合的专业词汇、字母、问题、逻辑、数字等。
开发者(Developer):编写、设计并发布特定程序或软件的公司或个人。
代码签名(Code Signing):使用特定受认可证书对软件进行数字签名的过程。
代码签名证书(Code Signing Certificate):由受认可证书颁发机构签发给个人或公司的签名文件。
时间戳(Time Stamping):显示软件何时被签署、且在软件发布流程之前加盖的数字记录。
智能筛查(Smart Screening):识别外来应用是否安全、合法或具正当性的过程。
软件市场背景
据估计,全球软件开发市场规模在 2021 年已达数百亿美元级别,并预计将持续大幅增长。另一项研究显示,2022 年 10 月 Google Play 发布的应用数量较此前有显著增长。开发者或企业在开发软件上投入大量时间与资金,或以变现为目的,或为客户提供服务。但在同一领域,并非所有应用都能获得火箭般的下载与安装——有些败在用户友好性,有些败在竞争,而多数败在未能获得用户信任。在向客户推出产品之前,企业应确保其软件在安全的生产平台上开发,并由受认可机构签署。
大多数数字制作公司在开发移动应用或桌面软件时遵循严格标准,如安全 CI/CD、使用合法程序、合法授权的应用开发平台、经过认证的开发者、消毒处理的计算机等。但他们多数忽略了使软件或应用可信赖的至关重要一环。
桌面与移动用户平均每天为每台设备下载约 10 个应用,并因可疑原因避免安装其中约半数应用,另有约四分之一在安装后立即卸载。下文将聚焦讨论阻止用户在设备上安装应用或软件的可疑原因。在发布移动应用或桌面软件前,你应考虑如何让自己的发布对目标受众可信且合法。
如今,Microsoft、Apple、Android、Linux 等移动与桌面操作系统都更加注重保护用户免受篡改、感染与恶意软件的侵害,提供内置应用扫描器以了解所安装软件的目的与可信度。智能筛查过程不会让用户安装恶意或可疑软件,或在安装开始前请求用户同意(附警告消息)。智能筛查由操作系统与杀毒软件共同控制。在安装打印机驱动、备份应用或数据恢复应用时,我们可能都频繁见过类似画面。第一步是理解智能筛查过程以及如何拿满分通过筛查。
操作系统或杀毒软件会扫描外来应用以获取应用目的、发布者信息、发布日期等信息,引擎还会将应用的签名与现有安全及有害应用数据库进行匹配。要在软件发布版本中添加发布者信息,开发者需使用代码签名流程。
什么是代码签名?完成此过程需要什么?
代码签名是将发布者信息嵌入软件或应用发布版本的过程。发布者信息包括发布此应用的个人或企业、发布者物理位置、电子邮件或电话等联系方式,所有这些信息都应由受认可的第三方验证并整合为单一数字凭证。
要签署应用代码,你需要:
— 由全球受信任证书颁发机构(即 CA)签发的代码签名证书。
— 将此代码签名证书嵌入应用的软件或工具。
— 有效的时间戳服务器连接,以在数字发布中添加精确的盖章日期与时间。
谁提供高度受信任的代码签名证书?
由 DigiCert、Comodo、Sectigo 等 CA 签发的代码签名证书被广泛信任,覆盖几乎所有操作系统与杀毒软件。在购买其签名证书与方案前,你应核查 CA 的可信度。
CA 提供多少种代码签名证书?
代码签名证书按以下维度分类:
请求方类型:个人、企业或组织。
请求方验证:标准个人验证、基础组织验证、企业扩展验证。
代码签名证书的成本如何?
代码签名证书的成本取决于你选择的购买渠道,如直接厂商或授权分销商。具体价格因验证级别、品牌与有效期而异,建议向授权渠道询价以获取适合你业务需求的方案。
在哪里购买受信任的代码签名证书?
始终选择可信的 CA 与分销商为企业采购代码签名证书。一些低价广告商可能吸引你的注意,但可能给你的业务带来巨大的财务或声誉损失。
代码签名流程与证书如何帮助获得火箭般的下载量?
经过数字签名的可执行软件与移动应用将自动通过 Windows、Android、iOS 等操作系统的智能筛查,用户不会再遇到不安全软件警告,这有助于提升应用的安装与下载量。
如何识别软件是否已签名?
签署代码后,软件的数字属性将可查看。你可以对比已签名与未签名软件或应用的数字属性。
移动与桌面应用的代码签名流程有何不同?
Microsoft:要在 Windows Marketplace for Mobile 分发应用,开发者需在应用进入商店目录前对每个内容更新签名。代码签名软件的示例包括 Windows 应用、Windows 软件更新、Apple 软件、Microsoft Office VBA 对象与宏、.jar、.air 与 .airi 文件以及任何类型的可执行文件。
Windows 流程:
— 使用 Visual Studio 或属于 Windows SDK 的 SignTool 签名。
— 由受信任/知名 CA 签发的有效代码签名证书,以及 PFX 文件。
— 打包的 Windows 应用,例如使用应用打包工具(如 MakeAppx.exe)创建的 .appx 文件。
Apple:对于 iOS 应用,代码签名使用 Xcode。要向 iTunes 商店上传软件,用户必须拥有有效的 Apple Developer ID 及有效证书或配置文件,Xcode 才会签署软件。与 Android 不同,你不能在 iOS 设备上安装任何未经 Apple 签名的应用。
前提条件:
— macOS
— Apple Developer Membership
— Xcode 9+
要集成应用,开发者需使用开发证书;要在任何设备上运行应用,则必须使用分发证书来分发与测试应用。第三方应用还必须使用 Apple 签发的证书进行验证与签名。
Android:APK 是 Android 移动平台(Android Application Package)的文件扩展名。进行代码签名需要:将包发送给分发商;创建 Java Development Kit(JDK)文件;用私钥签署应用包或 APK;修改 build.Gradle。应用可由第三方(OEM、运营商、替代市场)签名或自签名。Android 提供使用自签名证书的代码签名,开发者可自行生成而无需外部协助或许可,应用不必由中央机构签名。Android 目前不对应用证书执行 CA 验证,就 Android 应用而言,证书无需由 CA 签名。
如何签署我的代码?
完成所有必要验证且 CA 签发代码签名证书后,证书将通过邮件发送。CA 发送的包中包含需保存到设备的 .p12(PFX)文件,若非 PFX 格式需转换。签署代码的流程可能因你执行的平台或机器而异。
如何用 Microsoft Visual Basic for Applications (VBA) 签署代码?
你可以对 Microsoft Office 应用(如 Word、Excel)和 Visual Studio 中开发的内容进行数字签名:
— 打开项目文件。
— 在 developer 选项卡下点击 code 部分。
— 在 code 部分找到"visual basic"。
— 在 Visual Basic Project Explorer 中搜索并选择你的项目。
— 接着在 Tools 菜单中找到 Digital Signature。
— 点击 Digital Signature 并选择用于签署代码的证书。
— 接着点击 OK 两次,项目即完成代码签名。
如何用 Microsoft Authenticode 签署代码?
Microsoft Authenticode 使用加密算法的加密来确保应用代码完整性。以下是对 MS Authenticode 进行代码签名的方法:
— 运行 SDK 命令提示符打开 Microsoft Digital Signing Wizard(此过程需安装 NET 框架)。
— 输入 signtool.exe signing wizard 并回车。
— 将打开新的数字签名窗口。
— 点击 next 继续并浏览你的证书文件。
— 找到文件后点击 next。
— 在下一窗口点击"Typical"签名选项。
— 现在选择在存储中搜索证书的选项。
— 通过提供位置路径选择设备上的证书文件。
— 点击 next 两次,代码即完成签名。
如何用 Microsoft SignTool 签署代码?
SignTool 是供开发者与发布者签署代码及为文件加时间戳的实用工具。幸运的是,现代 Windows 版本内置了 SignTool,你可在命令提示符中使用 PFX 文件为软件签名。
对于 PFX 文件格式,可使用以下命令行:
signtool sign /f YourCert.pfx /p YourPassword /fd SHA256 YourFile.exe
上述命令行对自签名与 CA 签发证书均适用。若无法访问 PFX 文件,可使用以下命令行:
signtool sign /n "YourCert_SubjectName" /fd SHA256 /v YourFile.exe
使用 EV 代码签名证书签名
EV 代码签名证书最关键的方面之一是其私钥,它通过实物邮件存储在 USB 令牌中。收到包裹后:
— 将 USB 令牌插入系统。
— 打开系统中的 SafeNet 等中间件客户端。
— 现在打开命令提示符并输入以下命令行:
signtool sign /tr http://timestamp.CA.com /td sha256 /fd sha256 /a "Insert_path_to_my_file_to_sign_code"
— 系统会要求输入先前设置的密码。
— 输入密码后,你的应用即完成代码签名。
如何在 Android 中签署代码
Android 要求所有 APK 在安装到设备前使用数字证书签名。因此,开发者需用上传密钥签署应用包,在分发到 Play 商店或其他商店前必须签署 APK。以下是 Android 代码签名的步骤:
— 使用 Android Studio 与 Keystore 创建上传密钥。
— 之后用上传密钥签署应用;若没有已签名的 Bundle,需先构建。
— 现在需要配置尚未安装的应用签名。为此,创建上传密钥并用其签署应用,然后登录 Play Console,发布应用版本。
— 选择发布轨道后,在 App Integrity 部分按如下方式配置应用签名:首次签署应用应使用上传密钥,你可以使用开发者账户中另一应用的相同密钥,只需按以下选项操作:
— 选择 Change app signing key。
— 选择 Use my own key。
— 选择 Use the same key as another app。
— 选择一个应用。
— 点击 Continue。
— 将应用上传到 Google Play。
— 准备并发布应用版本。
如何在 iPhone 中签署代码
要在 iPhone 中签署代码,需创建 CSR(证书签名请求),按以下步骤创建 CSR:在 Mac 上通过 Spotlight Search 打开 Keychain Access;访问 Menu >> Keychain Access >> Certificate Assistant >> Request a certificate;填写证书表单并点击"Saved to disk",点击"Continue";点击"Show In Finder",点击"Done"。
生成证书:创建证书需拥有 Apple Developer Program Membership。开发证书用于内部应用开发,分发证书用于应用发布。创建分发证书的步骤如下:
— 访问 Apple Developer Portal 并用 User ID 与密码登录。
— 选择"Certificate, IDs and Profiles"选项。
— 点击"+"按钮。
— 现在选择 iOS Distribution 选项。
— 点击 Choose File 并上传 CSR。
— 将生成的 iOS 分发证书下载到本地计算机。
— 点击下载的证书将其添加到本地设备的 keychain。
— 你也可以从 keychain 导出证书并设置证书密码。
证书生成后,开发者需注册 App ID 以使应用在 App store 上可识别。注册 App ID 的步骤如下:
— 转到左侧菜单的 Identifiers 选项并点击"+"按钮。
— 选择 App ID 选项并点击 Continue。
— 输入应用的 Description 与 Bundle ID 并点击 Continue。
— 最后点击 Register 按钮,App ID 注册成功。
如何在 Java 中签署代码
下面给出在 Java 平台签署 EV 代码签名证书的示例。你应拥有 EV 代码签名证书、配置好的 SafeNet Authentication Client 版本与 JDK(Java Development Kit)。首先将 EV 代码签名令牌连接到 PC 的 USB;打开记事本创建文本文件,复制相关行并保存到 JDK bin 文件夹;打开命令提示符访问 JDK bin 文件夹,运行以下命令创建私钥别名;随后系统会要求输入令牌注册时设置的密码,此处私钥别名为 le-734f69fa-ba68-4e73-a7ca-027815a944c9;之后使用相应代码签署 JAR 文件;最后验证 JAR 文件是否正确配置,使用以下命令:
jarsigner -verify -verbose <your JAR filename>
结论
代码签名证书对用户信任至关重要,并确保你的源代码完好无损。此外,它还能确保你的应用不暴露于网络攻击。网络攻击日益增多、应用市场庞大,意味着你必须在安全问题上做好准备。本文讨论了不同类型的代码签名证书及如何使用它们,但选择哪一种为代码签名将取决于你的项目需求。