文档管理中心

证书CMS验签

本文导读

从API version 22开始,支持证书CMS验签。

PKCS #7是用于存储签名或加密数据的标准语法。CMS(Cryptographic Message Syntax,加密消息语法)作为PKCS #7的扩展,支持的数据类型包括数据、签名数据、封装数据、签名和封装数据、摘要数据以及加密数据。该标准常用于保护数据的完整性和机密性。

目前仅支持CMS签名数据和封装数据。

开发步骤

  1. 导入证书模块

    收起
    自动换行
    深色代码主题
    复制
    1. import { cert } from '@kit.DeviceCertificateKit';
  2. 签名的开发步骤查看CMS签名

  3. 调用cert.createCmsParser创建CmsParser对象。

  4. 调用cmsParser.setRawData设置CMS数据。

  5. 调用cmsParser.verifySignedData进行验签。

验签示例:

收起
自动换行
深色代码主题
复制
  1. import { cert } from '@kit.DeviceCertificateKit';
  2. let ECC_256_PUB_ENTRY_CERT: string =
  3. '-----BEGIN CERTIFICATE-----\n' +
  4. 'MIICejCCAiCgAwIBAgIUGE371/LcCW79mzMm6UiJdyC4khcwCgYIKoZIzj0EAwIw\n' +
  5. 'fjELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcMB0JlaWpp\n' +
  6. 'bmcxHjAcBgNVBAoMFUVDRFNBIEludGVybWVkaWF0ZSBDQTELMAkGA1UECwwCSVQx\n' +
  7. 'HjAcBgNVBAMMFUVDRFNBIEludGVybWVkaWF0ZSBDQTAeFw0yNTA5MjgxMDU0MDVa\n' +
  8. 'Fw0zNTA5MjYxMDU0MDVaMHUxCzAJBgNVBAYTAkNOMRAwDgYDVQQIDAdCZWlqaW5n\n' +
  9. 'MRAwDgYDVQQHDAdCZWlqaW5nMRswGQYDVQQKDBJFQ0RTQSBFeGFtcGxlIENvcnAx\n' +
  10. 'CzAJBgNVBAsMAklUMRgwFgYDVQQDDA93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\n' +
  11. 'PQIBBggqhkjOPQMBBwNCAAQNKO5YXAsmdm/ShEU5VyQlQSdnV6hNQIofHhQ/GyeK\n' +
  12. '1W7t3KnMie4cv/wnA4Qmor2KeBBXUFUnYJqqWOHsivIuo4GEMIGBMAkGA1UdEwQC\n' +
  13. 'MAAwCwYDVR0PBAQDAgK0MCcGA1UdEQQgMB6CD3d3dy5leGFtcGxlLmNvbYILZXhh\n' +
  14. 'bXBsZS5jb20wHQYDVR0OBBYEFD7RUSUimy0SWShmPIus91tDS0u9MB8GA1UdIwQY\n' +
  15. 'MBaAFFjgVG0DwmSwxzJWELNvxGtm3mxUMAoGCCqGSM49BAMCA0gAMEUCIQCTw7sx\n' +
  16. 'X0tt1xiNvIQ9LD4bECzdgzIuBaU97GgYDusIUgIgTkc0wYZ3EUg0COHPly4cVsTj\n' +
  17. '1Cyy/+qufhBUJw5om7E=\n' +
  18. '-----END CERTIFICATE-----';
  19. let ECC_256_PUB_INTER_CERT: string =
  20. '-----BEGIN CERTIFICATE-----\n' +
  21. 'MIICTDCCAfGgAwIBAgIUc1x0keEiLIcS1oKtSpeEiPoaepkwCgYIKoZIzj0EAwIw\n' +
  22. 'bjELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcMB0JlaWpp\n' +
  23. 'bmcxFjAUBgNVBAoMDUVDRFNBIFJvb3QgQ0ExCzAJBgNVBAsMAklUMRYwFAYDVQQD\n' +
  24. 'DA1FQ0RTQSBSb290IENBMB4XDTI1MDkyODEwNTM0OVoXDTMwMDkyNzEwNTM0OVow\n' +
  25. 'fjELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcMB0JlaWpp\n' +
  26. 'bmcxHjAcBgNVBAoMFUVDRFNBIEludGVybWVkaWF0ZSBDQTELMAkGA1UECwwCSVQx\n' +
  27. 'HjAcBgNVBAMMFUVDRFNBIEludGVybWVkaWF0ZSBDQTBZMBMGByqGSM49AgEGCCqG\n' +
  28. 'SM49AwEHA0IABGoCqpHBV/glJeezsp693/hhflYOKpHvaNszVBLkTurkqrbhbaMo\n' +
  29. 'hw1oO2Zro54rhZ8tom2UAGn1rzNmRVBCxTajXTBbMAwGA1UdEwQFMAMBAf8wCwYD\n' +
  30. 'VR0PBAQDAgEGMB0GA1UdDgQWBBRY4FRtA8JksMcyVhCzb8RrZt5sVDAfBgNVHSME\n' +
  31. 'GDAWgBTmNm24RfPnLf1HMNCocS90CGalJjAKBggqhkjOPQQDAgNJADBGAiEAstMv\n' +
  32. 'puHi/dgAlvycicL3VQ5iITvUSG2fo286LYc01CQCIQCyw4+94ovyRtaT/WWoZh3u\n' +
  33. 'ia4tt478nYeQgMChg+xtSw==\n' +
  34. '-----END CERTIFICATE-----';
  35. let ECC_256_PUB_ROOT_CERT: string =
  36. '-----BEGIN CERTIFICATE-----\n' +
  37. 'MIICUzCCAfqgAwIBAgIUPma0DkC+ck+t/3eykmsKsy5D0egwCgYIKoZIzj0EAwIw\n' +
  38. 'bjELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcMB0JlaWpp\n' +
  39. 'bmcxFjAUBgNVBAoMDUVDRFNBIFJvb3QgQ0ExCzAJBgNVBAsMAklUMRYwFAYDVQQD\n' +
  40. 'DA1FQ0RTQSBSb290IENBMB4XDTI1MDkyODEwNTMyN1oXDTM1MDkyNjEwNTMyN1ow\n' +
  41. 'bjELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcMB0JlaWpp\n' +
  42. 'bmcxFjAUBgNVBAoMDUVDRFNBIFJvb3QgQ0ExCzAJBgNVBAsMAklUMRYwFAYDVQQD\n' +
  43. 'DA1FQ0RTQSBSb290IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEA3KYWepl\n' +
  44. 'wjHe/Htx2cAhrjaZpWPJOUyL6siUFRayVebaqOQejuUPypbj+u4ZHodsviUe12E1\n' +
  45. '50Q+R9Uayes+WKN2MHQwHQYDVR0OBBYEFOY2bbhF8+ct/Ucw0KhxL3QIZqUmMB8G\n' +
  46. 'A1UdIwQYMBaAFOY2bbhF8+ct/Ucw0KhxL3QIZqUmMAsGA1UdDwQEAwIBBjAJBgNV\n' +
  47. 'HREEAjAAMAkGA1UdEgQCMAAwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNH\n' +
  48. 'ADBEAiAjo+sFDtGVhyc+NqdwxhepqSXOjRI5As6TSz3OYTvERwIgayLgfBn2uABH\n' +
  49. 'wYQI60CEJkDF9Pn2fxsGuNEyyn0ks28=\n' +
  50. '-----END CERTIFICATE-----';
  51. let ECC_256_PRI_ENTRY_KEY: string =
  52. '-----BEGIN EC PRIVATE KEY-----\n' +
  53. 'MHcCAQEEII8+yfaMTjUyWtjIopGgNxHUMPKhAYTnIVYbiTOVB4x5oAoGCCqGSM49\n' +
  54. 'AwEHoUQDQgAEDSjuWFwLJnZv0oRFOVckJUEnZ1e oTUCKHx4UPxsnitVu7dypzInu\n' +
  55. 'HL/8JwOEJqK9ingQV1BVJ2Caqljh7IryLg==\n' +
  56. '-----END EC PRIVATE KEY-----';
  57. // string转Uint8Array。
  58. function stringToUint8Array(str: string): Uint8Array {
  59. let arr: number[] = [];
  60. for (let i = 0, j = str.length; i < j; i++) {
  61. arr.push(str.charCodeAt(i));
  62. };
  63. return new Uint8Array(arr);
  64. }
  65. async function createX509Cert(inStream: string): Promise<cert.X509Cert> {
  66. let encodingBlob: cert.EncodingBlob = {
  67. data: stringToUint8Array(inStream),
  68. encodingFormat: cert.EncodingFormat.FORMAT_PEM
  69. };
  70. let x509Cert: cert.X509Cert = {} as cert.X509Cert;
  71. try {
  72. x509Cert = await cert.createX509Cert(encodingBlob);
  73. } catch (error) {
  74. console.error(`createX509Cert failed: errCode: ${error.code}, message: ${error.message}`);
  75. }
  76. return x509Cert;
  77. }
  78. async function testCmsVerifyTest() {
  79. try {
  80. let plainText: Uint8Array = new Uint8Array([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07]);
  81. let x509CertEntry: cert.X509Cert = await createX509Cert(ECC_256_PUB_ENTRY_CERT);
  82. let x509CertInter: cert.X509Cert = await createX509Cert(ECC_256_PUB_INTER_CERT);
  83. let x509CertRoot: cert.X509Cert = await createX509Cert(ECC_256_PUB_ROOT_CERT);
  84. let cms: cert.CmsGenerator = cert.createCmsGenerator(cert.CmsContentType.SIGNED_DATA);
  85. let signerConfig: cert.CmsSignerConfig = {
  86. mdName: 'SHA256',
  87. };
  88. let keyInfo: cert.PrivateKeyInfo = {
  89. key: ECC_256_PRI_ENTRY_KEY
  90. };
  91. let option: cert.CmsGeneratorOptions = {
  92. outFormat: cert.CmsFormat.PEM
  93. };
  94. cms.addSigner(x509CertEntry, keyInfo, signerConfig);
  95. let signData = cms.doFinalSync(plainText, option);
  96. let config: cert.CmsVerificationConfig = {
  97. trustCerts: [x509CertRoot, x509CertInter],
  98. };
  99. let verify: cert.CmsParser = cert.createCmsParser();
  100. await verify.setRawData(signData, cert.CmsFormat.PEM);
  101. await verify.verifySignedData(config);
  102. console.info(`verifySignedData result: success.`);
  103. } catch (error) {
  104. console.error(`verifySignedData failed: errCode: ${error.code}, message: ${error.message}`);
  105. }
  106. }
在 开发与测试 开放能力API 中进行搜索
请输入您想要搜索的关键词