You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PKCS8私钥生成API签名的相关技术疑问

我完全不熟悉使用公私钥对数据进行加密操作,许多教程仅讲解如何生成和签名数据,但未说明密钥的实际处理方式。请问使用OpenSSL生成公钥和PKCS8私钥后,我该如何处理?是需要手动将公钥交给对应请求服务器的负责人,还是有特定方式通过API请求脚本发送或附带公钥?另外,这段使用PKCS8编码的PEM私钥生成签名的PHP代码是否足够?

$private_key = openssl_pkey_get_private($path_to_key);
$data = 'Text to sign';
openssl_sign($data, $signature, $private_key);
openssl_free_key($private_key);
密钥的实际处理流程
  • 公钥交付:
    公钥本身是公开可信的,通常需要手动通过安全渠道交付给对接的服务器负责人,比如加密邮件、企业内部可信协作平台、线下传递等,目的是避免公钥在传输过程中被篡改。只有当对接方明确要求通过API接口上传公钥(比如首次请求时完成公钥注册),才需要在脚本里把公钥PEM格式文本内容通过API请求提交。
  • 私钥保管:
    私钥绝对不能泄露,必须存放在服务器的非Web可访问目录下,设置严格的文件权限(比如chmod 600,仅允许运行PHP的系统用户读取),绝对不能通过任何网络渠道传输私钥,也不要在代码里硬编码私钥内容。
PHP签名代码的完整性验证

你提供的代码是基础的签名逻辑,但存在几个关键缺失,不足以满足大多数API的签名要求,需要补充以下细节:

  1. 显式指定签名算法:
    openssl_sign默认会使用密钥对应的默认算法,但多数API要求固定算法(如SHA256withRSA),必须显式声明,避免算法不匹配导致签名校验失败。
  2. 签名编码处理:
    生成的$signature是二进制数据,无法直接在HTTP请求中传输,需要转成Base64编码。
  3. 错误检查:
    必须添加私钥加载、签名操作的错误判断,避免静默失败难以排查。

补全后的示例代码:

// 加载PKCS8私钥(如果是加密私钥,需添加密码参数:第二个参数为私钥密码)
$private_key = openssl_pkey_get_private(file_get_contents($path_to_key));
if (!$private_key) {
    die("私钥加载失败:" . openssl_error_string());
}

$data = 'Text to sign';
$signature = '';
// 显式指定SHA256算法,根据对接要求可替换为OPENSSL_ALGO_SHA1等
$sign_success = openssl_sign($data, $signature, $private_key, OPENSSL_ALGO_SHA256);

if (!$sign_success) {
    die("签名失败:" . openssl_error_string());
}

// 转Base64编码,用于API请求传输
$base64_signature = base64_encode($signature);
openssl_free_key($private_key);

内容的提问来源于stack exchange,提问作者v1n_vampire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 13:44:55