const rs = require('jsrsasign'); // 用户提供的 SM2 PKCS7 签名数据(没有头尾) const sm2P7Base64 = 'MIIDKgYKKoEcz1UGAQQCAqCCAxowggMWAgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIICNzCCAjMwggHWoAMCAQICBgD1tfRoKTAMBggqgRzPVQGDdQUAMEAxCzAJBgNVBAYTAkNOMQ8wDQYDVQQKDAZQQkNDUkMxIDAeBgNVBAMMF1BCQ0NSQyBTTTIgT3BlcmF0aW9uIENBMB4XDTI2MDQwMjA4MDEzOVoXDTM2MDMzMDA4MDEzOVowTTELMAkGA1UEBhMCQ04xDzANBgNVBAoMBlBCQ0NSQzEtMCsGA1UEAwwkOTRmMWY5MzgtZjBiZC00NzYyLTkyOGUtZjY4YTdjY2UxNDFkMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEu3dU5Vn20VjVL9xGCCRPB/EpATY6HW24+zIZv46Cfv0R2PGM+ZJs/dYarw7qJCnpIbe5T0PKmyyJITNVrVnnMaOBrDCBqTAfBgNVHSMEGDAWgBRUqfVQHMpD+o+YdrPK1JlRJL757zAJBgNVHRMEAjAAME8GA1UdHwRIMEYwRKBCoECkPjA8MQ4wDAYDVQQDDAVjcmw3MTEMMAoGA1UECwwDY3JsMQ8wDQYDVQQKDAZQQkNDUkMxCzAJBgNVBAYTAkNOMAsGA1UdDwQEAwIHgDAdBgNVHQ4EFgQU5bG6U0lYzWtkPJE74M/3HdafKKcwDAYIKoEcz1UBg3UFAANJADBGAiEAuLTE36/Eobcui23bFiPvOU4MOT0O0r9SyyHZ1JuvLwMCIQCejuSk03jyUAkbh1SaPx5n7WlDjI6tx9v9RJ7iw5rlojGBtzCBtAIBATBKMEAxCzAJBgNVBAYTAkNOMQ8wDQYDVQQKDAZQQkNDUkMxIDAeBgNVBAMMF1BCQ0NSQyBTTTIgT3BlcmF0aW9uIENBAgYA9bX0aCkwDAYIKoEcz1UBgxEFADANBgkqgRzPVQGCLQEFAARGMEQCIALTgWMD7io1JHfzInBwzDQpe9bonchuLFSED//JLDtnAiBmEUtr+ssAQIzFG4wY0CAj9QZxhENyCU2UYL1fhaysUA=='; // 转换为 hex const sm2P7Hex = rs.hextorstr(rs.b64tohex(sm2P7Base64)); console.log('=== 使用 jsrsasign 测试 SM2 PKCS7 ==='); console.log('数据长度:', sm2P7Base64.length); try { // 使用 CMSParser 解析 const parser = new rs.KJUR.asn1.cms.CMSParser(); const result = parser.getCMSSignedData(rs.b64tohex(sm2P7Base64)); console.log('\n解析成功!'); console.log('版本:', result.version); console.log('哈希算法:', result.hashalgs); console.log('内容类型:', result.econtent?.type); console.log('证书数量:', result.certs?.length); console.log('签名者数量:', result.sinfos?.length); if (result.sinfos && result.sinfos.length > 0) { const signer = result.sinfos[0]; console.log('\n签名者信息:'); console.log(' 版本:', signer.version); console.log(' 哈希算法:', signer.hashalg); console.log(' 签名算法:', signer.sigalg); console.log(' 签名值 (hex):', signer.sighex?.substring(0, 50) + '...'); } if (result.certs && result.certs.length > 0) { console.log('\n证书信息:'); const cert = result.certs[0]; console.log(' 证书 PEM:', cert.substring(0, 100) + '...'); } } catch (error) { console.error('\n解析失败:', error.message); console.error(error.stack); }