如何在Node.js中从RSA公钥生成SKI?适配fabric-sdk-node项目
解决RSA密钥生成SKI(X509v3 Subject Key Identifier)的方案
我刚好之前在处理类似的fabric-sdk-node兼容RSA的需求时研究过这个问题,给你分享下具体的实现思路和代码方案:
首先得明确RSA密钥的SKI生成规则:根据X.509标准,RSA密钥的Subject Key Identifier是对SubjectPublicKeyInfo字段的DER编码值计算SHA-1哈希得到的(ECDSA的SKI生成逻辑是取公钥X坐标的哈希,所以和RSA不一样,这也是jsrsasign没有直接封装RSA SKI生成的原因)。
结合jsrsasign的API,我们可以手动实现这个逻辑,步骤如下:
1. 加载RSA公钥到jsrsasign的RSAKey对象
首先你需要把RSA公钥(PEM格式)加载成jsrsasign可处理的对象:
const jsrsasign = require('jsrsasign'); // 替换成你的RSA公钥PEM内容 const rsaPublicKeyPem = `-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz...(省略) -----END PUBLIC KEY-----`; // 加载公钥为RSAKey实例 const rsaKey = jsrsasign.KEYUTIL.getKey(rsaPublicKeyPem);
2. 获取SubjectPublicKeyInfo的DER编码
jsrsasign的RSAKey对象提供了getPublicKeyASN1Hex()方法,这个方法会返回SubjectPublicKeyInfo字段的DER编码十六进制字符串:
const spkiHex = rsaKey.getPublicKeyASN1Hex();
3. 计算SHA-1哈希得到SKI
接下来我们需要把这个十六进制字符串转换成二进制数据,然后计算SHA-1哈希,最终得到SKI:
// 将十六进制字符串转为二进制数组 const spkiBytes = jsrsasign.hextoArrayBuffer(spkiHex); // 计算SHA-1哈希,得到十六进制格式的SKI const skiHex = jsrsasign.KJUR.crypto.MessageDigest.hash(spkiBytes, 'sha1'); // 可选:将SKI格式化为冒号分隔的形式(和证书中显示的格式一致) const skiFormatted = skiHex.match(/.{2}/g).join(':'); console.log('生成的RSA SKI:', skiFormatted);
验证正确性
你可以用OpenSSL命令验证生成的SKI是否和证书中的一致:
openssl x509 -in your_rsa_certificate.pem -noout -text
在输出中找到Subject Key Identifier字段,和代码生成的结果对比,应该完全匹配。
在fabric-sdk-node中集成
你需要找到SDK中原先处理ECDSA SKI生成的代码分支,添加对RSA密钥类型的判断,当检测到是RSA密钥时,调用上面的逻辑生成SKI即可。
内容的提问来源于stack exchange,提问作者DavidZhang
相关产品推荐
相关产品推荐

