bg-tutorials

如何在Android上生成CSR

本教程将向您展示如何使用 Java keytool 工具为 Android 生成 CSR(证书签名请求)

Android 本身并不在手机上生成公共 CA 的 TLS CSR:公共 CA 证书是为服务器(或用户控制的设备)签发的,Android 应用和浏览器只是使用该证书。下面的 keytool 流程会从 Java 密钥库生成 PKCS #10 请求,这正是在您需要一个 Android 应用或面向移动端网站信任的 TLS 证书时应采用的正确路径。

为您的情况选择正确的流程

“Android 的 CSR”可能有三种不同的含义。在运行任何命令之前,请确保您找到了正确的内容:

  • 为 Android 客户端要通信的服务器生成 TLS 证书。这是最常见的情况,本页其余部分将围绕它展开。使用下面的 keytool,或使用我们的CSR 生成器在服务器外生成 CSR,然后将签发的证书安装到您应用所访问的 web 服务器、API 网关或 MQTT broker 上。
  • APK 或 AAB 的签名密钥。Android 应用签名使用的是 Java 密钥库中的自签名 RSA 或 EC 密钥:不涉及公共 CA,也无需提交 CSR。请通过 Android Studio 的Build > Generate Signed Bundle / APK向导生成密钥(或手动运行 keytool),然后在 Google Play App Signing 中注册该密钥。切勿为此订购公共证书。
  • 由 MDM 或 EMM 配置发放的设备证书。Android Enterprise 通过 SCEP、EST 或 Managed Configurations API 向受管理的设备发放客户端证书。CSR 由 MDM 自动生成,证书也自动安装,无需手动执行 keytool 操作。

如果您的情况属于第一种,请继续阅读。整个流程分为两个部分:先创建一个保存私钥的 PKCS12 密钥库,然后从该密钥库导出 CSR。

您需要准备的内容

  • 已安装 Java(JDK 或 JRE),以便您的 PATH 中可以使用 keytool 命令。可通过 keytool -help 确认。在 Windows 系统中,Java 的 bin 文件夹必须位于 PATH 中,或者您也可以直接从 JDK 的 bin 目录运行 keytool。
  • 您要保护的确切完全限定域名(FQDN)(例如 www.yoursite.com),以及您希望在同一证书上添加的其他主机名(用于主题备用名称列表)。
  • 您所在机构的法律信息(国家、州/省、城市、机构名称),用于填写专有名称。请使用与公开工商登记记录完全一致的信息:CA 会拒绝不匹配的内容。

第一步:创建密钥库和私钥

如果您已经生成了 CSR,请直接跳到提交 CSR,然后再查看Android SSL 安装说明

打开终端(在 Windows 上打开命令提示符),运行下面的 keytool 命令。该命令会以 PKCS12 格式创建一个新的密钥库,在其中生成一个 2048 位的 RSA 密钥对,并使用您选择的别名存储该密钥。自 JDK 9 起,PKCS12 已成为默认的密钥库格式;较旧的 JKS 格式已被弃用,新密钥应避免使用它。

keytool -genkeypair 
  -alias myalias 
  -keyalg RSA -keysize 2048 
  -storetype PKCS12 
  -keystore yoursite.p12 
  -validity 825

在 Windows 上,将同一命令写成一行是这样的(请注意使用绝对路径,以便您之后能再次找到该文件):

keytool -genkeypair -alias myalias -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore C:certsyoursite.p12 -validity 825

各参数的含义:

  • -alias myalias:密钥库中该条目的名称。请选择一个您能记住的标签,并把它记录下来。在导出 CSR 时以及之后导入已签发证书时,您都必须重复使用这个完全相同的别名。
  • -keyalg RSA -keysize 2048:2048 位的 RSA 密钥是目前所有 CA 都接受的公共最低标准。若想获得更长使用寿命的密钥,可使用 3072 位;或者使用 -keyalg EC -groupname secp256r1 生成一个更小、更快的 ECDSA 密钥(目前所有主流 CA 都支持签发基于 ECDSA P-256 和 P-384 的证书)。
  • -storetype PKCS12:强制使用现代的 PKCS12 密钥库格式。对应的文件扩展名为 .p12(或 .pfx)。
  • -keystore yoursite.p12:要创建的密钥库文件名。请将其替换为您容易记住的名称,并妥善保管该文件:它保存着您的私钥。
  • -validity 825:密钥库内的自签名占位证书的有效期。之后由 CA 签发的证书会替代它,因此该值不会影响生产环境中的实际有效期。

随后 keytool 会要求您输入密钥库密码。请设置一个强密码,并将其保存到您的密码管理工具中。之后每次运行 keytool 命令以及使用该密钥库的任何服务器都需要用到它。对于 PKCS12 密钥库,密钥密码与密钥库密码相同,因此只需记住一个密码。

第二步:输入您的机构信息(DN)

