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