本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。

在当今数字化的浪潮中,设备的安全性和真实性愈发受到重视。华为鸿蒙HarmonyOS凭借其强大的安全体系,为设备提供了可靠的保护。其中,Device Certificate Kit在设备真实性证明方面发挥着关键作用,今天咱们就深入了解一下它是如何实现从证书到应用身份证明的这一重要过程的。

一、设备真实性证明的原理、使用场景和实现方法

  1. 原理

    • 设备真实性证明基于公钥基础设施(PKI)体系。简单来说,设备拥有唯一的证书,证书中包含设备的公钥等信息。当设备与其他实体(如服务器或其他设备)进行通信时,它可以使用私钥对数据进行签名,而接收方可以使用证书中的公钥来验证签名的有效性。这就好比一个人用自己的私章(私钥)在文件上盖章,而其他人可以通过公开发布的印章样本(公钥)来验证文件是否被篡改或伪造。例如,在一个物联网环境中,智能家居设备向手机应用发送数据时,设备使用私钥对数据进行签名,手机应用收到数据后,通过设备证书中的公钥来验证签名,如果签名有效,则说明数据来自真实的设备。
    • 同时,证书链的概念也在其中起到重要作用。证书链是一系列证书的集合,从设备证书开始,一直到根证书。根证书是整个信任体系的基础,通常由权威机构颁发并被广泛信任。通过验证证书链的完整性和有效性,接收方可以确定设备证书是否可信。例如,一个设备证书可能由一个中间证书颁发机构(CA)颁发,而这个中间CA的证书又由根CA颁发,通过验证这个证书链,就可以追溯到根证书,从而建立起信任关系。
  2. 使用场景

    • 在物联网领域,设备真实性证明至关重要。比如智能工厂中的各种传感器和设备,需要向监控系统发送数据。监控系统必须确保数据来自真实的设备,而不是被黑客伪装的设备,否则可能会导致生产事故或数据泄露。通过Device Certificate Kit实现的设备真实性证明,可以保证只有经过认证的设备才能与监控系统通信,确保数据的准确性和安全性。
    • 对于移动应用与服务器之间的通信也同样重要。例如在线支付应用,用户在手机上进行支付操作时,服务器需要确保请求来自真实的用户设备,而不是被恶意软件控制的设备。设备真实性证明可以防止中间人攻击和设备伪造,保护用户的资金安全。
  3. 实现方法

    • 首先,设备需要生成公私钥对,并向证书颁发机构(CA)申请证书。在鸿蒙系统中,可以利用Device Certificate Kit的相关功能来生成密钥对。例如,使用类似以下的代码(假设基于Universal Keystore Kit场景):

      import { huks } from '@kit.UniversalKeystoreKit';
      import { BusinessError } from '@kit.BasicServicesKit';
      
      let keyAlias ='serviceKey'; 
      
      function GetGenerateProperties() {
       let properties: Array<huks.HuksParam> = new Array();
       let index = 0;
       properties[index++] = {
         tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
         value: huks.HuksKeyAlg.HUKS_ALG_ECC
       };
       properties[index++] = {
         tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
         value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256
       };
       properties[index++] = {
         tag: huks.HuksTag.HUKS_TAG_PURPOSE,
         value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_SIGN |
             huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_VERIFY
       };
       properties[index++] = {
         tag: huks.HuksTag.HUKS_TAG_DIGEST,
         value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256
       }
       return properties;
      }
      
      async function GenerateKey(keyAlias: string) {
       let genProperties = GetGenerateProperties();
       let options: huks.HuksOptions = {
         properties: genProperties
       }
       await huks.generateKeyItem(keyAlias, options)
      .then(() => {
             console.info(`promise: generate Key success.`);
         }).catch((err: BusinessError) => {
             console.error(`promise: generate Key failed, error: ` + err.message);
         })
      }
    • 然后,CA对设备的身份进行验证后,为设备颁发证书。设备将证书存储在本地,并在通信时向对方提供证书。
    • 接收方收到证书后,使用Device Certificate Kit中的证书验证功能来验证证书的有效性和真实性。这包括检查证书的格式、签名是否正确、证书链是否完整等。例如,验证证书链的代码可能如下(以下为简化示例,实际应用中可能需要更完善的错误处理和参数配置):

      import { cert } from '@kit.DeviceCertificateKit';
      import { BusinessError } from '@kit.BasicServicesKit';
      import { util } from '@kit.ArkTS';
      
      // 假设这是证书链数据(实际应用中需根据真实情况获取)
      let certChainData = "-----BEGIN CERTIFICATE-----\n" +
      "MIID6jCCAtKgAwIBAgIIIM2q/TmRoLcwDQYJKoZIhvcNAQELBQAwWjELMAkGA1\n" +
      "UEBhMCRU4xEDAOBgNVBAgTB0VuZ2xhbmQxDzANBgNVBAcTBkxvbmRvbjEMMA\n" +
      "oGA1UEChMDdHMyMQwwCgYDVQQLEwN0czIxDDAKBgNVBAMTA3RzMjAeFw0yMzEy\n" +
      "MDUwNzM5MDBaFw0yNDEwMzEyMzU5MDBaMGExCzAJBgNVBAYTAkNOMRAwDgYDVQQI\n" +
      "EwdKaWFuZ3N1MRAwDgYDVQQHEwdOYW5qaW5nMQwwCgYDVQQKEwN0czMxDDAKBg\n" +
      "NVBAsTA3RzMzESMBAGA1UEAxMJMTI3LjAuMC4xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\n" +
      "MIIBCgKCAQEAtt+2QxUevbolYLp51QGcUpageI4fwGLIqv4fj4aoVnHFOOBqVOVpfCLR\n" +
      "p26LFV/F8ebwPyo8YEBKSwXzMD1573rMSbaH9BalscH5lZYAbetXoio6YRvzlcmc\n" +
      "rVvLBNMeVnxY86xHpo0MTNyP7W024rZsxWO98xFQVdoiaBC+7+midlisx2Y+7u0\n" +
      "zT9GjeUP6JLdLFUZJKUPSTK3jVzw9v1eZQZKYoNfU6vFMd6ndtwW6qEnwpzmmX\n" +
      "/UT+p5ThAMH593zszlz330nTSXBjIsGkyvOz9gSB0Z0LAuJj06XUNhGL5xKJYKbdI3\n" +
      "8MFQFJKvRHfgTAvVsvAvpBUM2DuBKwIDAQABo4GsMIGpMAkGA1UdEwQCMAA\n" +
      "wHQYDVR0OBBYEFDfsHTMZwoA6eaDFlBUyDpka+sYtMAsGA1UdDwQEAwID+DAnBgN\n" +
      "VHSUEIDAeBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMEMBQGA1UdEQQNM\n" +
      "AuCCTEyNy4wLjAuMTARBglghkgBhvhCAQEEBAMCBkAwHgYJYIZIAYb4QgENBBEWD3hj\n" +
      "YSBjZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOCAQEAp5vTvXrt8ZpgRJVtzv9ss0lJ\n" +
      "izp1fJf+ft5cDXrs7TSD5oHrSW2vk/ZieIMhexU4LFwhs4OE7jK6pgI48Dseqxx7\n" +
      "B/KktxhVMJUmVXd9Ayjp6f+BtZlIk0cArPuoXToXjsV8caTGBXHRdzxpAk/w9syc\n" +
      "GYrbH9TrdNMuTizOb+k268oKXUageZNxHmd7YvOXkcNgrd29jzwXKDYYiUa1DI\n" +
      "SzDnYaJOgPt0B/5izhoWNK7GhJDy9KEuLURcTSWFysbbnljwO9INPT9MmlS83PdAg\n" +
      "NiS8VXF4pce1W9U5jH7d7k0JDVSXybebe1iPFphsZpYM/NE+jap+mPy1nTCbf9g==\n" +
      "-----END CERTIFICATE-----\n" +
      "-----BEGIN CERTIFICATE-----\n" +
      "MIIC0zCCAoWgAwIBAgIIXpLoPpQVWnkwBQYDK2VwMFoxCzAJBgNVBAYTAkV\n" +
      "OMRAwDgYDVQQIEwdFbmdsYW5kMQ8wDQYDVQQHEwZMb25kb24xDDAKBgNVBAoT\n" +
      "A3RzMTEMMAoGA1UECxMDdHMxMQwwCgYDVQQDEwN0czEwHhcNMjMxMjA1MDczNzA\n" +
      "wWhcNMjQwOTAxMjM1OTAwWjBaMQswCQYDVQQGEwJFTjEQMA4GA1UECBMHRW5nbGFu\n" +
      "ZDEPMA0GA1UEBxMGTG9uZG9uMQwwCgYDVQQKEwN0czIxDDAKBgNVBAsTA3RzMjEMM\n" +
      "AoGA1UEAxMDdHMyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtt+2QxUev\n" +
      "bolYLp51QGcUpageI4fwGLIqv4fj4aoVnHFOOBqVOVpfCLRp26LFV/F8ebwPyo8YEBK\n" +
      "SwXzMD1573rMSbaH9BalscH5lZYAbetXoio6YRvzlcmcrVvLBNMeVnxY86xHpo0\n" +
      "MNTyP7W024rZsxWO98xFQVdoiaBC+7+midlisx2Y+7u0jzT9GjeUP6JLdLFUZJKUP\n" +
      "STK3jVzw9v1eZQZKYoNfU6vFMd6ndtwW6qEnwpzmmX/UT+p5ThAMH593zszlz\n" +
      "330nTSXBjIsGkyvOz9gSB0Z0LAuJj06XUNhGL5xKJYKbdI38MFQFJKvRHfgTAvVsvAv\n" +
      "pBUM2DuBKwIDAQABo28wbTAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBQ3\n" +
      "7B0zGcKAOnmgxZQVMg6ZGvrGLTALBgNVHQ8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAg\n" +
      "AHMB4GCGCGSAGG+EIBDQQRFg94Y2EgY2VydGlmaWNhdGUwBQYDK2VwA0EAuasLBe\n" +
      "55YgvFb4wmHeohylc9r8cFGS1LNQ5UcSn3sGqMYf6ehnef16NLuCW6upHCs8Sui4iAMvs\n" +
      "uKPWR9dKBA==\n" +
      "-----END CERTIFICATE-----\n" +
      "-----BEGIN CERTIFICATE-----\n" +
      "MIIB3zCCAZGgAwIBAgIIWQvOEDl+ya4wBQYDK2VwMFoxCzAJBgNVBAYTAkVO\n" +
      "MRAwDgYDVQQIEwdFbmdsYW5kMQ8wDQYDVQQHEwZMb25kb24xDDAKBgNVBAoT\n" +
      "A3RzMTEMMAoGA1UECxMDdHMxMQwwCgYDVQQDEwN0czEwHhcNMjMxMjA1MDAwMD\n" +
      "AwWhcNMjQxMjA0MjM1OTU5WjBaMQswCQYDVQQGEwJFTjEQMA4GA1UECBMHRW5nbGFuZ\n" +
      "DEPMA0GA1UEBxMGTG9uZG9uMQwwCgYDVQQKEwN0czExDDAKBgNVBAsTA3RzMTEM\n" +
      "AoGA1UEAxMDdHMyMCowBQYDK2VwAyEAuxadj1ww0LqPN24zr28jcSOlSWAe0QdLyRF+Z\n" +
      "gG6klKjdTBzMBIGA1UdEwEB/wQIMAYBAf8CARQwHQYDVR0OBBYEFNSgpoQvfxR8\n" +
      "A1Y4St8NjOHkRpm4MAsGA1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAAcwHgYJ\n" +
      "YIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZpY2F0ZTAFBgMrZXADQQAblBgoa72X/K13W\n" +
      "OvcKW0fqBgFKvLy85hWD6Ufi61k4ProQiZzMK+0+y9jReKelPx/zRdCCgSbQroAR2mV\n" +
      "xjoE\n" +
      "-----END CERTIFICATE-----\n";
      
      let textEncoder = new util.TextEncoder();
      const encodingBlob: cert.EncodingBlob = {
       data: textEncoder.encodeInto(certChainData),
       encodingFormat: cert.EncodingFormat.FORMAT_PEM
      };
      
      let x509CertChain: cert.X509CertChain = {} as cert.X509CertChain;
      
      try {
       x509CertChain = await cert.createX509CertChain(encodingBlob);
      } catch (err) {
       let e: BusinessError = err as BusinessError;
       console.error(`createX509CertChain failed, errCode: ${e.code}, errMsg: ${e.message}`);
      }
      
      // 证书链校验数据(假设,实际需根据真实情况配置)
      const param: cert.CertChainValidationParameters = {
       date: '20231212080000Z',
       trustAnchors: [{
         CAPubKey: new Uint8Array([0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70,
             0x03, 0x21, 0x00, 0xbb, 0x16, 0x9d, 0x8f, 0x5c, 0x30, 0xd0, 0xba, 0x8f, 0x37, 0x6e,
             0x33, 0xaf, 0x6f, 0x23, 0x71, 0x23, 0xa5, 0x49, 0x60, 0x1e, 0xd1, 0x07, 0x4b, 0xc9,
             0x11, 0x7e, 0x66, 0x01, 0xba, 0x92, 0x52]),
         CASubject: new Uint8Array([0x30, 0x5a, 0x31, 0x0b, 0x30, 0x09, 0x06,
      0x55, 0x04, 0x06, 0x13, 0x02, 0x45, 0x4e, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04,
             0x08, 0x13, 0x07, 0x45, 0x6e, 0x67, 0x6c, 0x61, 0x6e, 0x64, 0x31, 0x0f, 0x30, 0x0d,
             0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x06, 0x4c, 0x6f, 0x6e, 0x64, 0x6f, 0x6e, 0x31,
             0x0c, 0x30, 0x0a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x03, 0x74, 0x73, 0x31, 0x31,
             0x0c, 0x30, 0x0a, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x03, 0x74, 0x73, 0x31, 0x31,
             0x0c, 0x30, 0x0a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x03, 0x74, 0x73, 0x31])
       }]
      };
      
      try {
       const validationRes = await x509CertChain.validate(param);
       console.log('X509CertChain validate success');
      } catch (err) {
       console.error('X509CertChain validate failed');
      }

