如何申请和使用 ServBay 代码签名证书
概述
在软件开发和分发过程中,代码签名是确保用户信任和软件完整性的关键步骤。通过对代码进行数字签名,开发者可以证明软件的来源,并确保自签名以来代码未被篡改。
ServBay 提供了一个方便的功能,允许开发者在其本地环境中申请和使用由 ServBay 内部 CA 签发的代码签名证书。这些证书特别适用于:
- 在本地开发或测试阶段对软件进行签名,模拟真实的签名流程。
- 对内部使用的脚本、工具或应用程序进行签名,以便在团队或受信任的环境中验证其来源和完整性。
- 学习和实践代码签名的整个流程,无需购买昂贵的商业代码签名证书。
重要提示: 通过 ServBay 内部 CA 签发的代码签名证书不是由公共信任的证书颁发机构(如 Let's Encrypt, Comodo 等)签发的。它们不会被公共操作系统或浏览器默认信任。因此,这些证书不适合用于需要公共信任的场景,例如分发给最终用户的商业软件、应用商店提交或需要通过操作系统安全检查(如 macOS Gatekeeper 对未知开发者的警告)的软件。它们主要用于本地开发、测试或受控环境下的签名。
代码签名证书简介
代码签名证书是一种数字证书,用于对可执行文件、脚本、库等软件代码进行数字签名。其核心作用在于建立信任和保障安全:
- 验证软件发布者身份: 证书包含发布者的信息,数字签名可证明软件确实来自证书中标识的开发者或组织。
- 确保代码完整性: 签名过程会生成一个基于代码内容的哈希值,并使用私钥加密。验证时,系统会重新计算哈希值并使用公钥解密签名中的哈希值进行比对。任何对代码的修改都会导致哈希值不匹配,从而使签名验证失败,表明代码已被篡改。
- 提升用户信任: 操作系统或安全软件通常会对未签名的或来自未知发布者的软件发出安全警告。使用代码签名证书可以消除这些警告(在受信任的环境中,或当 ServBay 的 CA 被手动添加到信任链时),提升用户安装和使用软件的信心。
- 防止恶意软件传播: 代码签名使得用户能够更容易地区分合法软件和伪装成合法软件的恶意程序,从而帮助防止恶意软件的传播。
通过 ServBay 申请代码签名证书
ServBay 简化了在本地环境中获取代码签名证书的流程。
打开 SSL 证书管理面板: 在 ServBay 应用的侧边栏中,点击 "SSL Certificates" 菜单项。
发起新证书请求: 在 SSL 证书管理页面的右上角,点击 "+"(添加)按钮。
填写证书信息: 在 "Request Certificate"(请求证书)页面中,您需要填写以下关键信息:
- Common Name (通用名称): 填写您的组织名称或个人姓名。例如:
ServBay, LLC
或ServBay Demo Developer
。 - Usage Purpose (用途): 选择证书的使用目的。请选择
Code Signing
(代码签名)。 - Request Method (请求方法): 选择证书的签发方式。选择
ServBay CA
,表示使用 ServBay 内置的证书签发功能。 - Issuer (签发者): 选择用于签发此证书的 ServBay 内部 CA。通常选择
ServBay User CA
。 - Algorithm (算法): 选择用于生成密钥对的加密算法。常见的选项包括
ECC
(椭圆曲线加密) 或RSA
(Rivest-Shamir-Adleman)。ECC 通常提供更高的安全性,同等安全强度下密钥长度更短。 - Key Length (密钥长度): 选择所选算法的密钥长度。对于 ECC,例如
384
;对于 RSA,例如2048
或4096
。更长的密钥通常更安全,但处理速度可能稍慢。 - Password (密码): 非常重要! 设置一个强大的密码来保护您的证书私钥。这个密码在导出证书(
.p12
文件)并在代码签名工具中使用时需要提供。请务必牢记此密码,因为 ServBay 无法帮助您恢复丢失的私钥密码。您可以选择一个自定义密码。(注:截图中的ServBay.dev
是示例密码,请勿在实际使用中采用此弱密码,请选择您自己的安全密码。)
截图示例,请根据您的实际信息填写
- Common Name (通用名称): 填写您的组织名称或个人姓名。例如:
提交证书申请: 填写完所有信息并确认无误后,点击页面底部的 "Request" 按钮。ServBay 将使用您指定的 ServBay User CA 自动为您签发代码签名证书。
证书导出和使用
成功申请到代码签名证书后,您需要将其导出为标准格式以便在各种代码签名工具中使用。ServBay 导出的证书通常是 .p12
格式文件。
进入 SSL 证书管理面板: 在 ServBay 侧边栏中点击 "SSL Certificates"。
找到您的代码签名证书: 在证书列表中,找到您刚刚申请的、用途为 "Code Signing" 的证书。
点击导出操作: 点击该证书条目右侧的导出图标(通常是一个向右箭头的图标)。
选择导出目录并设置密码: 在弹出的导出窗口中,选择您希望将证书文件保存到的本地目录。导出的文件格式通常是
.p12
(PKCS#12)。这个文件包含您的代码签名证书和其对应的私钥,因此受到密码保护。您需要输入在申请证书时设置的密码来完成导出。在代码签名工具中使用证书: 将导出的
.p12
文件导入到您的代码签名工具中。不同的操作系统和开发环境使用不同的工具:- macOS: 使用内置的
codesign
命令行工具。您可能需要先将.p12
文件导入到 macOS 的钥匙串访问 (Keychain Access) 中。 - Windows: 使用 Windows SDK 提供的
signtool.exe
命令行工具。您可能需要先将.p12
文件导入到 Windows 的证书管理器中。 - 其他平台/工具链: 根据您使用的具体技术栈和构建工具(如 Java 的
jarsigner
,.NET 的SignTool
,Go 的第三方签名工具等),查找相应的导入和签名方法。通常都需要提供.p12
文件路径和私钥密码。
- macOS: 使用内置的
导入证书后,您就可以使用该证书对您的代码、应用程序、驱动程序等进行数字签名。
使用代码签名证书对代码进行签名的例子 (macOS)
以下示例演示了如何在 macOS 上使用 codesign
工具和通过 ServBay 导出的 .p12
证书对一个简单的二进制文件进行签名和验证。
假设您已经将 ServBay 导出的 .p12
文件导入到了 macOS 的钥匙串访问中,并且在导入时输入了正确的密码。
# 1. 创建一个简单的 C 语言源文件用于测试签名
# 将以下内容保存为 test.c
cat <<EOF > test.c
#include <stdio.h>
int main() {
printf("Hello, ServBay Code Signing!\n");
return 0;
}
EOF
# 2. 使用 gcc 编译 C 文件生成一个二进制可执行文件
# -o /tmp/test 指定输出文件名为 /tmp/test
gcc test.c -o /tmp/test
echo "编译成功,生成 /tmp/test"
# 3. 查找可用于代码签名的证书身份 (Identity)
# -v 显示详细信息
# -p codesigning 过滤出可用于代码签名的证书
# 找到您的证书对应的 "Common Name" 或其哈希值 (如 99C183BC3796067FAFBA6F232D1C3C3425DAABDA)
security find-identity -v -p codesigning
# 示例输出可能类似这样:
# 1) ABCDEF1234567890ABCDEF1234567890ABCDEF12 "Apple Development: Your Name (XYZ123)"
# 2) 99C183BC3796067FAFBA6F232D1C3C3425DAABDA "ServBay Demo Developer"
# 2 valid identities found
# 记下 ServBay 证书对应的哈希值或 Common Name ("ServBay Demo Developer")
# 4. 使用找到的证书对二进制文件进行签名
# -f 强制签名 (如果文件已有签名则替换)
# -s 指定签名身份,可以使用哈希值或 Common Name (如果唯一)
# --timestamp 添加时间戳 (可选,但推荐,用于验证签名时效性)
# /tmp/test 是要签名的文件路径
codesign -f -s "ServBay Demo Developer" --timestamp /tmp/test
# 或者使用哈希值:
# codesign -f -s "99C183BC3796067FAFBA6F232D1C3C3425DAABDA" --timestamp /tmp/test
echo "/tmp/test 已使用代码签名证书签名"
# 5. 验证签名是否正确
# -dvvv 显示非常详细的签名信息
codesign -dvvv /tmp/test
# 检查输出中的 "Authority" 字段,应该显示您的证书信息和 ServBay CA 链
# 检查 "Signature size" 和 "CDHash" 等,表明文件已被签名
# 检查 "Timestamp" 是否存在
# 示例验证输出的一部分可能包含:
# Authority=ServBay Demo Developer
# Authority=ServBay User CA - ECC Code Signing
# Authority=ServBay Public CA - ECC Root
# Timestamp=Nov 7, 2024 at 18:26:48 (示例日期)
# 6. 尝试修改文件内容,破坏签名
# 向文件中写入随机数据,这会改变文件的哈希值
echo "abcde" >> /tmp/test
echo "/tmp/test 内容已被修改"
# 7. 再次验证签名
# 此时签名验证应该失败
codesign -dvvv /tmp/test
# 示例输出:
# /tmp/test: code object is not signed at all
# 或者类似的错误信息,表明签名已失效,因为文件内容与签名时不一致。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
说明:
security find-identity
用于列出钥匙串中可用于特定用途(如codesigning
)的证书。找到您导入的 ServBay 证书对应的身份标识(通常是 Common Name 或其哈希值)。codesign -f -s "Your Identity"
命令执行签名。--timestamp
选项联系时间戳服务器,将签名与一个可信的时间关联起来,即使证书过期,只要签名时证书有效且时间戳有效,签名依然被认为是有效的。codesign -dvvv
命令用于详细验证签名。它会检查证书的有效性、信任链以及文件内容是否与签名时的哈希值匹配。- 最后一步修改文件并再次验证,演示了代码签名的核心功能:完整性验证。任何对文件的修改都会导致签名失效。
证书续期
ServBay 签发的代码签名证书具有一定的有效期(通常为 800 天)。在证书到期前,您可以在 ServBay 的 SSL 证书管理面板中对证书进行续期。
- 进入 SSL 证书管理面板。
- 找到需要续期的代码签名证书。
- 点击续期操作: 点击证书条目右侧的续期图标(通常是循环箭头的图标)。
- 确认续期: 点击续期按钮后,ServBay 会签发一个新的证书,其有效期从当前日期开始计算 800 天。
证书删除
如果您不再需要某个代码签名证书,可以将其从 ServBay 中删除。
- 进入 SSL 证书管理面板。
- 找到需要删除的证书。
- 点击删除操作: 点击证书条目右侧的垃圾桶图标。
- 确认删除: 在弹出的确认菜单中选择 "Delete",并再次确认您的删除操作。请注意,删除后证书将无法恢复。
常见问题 (FAQ)
Q: ServBay 签发的代码签名证书是免费的吗?
A: 是的,通过 ServBay 内部 CA 签发的证书是 ServBay 提供的内置功能,无需额外费用。
Q: 我可以使用 ServBay 签发的证书对我的商业软件进行签名并分发给用户吗?
A: 不可以。 ServBay 签发的证书是由其内部 CA 签发的,不被公共操作系统和软件商店默认信任。它们仅适用于本地开发、测试或受控的内部环境。用于公开分发的商业软件需要从受公共信任的证书颁发机构购买代码签名证书。
Q: 我忘记了导出 .p12
文件时设置的密码,怎么办?
A: ServBay 不存储您的私钥密码。如果您忘记了密码,将无法导出或使用该证书的私钥。您需要删除该证书,然后重新申请一个新的代码签名证书。
Q: 我可以将 ServBay User CA 添加到我的操作系统信任存储中吗?
A: 可以,通常需要导出 ServBay User CA 证书并手动导入操作系统或浏览器的信任存储。
总结
ServBay 提供的代码签名证书功能为开发者在本地环境进行软件签名测试和内部工具签名提供了便利。通过本指南,您应该已经了解了如何在 ServBay 中申请、导出以及使用这些证书的基本流程。请记住,这些证书主要用于开发和测试目的,不应用于需要公共信任的场景。
如果您在申请或使用过程中遇到任何问题,建议查阅 ServBay 的官方文档或寻求社区支持。