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 标准的两位字母国家代码(例如 US、GB、DE)。如有疑问,可查阅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 REQUEST 和 END 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 证书. 将复杂的网络安全主题转化为清晰, 引人入胜的内容. 通过有影响力的叙述, 为提高数字安全作出贡献.

Avatar of Sergiu Rosca
Technical Review by Sergiu Rosca

Sergiu Rosca is the core web developer behind SSL Dragon. He manages the technical infrastructure, platform performance, and backend integrations that keep the site running smoothly and securely. At SSL Dragon, Sergiu shares practical insights on web development, site optimization, and technical troubleshooting.

All SSL Dragon installation guides are tested on live server environments and undergo a strict peer-review process to ensure your infrastructure remains secure. Read our full Editorial Policy.