接下来 keytool 会要求您输入专有名称(DN):即将出现在 CSR 中的身份字段。请针对每个提示,输入贵机构准确的法律信息。请仅使用标准的 ASCII 字符:非拉丁字母会导致请求失败。标点符号同样重要,因为 CA 会将您填写的信息与公开的工商登记记录进行比对。

  • 您的名字和姓氏是什么?这是 keytool 中用来指代通用名称(CN)的表述方式。请输入您要保护的确切FQDN(例如 www.yoursite.com),或者输入通配符,如 *.yoursite.com。请不要输入个人姓名。
  • 您的组织单位名称是什么?CA/浏览器论坛已于 2022 年 9 月 1 日废弃了 organizationalUnitName 属性,公共 CA 会从签发的证书中剥离该字段。请注意,直接按 Enter 键并不会让该字段留空:keytool 会自动填入默认值,导致 DN 中带有 OU=Unknown,该值也会被写入 CSR 中。若要真正省略该属性,请跳过这些交互提示,改用 -dname 参数直接指定 DN,并在字符串中不包含 OU 部分。
  • 您的机构名称是什么?请输入您公司的完整法定名称,须与注册信息完全一致(例如 Your Company LLC)。此项为 OV 和 EV 证书所必需;对于域名验证(DV)证书,该值不会被校验,因此填入任意简短占位内容即可。
  • 您所在城市或地区的名称是什么?请填写公司注册地所在城市的完整名称(例如 Seattle,而非 SEA)。
  • 您所在州或省的名称是什么?请输入完整的州名或省名(例如 California,而非 CA)。
  • 该单位所在国家的两位字母代码是什么?请输入 ISO 3166-1 alpha-2 标准的两位字母国家代码(例如 USGBDE)。如有疑问,可查阅ISO 官方列表

keytool 会打印出组装好的 DN,并询问CN=…, OU=…, O=…, L=…, ST=…, C=… 是否正确?输入 yes 并按 Enter 键确认。如果发现有拼写错误,输入 no,keytool 将重新开始提示流程。

第三步:导出带有主题备用名称的 CSR

现在使用 keytool -certreq 导出 CSR。每个公共 CA 都会根据主题备用名称(SAN)扩展字段来验证主机名,而不是根据通用名称(CN)——浏览器和现代 TLS 库早在多年前就已停止检查 CN——因此即使只有单个主机名,也应加入 SAN。请使用您在第一步中设置的相同别名:

keytool -certreq 
  -alias myalias 
  -file certreq.csr 
  -keystore yoursite.p12 
  -ext SAN=DNS:www.yoursite.com,DNS:yoursite.com

在 Windows 上,将同一命令写成一行:

keytool -certreq -alias myalias -file certreq.csr -keystore C:certsyoursite.p12 -ext SAN=DNS:www.yoursite.com,DNS:yoursite.com

如需申请多域名证书,请为每个主机名添加一个 DNS: 条目(用逗号分隔,不要加空格)。若需要通配符证书,请使用 DNS:*.yoursite.com。keytool 会要求您输入密钥库密码,随后会将 CSR 写入当前目录下的 certreq.csr 文件中。

第四步:打开 CSR 并提交给 CA

使用任意文本编辑器(Notepad、TextEdit、nano、vim)打开 certreq.csr。您也可以在终端中直接打印其内容:

cat certreq.csr

在 Windows 命令提示符中:

type certreq.csr

您将看到类似下面这样的内容块:

-----BEGIN NEW CERTIFICATE REQUEST-----
MIIDXjCCAkYCAQAwgZQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlh
... (many lines of base64) ...
-----END NEW CERTIFICATE REQUEST-----

选中整个内容块,包括 BEGIN NEW CERTIFICATE REQUESTEND NEW CERTIFICATE REQUEST 这两行(部分 CA 会标注为 BEGIN CERTIFICATE REQUEST / END CERTIFICATE REQUEST:两种标注均可接受)。将其复制并粘贴到订单表单中的 CSR 字段。

提交前检查 CSR(可选)

在将请求发送给 CA 之前,最好先确认一下通用名称、SAN 条目以及密钥长度是否正确。keytool 可针对密钥库条目打印出相同的信息:

keytool -printcertreq -file certreq.csr

更喜欢在线工具?将请求内容粘贴到 SSL Dragon 的CSR 解码器中,即可查看主题信息、SAN 列表以及公钥参数。请确认通用名称与客户端将使用的主机名一致,并确保主题备用名称列表中包含所有所需的名称。

Android 会信任签发的证书吗?

是的,只要该证书是由受公开信任的 CA 签发的即可。Android 内置了一套根证书系统存储库,与主流浏览器的信任列表基本一致,因此由这些根证书之一签发的证书会被 Chrome、WebView 以及任何使用系统信任存储库的应用自动信任,无需额外配置。

如果您还打算将证书(或私有 CA 根证书)安装到设备本身,有两点需要注意:

  • 在 Android 7 及更高版本中,应用会忽略用户安装的 CA。自 Android 7(Nougat)起,默认情况下应用流量只信任系统存储库中的证书,Google Chrome 同样会忽略用户安装的 CA。如果您的应用必须信任私有 CA,开发者需要通过网络安全配置(network security configuration)显式启用,其中需包含 <certificates src="user" />。公共 CA 签发的证书不需要这样做:它们本身就已存在于系统信任存储库中。
  • 应将证书锁定到一个稳定的标识,而不是某个单一证书。如果您在应用中实现了证书锁定(certificate pinning),请锁定公钥的 SPKI 哈希值或签发 CA,而不要锁定某个具体的叶证书。否则,下一次证书续期时,用户将无法正常访问。

后续步骤

在 CA 验证您的 CSR 并签发证书后,请将签发的证书重新导入同一个密钥库(使用相同的别名),然后将该密钥库部署到 Android 客户端将要访问的服务器上。关于设备端的安装步骤,请参阅我们的Android SSL 安装指南;如果您的后端运行在 Tomcat、JBoss、Nginx 或其他服务器上,请参阅如何安装 SSL 证书下相应平台的安装指南。

立即订购 SSL 证书, 可节省 10% 的费用!

快速发行, 强大加密, 99.99% 的浏览器信任度, 专业支持和 25 天退款保证. 优惠券代码 SAVE10

龙飞行的详细图像
撰写人

经验丰富的内容撰稿人, 擅长 SSL 证书. 将复杂的网络安全主题转化为清晰, 引人入胜的内容. 通过有影响力的叙述, 为提高数字安全作出贡献.