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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:47:48