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

如何在phpseclib中用SHA256替代SHA1作为签名算法?

解决phpseclib生成CA签名证书时SHA256不生效的问题

我之前也踩过这个坑!光调用setHash('sha256')确实有时候不生效,这是因为phpseclib的X509类在处理签名哈希时,需要同时确保待签名证书、CA实例以及签名操作都指定了SHA256算法,而不是只设置其中一处。

下面是修改那个“CA-signed cert”示例的具体步骤:

1. 给待签名证书和CA实例都设置哈希

在初始化$cert和$ca两个X509实例后,分别调用setHash('sha256'),确保两者都使用SHA256作为哈希算法:

// 初始化待签名证书
$cert = new Crypt_X509();
$cert->setDN($dn);
$cert->setPublicKey($publickey);
$cert->setStartDate('now');
$cert->setEndDate('+1 year');
$cert->setSerialNumber('123456');
// 给待签证书设置SHA256哈希
$cert->setHash('sha256');

// 初始化CA实例
$ca = new Crypt_X509();
$ca->loadCA('path/to/ca_cert.pem');
// 给CA实例也设置SHA256哈希
$ca->setHash('sha256');

2. 签名时明确指定SHA256算法

调用sign方法时,第三个参数一定要传入'sha256',避免phpseclib fallback到默认的SHA1:

$privatekey = new Crypt_RSA();
$privatekey->loadKey('path/to/ca_privatekey.pem');
// 签名时明确指定SHA256
$cert->sign($ca, $privatekey, 'sha256');

针对phpseclib 2.x/3.x的额外说明

如果你用的是较新版本的phpseclib(2.x及以上),还可以直接指定完整的签名算法标识符,这样更严谨:

// 替代setHash,直接设置签名算法
$cert->setSignatureAlgorithm('sha256WithRSAEncryption');
$ca->setSignatureAlgorithm('sha256WithRSAEncryption');

// 签名时同样指定该算法
$cert->sign($ca, $privatekey, 'sha256WithRSAEncryption');

修改完成后,你可以用openssl命令验证签名算法是否生效:

openssl x509 -in generated_cert.pem -text -noout | grep Signature

输出里应该会显示Signature Algorithm: sha256WithRSAEncryption。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:57:10