• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 证书链校验器对象的创建和校验
2
3证书链是由一组证书组成的证书集合,以图中样例证书文件为例,即可放在一个证书链中。
4
5样例中可以看到GlobalSign自签名了证书,GlobalSign也签发了GlobalSign RSA OV SSL CA 2018的证书,GlobalSign RSA OV SSL CA 2018又签发了第三级证书。
6
7![zh-cn_image_0000001746997074](figures/zh-cn_image_0000001746997074.png)
8
9开发者可以参考示例将已有的多个证书构建出证书链数据。
10
11## 开发步骤
12
131. 导入[证书算法库框架模块](../../reference/apis-device-certificate-kit/js-apis-cert.md)。
14   ```ts
15   import { cert } from '@kit.DeviceCertificateKit';
16   ```
17
182. [cert.createCertChainValidator](../../reference/apis-device-certificate-kit/js-apis-cert.md#certcreatecertchainvalidator)创建证书链校验器对象。
19
203. 基于已有的证书数据,创建证书链数据对象[CertChainData](../../reference/apis-device-certificate-kit/js-apis-cert.md#certchaindata)。
21
22   证书算法库框架提供了证书链校验器对象可用于校验证书链,以验证信任链根源,但待校验的证书链数据对象应符合如下的数据结构定义。
23
24   | 名称 | 类型 | 可读 | 可写 | 说明 |
25   | -------- | -------- | -------- | -------- | -------- |
26   | data | Uint8Array | 是 | 是 | 证书数据,按照长度(2字节)-数据的形式传入。如08ABCDEFGH07ABCDEFG:第一本证书前2个字节表示证书的长度为8字节,后面附加8字节的证书数据;第二本证书前2个字节表示证书的长度为7字节,后面附加7字节的证书数据。 |
27   | count | number | 是 | 是 | 传入的数据中,包含的证书数量。 |
28   | encodingFormat | [EncodingFormat](../../reference/apis-device-certificate-kit/js-apis-cert.md#encodingformat) | 是 | 是 | 指明证书编码格式。 |
29
304. 调用[CertChainValidator.validate](../../reference/apis-device-certificate-kit/js-apis-cert.md#validate)校验证书链数据。
31
32```ts
33import { cert } from '@kit.DeviceCertificateKit';
34import { util } from '@kit.ArkTS';
35
36// CA数据,这只是一个示例,需要根据具体业务来赋值。
37let caCertData = '-----BEGIN CERTIFICATE-----\n' +
38  'MIIDgTCCAmmgAwIBAgIGAXKnJjrAMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYT\n' +
39  'AkNOMQ8wDQYDVQQIDAbpmZXopb8xDzANBgNVBAcMBuilv+WuiTEPMA0GA1UECgwG\n' +
40  '5rWL6K+VMRUwEwYDVQQDDAzkuK3mlofmtYvor5UwHhcNMjUwMjIwMDI1NjMxWhcN\n' +
41  'MzUwMjE4MDI1NjMxWjBXMQswCQYDVQQGEwJDTjEPMA0GA1UECAwG6ZmV6KW/MQ8w\n' +
42  'DQYDVQQHDAbopb/lrokxDzANBgNVBAoMBua1i+ivlTEVMBMGA1UEAwwM5Lit5paH\n' +
43  '5rWL6K+VMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyY30ubE33Zmc\n' +
44  'BBM4OIpD1UuDVKynC4xNBK4v79vnlc4ElmRZD4RjkS612DtpaUzt/yHMZXmJTdqg\n' +
45  '2jq7UG4sQc0G3uNGIXdUpRZpnUYGVftuZMxHaNOb+IgDkZzaO3Dk33piOpH/X/Ke\n' +
46  'OosCbm7eBL+y+wRhUsLSCEasEsIvW3edHuYLrfz3MzwY/9AmnwqDGdRJ5rPayODD\n' +
47  'HH0yw9JuRkdMacN8omVX8jBfJeI8KafcQW8MJz+Y0qyQyiZ6A81AQSVfT+6Sk2U3\n' +
48  'UqeSTmtdIL1u29HfYLwYGHey+1Ro2wxqnMsFKIdKu2dDMDQZx61pER/dFtPYFlS7\n' +
49  '/uh3mi9HUQIDAQABo1MwUTAdBgNVHQ4EFgQUGDykmR825RPNFIEQaFzUqkr+CIow\n' +
50  'HwYDVR0jBBgwFoAUGDykmR825RPNFIEQaFzUqkr+CIowDwYDVR0TAQH/BAUwAwEB\n' +
51  '/zANBgkqhkiG9w0BAQsFAAOCAQEAXjlmYKjBz1ajWywZNlN+LVRXNx7bS4TYtOc2\n' +
52  'ME4N1ls6yjWSLtBe4DdkBqZ2HwrVW4dg5xZdAS/T0v/rRiGbX6iUFRV9WCTdtLZB\n' +
53  'HKNh7vU39F7mgTaaWXQK/+6NeLKMzwJENRRaESI/sXeKE6irfJgYuq3NH8GGFd+w\n' +
54  'HnvVBHRb6WSlY2s5Li7t6lj40UbwOljnqzRQvBeX57rOnzJgVKND3oY9pex/05Oe\n' +
55  '96x+qc2iqZbu54A6NYCTj/65EEKoj5rYxPXMV4FegV42ouaLJJoS+cEEY7w+ixcl\n' +
56  '04TjtjEdhTZiJCmI0RK50H2SWC0t9qkFewM3CCWTHY5ygPtMGA==\n' +
57  '-----END CERTIFICATE-----\n';
58
59// 二级CA证书数据,这只是一个示例,需要根据具体业务来赋值。
60let secondCaCertData = '-----BEGIN CERTIFICATE-----\n' +
61  'MIIDgTCCAmmgAwIBAgIGAXKnJjrBMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYT\n' +
62  'AkNOMQ8wDQYDVQQIDAbpmZXopb8xDzANBgNVBAcMBuilv+WuiTEPMA0GA1UECgwG\n' +
63  '5rWL6K+VMRUwEwYDVQQDDAzkuK3mlofmtYvor5UwHhcNMjUwMjIwMDI1NjU3WhcN\n' +
64  'MzUwMjE4MDI1NjU3WjBXMQswCQYDVQQGEwJDTjEPMA0GA1UECAwG6ZmV6KW/MQ8w\n' +
65  'DQYDVQQHDAbopb/lrokxDzANBgNVBAoMBua1i+ivlTEVMBMGA1UEAwwM5Lit5paH\n' +
66  '5rWL6K+VMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxSL5L7fwMaRF\n' +
67  'RiT1l7kpzaAqZe33/3lgexoMfGiIFarIhYyYJsmOJKes2uLSnPeqEtscrXmFQiIG\n' +
68  '0srmwrriGgo3oxDp4/5i1FhCf3FqZUwD/RJhtVmkHT0HoYl4cpt/dJSF/e5vxt/J\n' +
69  '2Z1eRIQOj9DzyqET6+ONQmfVOyzEH6xlpXHZLvykSZ7ytPp25LxULPWjTmpDOPRq\n' +
70  'vkSMaH4H3mPw/Z9r0MVKP7DgAZMl2yVudHp785AMTVD0L9zWGHf3sek25ek5nv2r\n' +
71  'SlB21MTBpvd8GC/iGns4V3Bvf75WAMgpGghAkRRyADeqt5Hw+x9BIb9FcfE+h6n+\n' +
72  '6EF6FPa8GQIDAQABo1MwUTAdBgNVHQ4EFgQUjt2Crk/j6W8WCdHWyz4H+Q2/3PYw\n' +
73  'HwYDVR0jBBgwFoAUGDykmR825RPNFIEQaFzUqkr+CIowDwYDVR0TAQH/BAUwAwEB\n' +
74  '/zANBgkqhkiG9w0BAQsFAAOCAQEAksPHMuVF9e2GMVlaSe1Ao9D1KrJvKNaFZPCI\n' +
75  'lQe2CDsX+Qu7sQj4SML5vvWFLtcAp6ZovqUyEM0PtZWVSjPCRTMJ3ofBPwnXvQ2N\n' +
76  '7J7NCDA227MQabXeN3jMhkcAzlpdO5poTnobPF4xRqb39jM7otnNJsujvzdDab2l\n' +
77  'LiP4eU5TrEaF2lwidBWJX0VoLrRpqzQhiWXGMpCBBugP5U+bFs20wezJBG19WYyc\n' +
78  '2xKKfvyIcxrpmvjLZl8HddS7Ot1CKXyc8U9QZBGAlPwOXu8juppcEtjJyl36EnvF\n' +
79  'YAcwrXOAtCiNpX3UnLUbG8GtpOOWQWCt+x1gKmA6V0jbqQmqcw==\n' +
80  '-----END CERTIFICATE-----\n';
81
82// 证书链校验器示例。在这个示例中,验证了一个二级证书链。
83function certChainValidatorSample(): void {
84  let textEncoder = new util.TextEncoder();
85  // 证书链校验器算法。目前仅支持PKIX。
86  let algorithm = 'PKIX';
87
88  // 创建一个证书链校验器实例。
89  let validator = cert.createCertChainValidator(algorithm);
90
91  // CA证书数据。
92  let uint8ArrayOfCaCertData = textEncoder.encodeInto(caCertData);
93
94  // CA证书数据的长度。
95  let uint8ArrayOfCaCertDataLen = new Uint8Array(new Uint16Array([uint8ArrayOfCaCertData.byteLength]).buffer);
96
97  // 二级CA证书数据。
98  let uint8ArrayOf2ndCaCertData =  textEncoder.encodeInto(secondCaCertData);
99
100  // 二级CA证书数据的长度。
101  let uint8ArrayOf2ndCaCertDataLen = new Uint8Array(new Uint16Array([uint8ArrayOf2ndCaCertData.byteLength]).buffer);
102
103  // 证书链二进制数据:二级CA证书数据长度+二级CA证书数据+CA证书数据长度+CA证书数据(L-V格式)。
104  let encodingData = new Uint8Array(uint8ArrayOf2ndCaCertDataLen.length + uint8ArrayOf2ndCaCertData.length +
105  uint8ArrayOfCaCertDataLen.length + uint8ArrayOfCaCertData.length);
106  for (let i = 0; i < uint8ArrayOf2ndCaCertDataLen.length; i++) {
107    encodingData[i] = uint8ArrayOf2ndCaCertDataLen[i];
108  }
109  for (let i = 0; i < uint8ArrayOf2ndCaCertData.length; i++) {
110    encodingData[uint8ArrayOf2ndCaCertDataLen.length + i] = uint8ArrayOf2ndCaCertData[i];
111  }
112  for (let i = 0; i < uint8ArrayOfCaCertDataLen.length; i++) {
113    encodingData[uint8ArrayOf2ndCaCertDataLen.length + uint8ArrayOf2ndCaCertData.length + i] = uint8ArrayOfCaCertDataLen[i];
114  }
115  for (let i = 0; i < uint8ArrayOfCaCertData.length; i++) {
116    encodingData[uint8ArrayOf2ndCaCertDataLen.length + uint8ArrayOf2ndCaCertData.length +
117    uint8ArrayOfCaCertDataLen.length + i] = uint8ArrayOfCaCertData[i];
118  }
119
120  let certChainData: cert.CertChainData = {
121    // Uint8Array类型:L-V格式(证书数据长度-证书数据)。
122    data: encodingData,
123    // 证书的数量。本例中为2。
124    count: 2,
125    // 证书格式。仅支持 PEM 和 DER。在此示例中,证书为 PEM 格式。
126    encodingFormat: cert.EncodingFormat.FORMAT_PEM
127  };
128
129  // 验证证书链。
130  validator.validate(certChainData, (err, data) => {
131    if (err != null) {
132      // 校验失败。
133      console.error(`validate failed, errCode: ${err.code}, errMsg: ${err.message}`);
134    } else {
135      // 校验成功。
136      console.log('validate success');
137    }
138  });
139}
140```
141