.NET 5导出DER格式RSA公钥缺失头部:如何生成Docker libtrust所需公钥
额外头部的含义
你观察到的24字节前缀是X.509 SubjectPublicKeyInfo(SPKI) 结构的封装头部:
- OpenSSL的
openssl rsa -pubout -outform der、BouncyCastle的CreateSubjectPublicKeyInfo默认输出的都是SPKI格式的DER编码公钥 - .NET的
ExportRSAPublicKey()输出的是裸PKCS#1 RSAPublicKey结构,缺少外层的SPKI封装,所以少了这段头部 - 这段头部包含了公钥算法标识(声明是RSA公钥、无额外参数)和后续公钥内容的长度标识,你给出的十六进制头部就是2048位RSA公钥对应的标准SPKI前缀。
.NET原生实现方案
.NET 5已经原生支持导出SPKI格式公钥,你只需要把导出方法替换为ExportSubjectPublicKeyInfo()即可,不需要手动拼接头部,也不需要第三方库:
// 加载PEM密钥 var rsa = System.Security.Cryptography.RSA.Create(); rsa.ImportFromPem(pem); // 直接导出和OpenSSL/BouncyCastle完全一致的SPKI格式DER公钥 var der = rsa.ExportSubjectPublicKeyInfo(); // 计算SHA256哈希 var kidHash = System.Security.Cryptography.SHA256.Create().ComputeHash(der); // Base32编码(.NET 8+可直接用内置方法,无需第三方依赖) var kidBase32 = Convert.ToBase32String(kidHash).TrimEnd('='); // 如果是.NET 5,自行实现RFC4648 Base32编码即可,无需引入第三方库 // 按4位分段加冒号,取前59位 var chunks = new List<string>(); for (int i = 0; i < 12; i++) { chunks.Add(kidBase32.Substring(i * 4, 4)); } var kid = string.Join(':', chunks);
如果需要兼容.NET 5没有内置Base32的场景,只需要自己实现几十行的RFC4648 Base32编码逻辑即可,全程不需要引入BouncyCastle或其他第三方依赖。
内容的提问来源于stack exchange,提问作者superstator
相关产品推荐
相关产品推荐