二、通过Device Certificate Kit实现应用身份认证与设备真实性校验

  1. 应用身份认证

    • 应用在启动时,会从Device Certificate Kit获取自身的证书信息,包括公钥等。然后,应用可以将这些信息发送给服务器或其他相关方。例如,在一个企业内部的移动办公应用中,应用启动时获取证书信息,并在登录过程中将证书信息与用户账号一起发送到企业服务器。
    • 服务器收到应用的证书信息后,使用Device Certificate Kit的验证功能来验证证书的有效性和真实性,同时可以根据证书中的信息(如证书的颁发机构、证书的有效期等)来确定应用的身份是否合法。如果证书验证通过,服务器则认为应用是可信的,可以继续进行后续的业务操作,如提供数据服务或授权访问特定资源。
  2. 设备真实性校验

    • 设备在与其他设备或服务器通信时,除了发送应用数据外,还会附带设备证书。接收方首先验证证书链的完整性和有效性,如上述证书链校验代码所示。
    • 接着,接收方可以进一步验证设备证书中的一些关键信息,如设备的序列号、设备的标识等,以确保设备的真实性。例如,在智能家居系统中,智能门锁向家庭网关发送数据时,家庭网关会验证智能门锁的证书,同时检查证书中的设备序列号是否与系统中注册的智能门锁序列号一致,如果一致,则说明设备是真实可信的。

