支付宝公钥证书和支付宝根证书是什么,在哪里获取?
明确结论
这两个参数应配置为:
$options->alipayCertPath = '/foo/alipayCertPublicKey_RSA2.crt';
$options->alipayRootCertPath = '/foo/alipayRootCert.crt';
各配置项对应的内容如下:
| 配置项 | 应配置的内容 |
|---|---|
$options->merchantPrivateKey | 应用私钥的文本内容,不是文件路径 |
$options->merchantCertPath | 应用公钥证书 appCertPublicKey_应用APPID.crt 的路径 |
$options->alipayCertPath | 支付宝公钥证书 alipayCertPublicKey_RSA2.crt 的路径 |
$options->alipayRootCertPath | 支付宝根证书 alipayRootCert.crt 的路径 |
在支付宝开放平台为应用启用“证书模式”后,通常可以从应用的接口加签方式配置页面下载支付宝公钥证书和支付宝根证书。这两份证书由支付宝提供,不是商户自行生成的,也不能用应用公钥证书代替。
两种证书分别是什么
支付宝公钥证书
支付宝公钥证书通常使用以下文件名:
alipayCertPublicKey_RSA2.crt
证书中包含支付宝用于签名的公钥信息。应用收到支付宝返回结果或异步通知后,SDK 会读取其中的公钥来验证支付宝签名,以确认数据来自支付宝且没有被篡改。
所以:
$options->alipayCertPath
必须指向 alipayCertPublicKey_RSA2.crt。这里不能填写应用公钥证书,也不能填写普通的公钥字符串。
支付宝根证书
支付宝根证书通常使用以下文件名:
alipayRootCert.crt
该证书用于建立和校验支付宝证书的信任链。SDK 还可能通过这个文件计算支付宝根证书序列号,并在证书模式的请求中使用。
所以:
$options->alipayRootCertPath
必须指向 alipayRootCert.crt。
根证书文件可能包含多段证书内容,这是正常的。不要自行拆分、删减或重新排版。
在哪里获取
通常可以按以下步骤操作:
- 登录支付宝开放平台。
- 进入需要配置的应用。
- 找到开发设置、接口加签方式或密钥管理相关页面。
- 选择“证书”类型的接口加签方式。
- 使用支付宝提供的密钥或证书工具,在本地生成应用密钥和应用公钥证书申请文件。
- 将应用公钥证书上传到开放平台。
- 完成配置后,下载支付宝提供的证书文件。
下载的证书包通常包括:
appCertPublicKey_应用APPID.crt
alipayCertPublicKey_RSA2.crt
alipayRootCert.crt
支付宝开放平台的菜单名称可能会随控制台版本变化,请以当前应用页面中的“接口加签方式”“证书”或类似入口为准。
应用私钥在本地生成,支付宝不会提供下载。不要将私钥上传到代码仓库,也不要把它放在可以公开访问的目录中。
PHP 配置示例
假设证书文件放在项目的 cert 目录中:
$options->merchantPrivateKey = <<<'KEY'
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBK...
KEY;
$options->merchantCertPath =
__DIR__ . '/cert/appCertPublicKey_2019051064521003.crt';
$options->alipayCertPath =
__DIR__ . '/cert/alipayCertPublicKey_RSA2.crt';
$options->alipayRootCertPath =
__DIR__ . '/cert/alipayRootCert.crt';
merchantPrivateKey 中应填写完整的应用私钥内容。是否需要保留下面这样的 PEM 头尾,要以所用 SDK 版本的参数说明为准:
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
从环境变量读取私钥时,还要正确还原换行符。如果部署系统将换行保存成字面量 \n,可以这样处理:
$options->merchantPrivateKey = str_replace(
'\n',
"\n",
getenv('ALIPAY_MERCHANT_PRIVATE_KEY')
);
常见错误
把应用公钥证书填到 $options->alipayCertPath
应用公钥证书和支付宝公钥证书的用途正好相反:
- 应用公钥证书供支付宝验证应用发出的签名。
- 支付宝公钥证书供应用验证支付宝发出的签名。
两者不能互换。
混用证书模式和普通公钥模式
如果应用在支付宝开放平台使用的是证书模式,就应配置完整的证书模式参数。不能把开放平台页面中的“支付宝公钥”字符串当成 alipayCertPublicKey_RSA2.crt 使用。
证书与应用不匹配
appCertPublicKey_应用APPID.crt 必须属于当前应用。使用其他应用或其他环境的证书,可能造成应用证书序列号不一致、验签失败或请求被拒绝。
路径存在但 PHP 无法读取
建议使用绝对路径,并在部署后执行以下检查:
var_dump(is_readable($options->merchantCertPath));
var_dump(is_readable($options->alipayCertPath));
var_dump(is_readable($options->alipayRootCertPath));
三个结果都应为:
bool(true)
还要确认运行 PHP 的系统用户具有这些证书文件的读取权限。
修改证书文件内容
不要用富文本编辑器打开并重新保存 .crt 文件,也不要删除证书中的换行、头尾标记或根证书中的部分证书段。即使肉眼看不出差别,格式变化也可能导致 SDK 解析失败。
证书过期、轮换或平台提示更新时,应重新从对应应用的开放平台配置页面下载,并同步替换部署环境中的文件。
备注:内容仅供参考。