三、真实性证明的步骤流程图

步骤操作描述
1设备生成公私钥对并申请证书设备利用相关功能生成公私钥对,向CA提交身份信息和公钥申请证书。
2CA颁发证书CA验证设备身份后,为设备颁发包含公钥等信息的证书。
3设备存储证书并通信设备将证书存储在本地,在与其他实体通信时发送证书。
4接收方验证证书链接收方收到证书后,使用Device Certificate Kit验证证书链的完整性和有效性。
5接收方验证设备信息进一步验证证书中的设备相关信息,如序列号等,确保设备真实性。
6认证通过/失败处理如果认证通过,双方进行正常通信或业务操作;如果失败,根据具体情况采取相应措施,如拒绝通信或提示错误。

通过以上对鸿蒙设备真实性证明的详细解析,我们可以看到Device Certificate Kit在保障设备安全和身份认证方面提供了强大而可靠的机制。它为鸿蒙生态系统中的设备通信和应用运行奠定了坚实的安全基础,使得我们在享受智能设备带来的便利的同时,无需担心设备伪造和数据泄露等安全问题。希望咱们开发者在开发鸿蒙应用时,能够充分理解和利用这一机制,为用户打造更加安全可靠的应用体验。就像一座坚固的桥梁,连接着设备与信任,让我们的数字世界更加安全有序。如果在使用过程中遇到问题,不要慌张,参考文档、仔细排查,相信你一定能够顺利解决问题,在鸿蒙开发的道路上越走越远!


SameX
1 声望2 粉丝