From 9c2fcd02d3ad80dadb20e0630a7bf91a08856104 Mon Sep 17 00:00:00 2001 From: Alex Hong Date: Fri, 7 Dec 2018 11:08:59 -0800 Subject: [PATCH 1/4] removed commands samples from beta --- iot/beta-features/commands/README.md | 40 - iot/beta-features/commands/receive/README.md | 42 - .../commands/receive/package.json | 32 - iot/beta-features/commands/receive/receive.js | 171 --- .../commands/receive/receiveTest.js | 87 -- .../commands/receive/resources/README.md | 6 - .../commands/receive/resources/roots.pem | 1279 ----------------- .../commands/receive/resources/rsa_cert.pem | 18 - .../receive/resources/rsa_private.pem | 28 - iot/beta-features/commands/send/README.md | 31 - iot/beta-features/commands/send/package.json | 43 - iot/beta-features/commands/send/send.js | 111 -- iot/beta-features/commands/send/sendTest.js | 87 -- 13 files changed, 1975 deletions(-) delete mode 100644 iot/beta-features/commands/README.md delete mode 100644 iot/beta-features/commands/receive/README.md delete mode 100644 iot/beta-features/commands/receive/package.json delete mode 100644 iot/beta-features/commands/receive/receive.js delete mode 100644 iot/beta-features/commands/receive/receiveTest.js delete mode 100644 iot/beta-features/commands/receive/resources/README.md delete mode 100644 iot/beta-features/commands/receive/resources/roots.pem delete mode 100644 iot/beta-features/commands/receive/resources/rsa_cert.pem delete mode 100644 iot/beta-features/commands/receive/resources/rsa_private.pem delete mode 100644 iot/beta-features/commands/send/README.md delete mode 100644 iot/beta-features/commands/send/package.json delete mode 100644 iot/beta-features/commands/send/send.js delete mode 100644 iot/beta-features/commands/send/sendTest.js diff --git a/iot/beta-features/commands/README.md b/iot/beta-features/commands/README.md deleted file mode 100644 index b258b23479..0000000000 --- a/iot/beta-features/commands/README.md +++ /dev/null @@ -1,40 +0,0 @@ -Google Cloud Platform logo - -# Google Cloud IoT Core NodeJS Command Samples - -This folder contains NodeJS samples that demonstrate sending and receiving -commands. - -## Quickstart - -1. Install the Google Cloud SDK as described in [the Cloud IoT Core documentation](https://cloud.google.com/iot/docs/how-tos/getting-started#set_up_the_google_cloud_sdk_and_gcloud). -1. Create a Cloud Pub/Sub topic: - - gcloud pubsub topics create projects/my-iot-project/topics/device-events - -1. Add the service account `cloud-iot@system.gserviceaccount.com` with the role `Publisher` to that - Cloud Pub/Sub topic from the [Cloud Developer Console](https://console.cloud.google.com) - or by setting the `GOOGLE_CLOUD_PROJECT` environment variable and using the - helper script in the `scripts/` folder. - -1. Create a registry: - - gcloud iot registries create my-registry \ - --project=my-iot-project \ - --region=us-central1 \ - --event-pubsub-topic=projects/my-iot-project/topics/device-events - -1. Use the `generate_keys.sh` script to generate your signing keys: - - ./scripts/generate_keys.sh - -1. Create a device. - - gcloud beta iot devices create my-node-device \ - --project=my-iot-project \ - --region=us-central1 \ - --registry=my-registry \ - --public-key path=rsa_cert.pem,type=rs256 - -1. Start a receiver using the sample in the `receive` folder. -1. Send a command using the sample in `send` folder. diff --git a/iot/beta-features/commands/receive/README.md b/iot/beta-features/commands/receive/README.md deleted file mode 100644 index 83237f7929..0000000000 --- a/iot/beta-features/commands/receive/README.md +++ /dev/null @@ -1,42 +0,0 @@ -Google Cloud Platform logo - -# Google Cloud IoT Core NodeJS Command Receiver - -This sample app receives commands from Cloud IoT Core. - -Note that before you can run this sample, you must register a device as -described in the parent README. - -# Setup - -Run the following command to install the library dependencies for NodeJS: - - npm install - -Place `rsa_cert.pem` and `rsa_private.pem` into the resources directory under `receive/resources` - -# Running the sample - -The following command summarizes the sample usage: - - Google Cloud IoT Core MQTT example. - Options: - --projectId The Project ID to use. Defaults to the value of the GCLOUD_PROJECT or GOOGLE_CLOUD_PROJECT - environment variables. [string] - --cloudRegion GCP cloud region. [string] [default: "us-central1"] - --registryId Cloud IoT registry ID. [string] [required] - --deviceId Cloud IoT device ID. [string] [required] - --privateKeyFile Path to private key file. [string] [required] - --algorithm Encryption algorithm to generate the JWT. [string] [required] [choices: "RS256", "ES256"] - --tokenExpMins Minutes to JWT token expiration. [number] [default: 20] - --mqttBridgeHostname MQTT bridge hostname. [string] [default: "mqtt.googleapis.com"] - --mqttBridgePort MQTT bridge port. [number] [default: 8883] - --help Show help [boolean] - - Examples: - node receive.js --projectId=blue-jet-123 \ - --registryId=my-registry --deviceId=my-node-device \ - --privateKeyFile=../rsa_private.pem --algorithm=RS256 \ - --cloudRegion=us-central1 - - For more information, see https://cloud.google.com/iot-core/docs diff --git a/iot/beta-features/commands/receive/package.json b/iot/beta-features/commands/receive/package.json deleted file mode 100644 index 9d7e16b094..0000000000 --- a/iot/beta-features/commands/receive/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "nodejs-docs-samples-iot-mqtt-example", - "version": "0.0.1", - "description": "MQTT Example for Google Cloud IoT Core using NodeJS.", - "main": "cloudiot_mqtt_example_nodejs.js", - "license": "Apache-2.0", - "author": "Google Inc.", - "repository": { - "type": "git", - "url": "https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git" - }, - "engines": { - "node": ">=8.0.0" - }, - "scripts": { - "lint": "repo-tools lint", - "pretest": "npm run lint", - "test": "repo-tools test run --cmd ava -- -T 3m --verbose receiveTest.js" - }, - "dependencies": { - "@google-cloud/pubsub": "0.21.1", - "jsonwebtoken": "^8.3.0", - "mqtt": "2.18.8", - "yargs": "8.0.2" - }, - "devDependencies": { - "@google-cloud/nodejs-repo-tools": "^2.3.5", - "ava": "0.25.0", - "semistandard": "^12.0.1", - "uuid": "3.3.2" - } -} diff --git a/iot/beta-features/commands/receive/receive.js b/iot/beta-features/commands/receive/receive.js deleted file mode 100644 index a5e2ae5581..0000000000 --- a/iot/beta-features/commands/receive/receive.js +++ /dev/null @@ -1,171 +0,0 @@ -/** - * Copyright 2018 Google LLC - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -// [START iot_mqtt_include] -const fs = require('fs'); -const jwt = require('jsonwebtoken'); -const mqtt = require('mqtt'); -// [END iot_mqtt_include] - -console.log('Google Cloud IoT Core MQTT example.'); -let argv = require(`yargs`) - .options({ - projectId: { - default: process.env.GCLOUD_PROJECT || process.env.GOOGLE_CLOUD_PROJECT, - description: - 'The Project ID to use. Defaults to the value of the GCLOUD_PROJECT or GOOGLE_CLOUD_PROJECT environment variables.', - requiresArg: true, - type: 'string', - }, - cloudRegion: { - default: 'us-central1', - description: 'GCP cloud region.', - requiresArg: true, - type: 'string', - }, - registryId: { - description: 'Cloud IoT registry ID.', - requiresArg: true, - demandOption: true, - type: 'string', - }, - deviceId: { - description: 'Cloud IoT device ID.', - requiresArg: true, - demandOption: true, - type: 'string', - }, - privateKeyFile: { - description: 'Path to private key file.', - requiresArg: true, - demandOption: true, - type: 'string', - }, - algorithm: { - description: 'Encryption algorithm to generate the JWT.', - requiresArg: true, - demandOption: true, - choices: ['RS256', 'ES256'], - type: 'string', - }, - maxDuration: { - default: -1, - description: - 'Max number of minutes to run before ending the client. Set to -1 for no maximum', - requiresArg: true, - type: 'number', - }, - tokenExpMins: { - default: 20, - description: 'Minutes to JWT token expiration.', - requiresArg: true, - type: 'number', - }, - mqttBridgeHostname: { - default: 'mqtt.googleapis.com', - description: 'MQTT bridge hostname.', - requiresArg: true, - type: 'string', - }, - mqttBridgePort: { - default: 8883, - description: 'MQTT bridge port.', - requiresArg: true, - type: 'number', - }, - }) - .example( - `node $0 --projectId=blue-jet-123 \\\n\t--registryId=my-registry --deviceId=my-node-device \\\n\t--privateKeyFile=../rsa_private.pem --algorithm=RS256 \\\n\t --cloudRegion=us-central1` - ) - .wrap(120) - .recommendCommands() - .epilogue(`For more information, see https://cloud.google.com/iot-core/docs`) - .help() - .strict().argv; - -// Create a Cloud IoT Core JWT for the given project id, signed with the given -// private key. -// [START iot_mqtt_jwt] -function createJwt(projectId, privateKeyFile, algorithm) { - const token = { - iat: parseInt(Date.now() / 1000), - exp: parseInt(Date.now() / 1000) + 20 * 60, // 20 minutes - aud: projectId, - }; - const privateKey = fs.readFileSync(privateKeyFile); - return jwt.sign(token, privateKey, {algorithm: algorithm}); -} -// [END iot_mqtt_jwt] - -// [START iot_mqtt_run] -const mqttClientId = `projects/${argv.projectId}/locations/${ - argv.cloudRegion -}/registries/${argv.registryId}/devices/${argv.deviceId}`; -let connectionArgs = { - host: argv.mqttBridgeHostname, - port: argv.mqttBridgePort, - clientId: mqttClientId, - username: 'unused', - password: createJwt(argv.projectId, argv.privateKeyFile, argv.algorithm), - protocol: 'mqtts', - qos: 1, - secureProtocol: 'TLSv1_2_method', -}; - -// Create a client, and connect to the Google MQTT bridge. -let client = mqtt.connect(connectionArgs); - -// Subscribe to the /devices/{device-id}/commands topic to receive commands. -client.subscribe(`/devices/${argv.deviceId}/commands/#`); - -if (argv.maxDuration > 0) { - setTimeout(() => { - console.log( - `Closing connection to MQTT after ${argv.maxDuration} seconds.` - ); - client.end(); - }, argv.maxDuration * 60 * 1000); -} - -client.on('connect', success => { - console.log('connect'); - if (!success) { - console.log('Client not connected...'); - } else { - console.log('Client connected, waiting for commands'); - } -}); - -client.on('close', () => { - console.log('close'); -}); - -client.on('error', err => { - console.log('error', err); -}); - -client.on('message', (topic, message) => { - console.log( - 'message received: ', - Buffer.from(message, 'base64').toString('ascii') - ); -}); - -client.on('packetsend', () => { - // Note: logging packet send is very verbose -}); -// [END iot_mqtt_run] diff --git a/iot/beta-features/commands/receive/receiveTest.js b/iot/beta-features/commands/receive/receiveTest.js deleted file mode 100644 index ce723d8815..0000000000 --- a/iot/beta-features/commands/receive/receiveTest.js +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright 2018 Google LLC - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -const path = require(`path`); -const {PubSub} = require(`@google-cloud/pubsub`); -const test = require(`ava`); -const tools = require(`@google-cloud/nodejs-repo-tools`); -const uuid = require(`uuid`); - -const topicName = `nodejs-docs-samples-test-iot-${uuid.v4()}`; -const registryName = `nodejs-test-registry-iot-${uuid.v4()}`; -const localRegName = `${registryName}-rsa256`; -const localDevice = `test-device-rsa256`; - -const helper = `node manager.js`; -const receiveCmd = `node receive.js`; -const sendCmd = `node send.js`; -const receiveCmdSuffix = `--privateKeyFile=resources/rsa_private.pem --algorithm=RS256`; -const cwdHelper = path.join(__dirname, `../../../manager`); -const cwdSend = path.join(__dirname, `../send`); -const installDeps = `npm install`; - -const pubsub = new PubSub(); - -test.before(tools.checkCredentials); -test.before(async () => { - let pubsubRes = await pubsub.createTopic(topicName); - const topic = pubsubRes[0]; - console.log(`Topic ${topic.name} created.`); -}); - -test.after.always(async () => { - const topic = pubsub.topic(topicName); - await topic.delete(); - console.log(`Topic ${topic.name} deleted.`); -}); - -test(`should receive command message`, async t => { - await tools.runAsync(installDeps, cwdHelper); - await tools.runAsync(`${helper} setupIotTopic ${topicName}`, cwdHelper); - await tools.runAsync( - `${helper} createRegistry ${localRegName} ${topicName}`, - cwdHelper - ); - await tools.runAsync( - `${helper} createRsa256Device ${localDevice} ${localRegName} ./resources/rsa_cert.pem`, - cwdHelper - ); - - // This command needs to run asynchronously without await to ensure the send comand happens while - // mqtt client is available. Limit client to last only 15 seconds (0.25 minutes) - let out = tools.runAsync( - `${receiveCmd} --deviceId=${localDevice} --registryId=${localRegName} --maxDuration=0.25 ${receiveCmdSuffix}` - ); - - await tools.runAsync( - `${sendCmd} sendCommand ${localDevice} ${localRegName} "me want cookies"`, - cwdSend - ); - - // await for original command to resolve before checking regex - t.regex(await out, new RegExp(`me want cookies`)); - - await tools.runAsync( - `${helper} getDeviceState ${localDevice} ${localRegName}`, - cwdHelper - ); - await tools.runAsync( - `${helper} deleteDevice ${localDevice} ${localRegName}`, - cwdHelper - ); - await tools.runAsync(`${helper} deleteRegistry ${localRegName}`, cwdHelper); -}); diff --git a/iot/beta-features/commands/receive/resources/README.md b/iot/beta-features/commands/receive/resources/README.md deleted file mode 100644 index a5133a9e6e..0000000000 --- a/iot/beta-features/commands/receive/resources/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Test public certificate files - -The certificates in this folder are only provided for testing and should not be -used for registering or connecting your devices. - -If the keys in this folder do not match the keys in ~/nodejs-docs-samples/iot/manager/resources, the tests will fail. \ No newline at end of file diff --git a/iot/beta-features/commands/receive/resources/roots.pem b/iot/beta-features/commands/receive/resources/roots.pem deleted file mode 100644 index e68993aa4c..0000000000 --- a/iot/beta-features/commands/receive/resources/roots.pem +++ /dev/null @@ -1,1279 +0,0 @@ -# Operating CA: Comodo Group -# Issuer: CN=AAA Certificate Services O=Comodo CA Limited -# Subject: CN=AAA Certificate Services O=Comodo CA Limited -# Label: "Comodo AAA Services root" -# Serial: 1 -# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 -# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 -# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -# Operating CA: Comodo Group -# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Label: "AddTrust External Root" -# Serial: 1 -# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f -# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 -# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -# Operating CA: Comodo Group -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Operating CA: Comodo Group -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Operating CA: Comodo Group -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Operating CA: Comodo Group -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -# Operating CA: Comodo Group -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Operating CA: DigiCert -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -# Operating CA: DigiCert -# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc -# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc -# Label: "Cybertrust Global Root" -# Serial: 4835703278459682877484360 -# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 -# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 -# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -# Operating CA: DigiCert -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Operating CA: DigiCert -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Operating CA: DigiCert -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Operating CA: DigiCert -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Operating CA: DigiCert -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Operating CA: DigiCert -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Operating CA: DigiCert -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Operating CA: DigiCert -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Operating CA: DigiCert -# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. -# Label: "GeoTrust Global CA" -# Serial: 144470 -# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 -# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 -# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- - -# Operating CA: Entrust Datacard -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Operating CA: Entrust Datacard -# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - EC1" -# Serial: 51543124481930649114116133369 -# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc -# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 -# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -# Operating CA: Entrust Datacard -# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G2" -# Serial: 1246989352 -# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 -# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 -# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- - -# Operating CA: Entrust Datacard -# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Premium 2048 Secure Server CA" -# Serial: 946069240 -# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 -# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 -# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -# Operating CA: Entrust Datacard -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Operating CA: Entrust Datacard -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Operating CA: Entrust Datacard -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Operating CA: Entrust Datacard -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Operating CA: GlobalSign -# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Label: "GlobalSign Root CA" -# Serial: 4835703278459707669005204 -# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a -# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c -# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -# Operating CA: GlobalSign -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -# Operating CA: GlobalSign -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Label: "GlobalSign ECC Root CA - R5" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Operating CA: GlobalSign -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Label: "GlobalSign Root CA - R6" -# Serial: 1417766617973444989252670301619537 -# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae -# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 -# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg -MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx -MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET -MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI -xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k -ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD -aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw -LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw -1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX -k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 -SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h -bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n -WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY -rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce -MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu -bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN -nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt -Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 -55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj -vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf -cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz -oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp -nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs -pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v -JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R -8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 -5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= ------END CERTIFICATE----- - -# Note: "GlobalSign Root CA - R7" not added on purpose. It is P-521. - -# Operating CA: GlobalSign -# Issuer: C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA - R8 -# Subject: C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA - R8 -# Label: "GlobalSign Root CA - R8" -# Serial: 1462505469299036457243287072048861 -# MD5 Fingerprint: 26:15:db:de:38:b4:45:5e:19:3f:1b:57:af:53:2b:36 -# SHA1 Fingerprint: 62:01:ff:ce:4f:09:cd:c7:e0:2f:e1:10:f4:fd:67:f0:37:1a:2f:2a -# SHA256 Fingerprint: ae:48:51:ff:42:03:9b:ad:e0:58:27:91:51:d8:26:83:04:1d:25:98:e2:40:68:3c:c5:6d:76:fb:8c:f5:3d:42 ------BEGIN CERTIFICATE----- -MIICMzCCAbmgAwIBAgIOSBtqCfT5YHE6/oHMht0wCgYIKoZIzj0EAwMwXDELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExIDAeBgNVBAMTF0dsb2JhbFNpZ24gUm9vdCBDQSAtIFI4MB4XDTE2MDYx -NTAwMDAwMFoXDTM2MDYxNTAwMDAwMFowXDELMAkGA1UEBhMCQkUxGTAXBgNVBAoT -EEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExIDAeBgNVBAMTF0ds -b2JhbFNpZ24gUm9vdCBDQSAtIFI4MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEuO58 -MIfYlB9Ua22Ynfx1+1uIq0K6jX05ft1EPTk84QWhSmRgrDemc7D5yUVLCwbQOuDx -bV/6XltaUrV240bb1R6MdHpCyUE1T8bU4ihgqzSKzrFAI0alrhkkUnyQVUTOo0Iw -QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQULzoS -JoDoisJQeG0GxDR+4kk5V3YwCgYIKoZIzj0EAwMDaAAwZQIxAMehPbKSkPrKXeAn -hII7Icz0jfiUVvIgXxHArLxfFaULyBZDp/jFf40goH9e/BYcJwIwHoz1Vr8425zm -pteEKebfDVMu6CsBt30JPLEyahqauArq6K0I8nQ51SsiNtzvRmbY ------END CERTIFICATE----- - -# Operating CA: GoDaddy -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Operating CA: GoDaddy -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Operating CA: GoDaddy -# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Label: "Starfield Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 -# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a -# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -# Operating CA: GoDaddy -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - -# Operating CA: Google Trust Services LLC -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Label: "GlobalSign Root CA - R2" -# Serial: 4835703278459682885658125 -# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 -# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe -# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -# Operating CA: Google Trust Services LLC -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 14367148294922964480859022125800977897474 -# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e -# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb -# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ -FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F -uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX -kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs -ewv4n4Q= ------END CERTIFICATE----- - -# Operating CA: Google Trust Services LLC -# Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R1 -# Subject: C=US, O=Google Trust Services LLC, CN=GTS Root R1 -# Label: "GTS Root R1" -# Serial: 6e:47:a9:c5:4b:47:0c:0d:ec:33:d0:89:b9:1c:f4:e1 -# MD5 Fingerprint: 82:1A:EF:D4:D2:4A:F2:9F:E2:3D:97:06:14:70:72:85 -# SHA1 Fingerprint: E1:C9:50:E6:EF:22:F8:4C:56:45:72:8B:92:20:60:D7:D5:A7:A3:E8 -# SHA256 Fingerprint: 2A:57:54:71:E3:13:40:BC:21:58:1C:BD:2C:F1:3E:15:84:63:20:3E:CE:94:BC:F9:D3:CC:19:6B:F0:9A:54:72 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM -f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX -mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 -zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P -fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc -vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 -Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp -zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO -Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW -k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ -DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF -lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW -Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 -d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z -XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR -gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 -d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv -J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg -DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM -+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy -F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 -SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws -E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl ------END CERTIFICATE----- - -# Operating CA: Google Trust Services LLC -# Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R2 -# Subject: C=US, O=Google Trust Services LLC, CN=GTS Root R2 -# Label: "GTS Root R2" -# Serial: 6e:47:a9:c6:5a:b3:e7:20:c5:30:9a:3f:68:52:f2:6f -# MD5 Fingerprint: 44:ED:9A:0E:A4:09:3B:00:F2:AE:4C:A3:C6:61:B0:8B -# SHA1 Fingerprint: D2:73:96:2A:2A:5E:39:9F:73:3F:E1:C7:1E:64:3F:03:38:34:FC:4D -# SHA256 Fingerprint: C4:5D:7B:B0:8E:6D:67:E6:2E:42:35:11:0B:56:4E:5F:78:FD:92:EF:05:8C:84:0A:EA:4E:64:55:D7:58:5C:60 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv -CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg -GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu -XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd -re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu -PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 -mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K -8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj -x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR -nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 -kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok -twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp -8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT -vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT -z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA -pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb -pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB -R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R -RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk -0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC -5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF -izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn -yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC ------END CERTIFICATE----- - -# Operating CA: Google Trust Services LLC -# Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R3 -# Subject: C=US, O=Google Trust Services LLC, CN=GTS Root R3 -# Label: "GTS Root R3" -# Serial: 6e:47:a9:c7:6c:a9:73:24:40:89:0f:03:55:dd:8d:1d -# MD5 Fingerprint: 1A:79:5B:6B:04:52:9C:5D:C7:74:33:1B:25:9A:F9:25 -# SHA1 Fingerprint: 30:D4:24:6F:07:FF:DB:91:89:8A:0B:E9:49:66:11:EB:8C:5E:46:E5 -# SHA256 Fingerprint: 15:D5:B8:77:46:19:EA:7D:54:CE:1C:A6:D0:B0:C4:03:E0:37:A9:17:F1:31:E8:A0:4E:1E:6B:7A:71:BA:BC:E5 ------BEGIN CERTIFICATE----- -MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout -736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A -DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk -fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA -njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd ------END CERTIFICATE----- - -# Operating CA: Google Trust Services LLC -# Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R4 -# Subject: C=US, O=Google Trust Services LLC, CN=GTS Root R4 -# Label: "GTS Root R4" -# Serial: 6e:47:a9:c8:8b:94:b6:e8:bb:3b:2a:d8:a2:b2:c1:99 -# MD5 Fingerprint: 5D:B6:6A:C4:60:17:24:6A:1A:99:A8:4B:EE:5E:B4:26 -# SHA1 Fingerprint: 2A:1D:60:27:D9:4A:B1:0A:1C:4D:91:5C:CD:33:A0:CB:3E:2D:54:CB -# SHA256 Fingerprint: 71:CC:A5:39:1F:9E:79:4B:04:80:25:30:B3:63:E1:21:DA:8A:30:43:BB:26:66:2F:EA:4D:CA:7F:C9:51:A4:BD ------BEGIN CERTIFICATE----- -MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu -hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l -xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 -CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx -sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== ------END CERTIFICATE----- diff --git a/iot/beta-features/commands/receive/resources/rsa_cert.pem b/iot/beta-features/commands/receive/resources/rsa_cert.pem deleted file mode 100644 index db7c7fa344..0000000000 --- a/iot/beta-features/commands/receive/resources/rsa_cert.pem +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC+DCCAeCgAwIBAgIJAMCU5DifwbH2MA0GCSqGSIb3DQEBCwUAMBExDzANBgNV -BAMMBnVudXNlZDAeFw0xNzEyMjAxODU0MzRaFw0yMDA5MTUxODU0MzRaMBExDzAN -BgNVBAMMBnVudXNlZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMc2 -pktp/RV1g7omV5CyNi1pQugZvxn6TciLqcjHP1XYfU6mnl7ySvH1xbkzaAlL/8Y8 -IqSFF4eI14qI71OT+7eLq6Ljj8j3XTqAtSANMSpi5KIRVQsa0h0rbRt7Xt1TeEd1 -ErVdzdRKrKvn7wM6UID0QGxC+1gpHGo3Aaz9Q4tVxAeWM6skCDh9WHea0HNj8MPA -hS4fc83PitfITOR9eCP2HW83HXu32yFpCU96WIQGSDfHfN7vD7mDXN+iZa02GJ2K -NBiwQa3LmHmcoaru2yTB9OTf1wGRY/QETrkmA+7enq7p2RQSe6uXu97k9UgV1Wes -c4QcJ/BAsLbaWB/f2h8CAwEAAaNTMFEwHQYDVR0OBBYEFCeNUvOsKm+BB9VgO1l1 -QlwS5rIEMB8GA1UdIwQYMBaAFCeNUvOsKm+BB9VgO1l1QlwS5rIEMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAAG/40RXw9lojT7aTJq7f196cL1v -qYiVNeZFE2Ki0iVjzDOk1SOXRqy8v8N4ay32gD+TZOg1Yy8loscKhGCnWIRepQC8 -1pyh2ZGHysICfHyxaKQgIMUzINSRI0E4bYt7kro497AodKN4P3QBH5Q6U7Ra3hG2 -b1dXOBVL0kUCKOnFuByEF2Zhytyhl3bTrm/W6dvhHBGTpB2RXwnldPnyEA4rmdyk -Ui9LYmEhWeizlBpw6jcXcd9qABrUMlxBt24DB3nKo/b8h6K4gXYfgO8yYbgsB+E6 -5wZGLi6nP5O98M+VmQZ5CBZSZid+sfK6eoT+Ca5vn7jSTQGzAIapc57dJEQ= ------END CERTIFICATE----- diff --git a/iot/beta-features/commands/receive/resources/rsa_private.pem b/iot/beta-features/commands/receive/resources/rsa_private.pem deleted file mode 100644 index d627d8a8c5..0000000000 --- a/iot/beta-features/commands/receive/resources/rsa_private.pem +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDHNqZLaf0VdYO6 -JleQsjYtaULoGb8Z+k3Ii6nIxz9V2H1Opp5e8krx9cW5M2gJS//GPCKkhReHiNeK -iO9Tk/u3i6ui44/I9106gLUgDTEqYuSiEVULGtIdK20be17dU3hHdRK1Xc3USqyr -5+8DOlCA9EBsQvtYKRxqNwGs/UOLVcQHljOrJAg4fVh3mtBzY/DDwIUuH3PNz4rX -yEzkfXgj9h1vNx17t9shaQlPeliEBkg3x3ze7w+5g1zfomWtNhidijQYsEGty5h5 -nKGq7tskwfTk39cBkWP0BE65JgPu3p6u6dkUEnurl7ve5PVIFdVnrHOEHCfwQLC2 -2lgf39ofAgMBAAECggEAa8LBI8w6jfAaiIiTF39/VQM6oQjEWg4PI2uBNU2qkgpg -hjoVMzEHn2keQrdvEJBe1GHVL3+bIcLBLXwzUdeb80aHWr6UGdbNRIc48xSPwujp -2k1b3nzsqcDC7XnH8Btl1embbCZI4Axg6UC2Bt31jDwT2TxGcAMVDtOggW4iqmyO -8v+J0j2tl+J/d7K49VtYkN5epoNn+gxpvsMbaDNmolE3Pcg2hr/h5tkzTWB53bwW -7K89FczsTvhCs8LWA/R+kKX9O9jpeUpbE6afAGdU6JCAYohClva1SIpksijV2HFg -SYZJ1QTjKfV11iBvYpj4wXGcuXgui4WL/0xCCXZt2QKBgQDq2PdYgpmJJFZHNRr9 -QlgZSAsuu16t49ezAxlm4Q8orAht0Nq02l6eMHbsjV3lRmyo0vK2byMQdhaSfweB -eT7sD/TSmT7jqGEqW+jtf8mNQpAeQhJJKJ8AbERF5heKcMwk6CbFAUipc1TgCiuZ -335SyJRLUU1yUSvGqbMevUKAJQKBgQDZKAuyItjZFlyU2dVXYC8tALWjIaLwSsXw -SbCfhlMLUt7DTb8+V834ygPtEKagcaw4QwcB+brH6dO1vwL3KQWMOeZcUkXg8NCW -F71J84LLmUsZQkHx8HqLG6o/DUq+M1SuklMROAI14ZKtL0xMW/lIgICngENanUS8 -m/kT+zIr8wKBgQCAkBgQDybICellf+/vdvNNm7/rbE1vekxpxieQx2IKDOtsWqpv -2R91D+j6pIUjb4MqhJi0QHD8oPjIZ9wPB/XnOvD2nUftTw8qJjiEU7FdsHO+7MKf -5CnvDFXvwf9fHVLUXXZj4MkLYoSzRT4LNWstHHr6JF72VvNVBS92g3s1NQKBgQDN -Rw3HVymmDX13OHR0JHh0Ejeh/ioI/KYgf4h3RIM8MRpjhRtD07zhchZEA3mAMfSb -OsFlHK10TZXUOLyU6DJWXGVm4F8uRHbpa4eEYK1DyaU0O24bRziQR5aoA+ij4+Ip -JCliHY/5X0NIc22swUTlRJRZwuXowsI3iTnrqYnEAQKBgQC9AhF+S6d7uIsEOg7I -Kv8ndASx7Nfsy6OQfOltgLArV4w2POQjbPYsLLrz4s82mSpS205w2OzCfcUXKLxD -mswC0Bs/U3UmJW0d1oWfUm28FjGbzGYGfOLm1dPuyNW32FbZXvO4+jaIemjtg2U7 -avJDFdpNwVz/bVg0HWQWNP/C0A== ------END PRIVATE KEY----- diff --git a/iot/beta-features/commands/send/README.md b/iot/beta-features/commands/send/README.md deleted file mode 100644 index 92aab5c8e8..0000000000 --- a/iot/beta-features/commands/send/README.md +++ /dev/null @@ -1,31 +0,0 @@ -Google Cloud Platform logo - -# Google Cloud IoT Core NodeJS Send Command sample - -This sample app demonstrates sending a command to a IoT Core Device. - -# Setup - -Run the following command to install the library dependencies for NodeJS: - - npm install - -Place `rsa_cert.pem` and `rsa_private.pem` into the resources directory under `../receive/resources` - - -# Running the sample - - Commands: - sendCommand Sends a command to a device. - - Options: - --projectId, -p The Project ID to use. Defaults to the value of the GCLOUD_PROJECT or GOOGLE_CLOUD_PROJECT - environment variables. [string] - --serviceAccount, -s The path to your service credentials JSON. [string] - --help Show help [boolean] - --cloudRegion, -c [string] [default: "us-central1"] - - Examples: - node send.js sendCommand my-device my-registry "test" - - For more information, see https://cloud.google.com/iot-core/docs diff --git a/iot/beta-features/commands/send/package.json b/iot/beta-features/commands/send/package.json deleted file mode 100644 index 63fc26d26c..0000000000 --- a/iot/beta-features/commands/send/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "nodejs-docs-samples-iot-manager", - "version": "0.0.1", - "description": "Example of Cloud IoT device administration", - "main": "manager.js", - "license": "Apache-2.0", - "author": "Google Inc.", - "repository": { - "type": "git", - "url": "https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git" - }, - "engines": { - "node": ">=8.0.0" - }, - "scripts": { - "lint": "repo-tools lint", - "pretest": "npm run lint", - "test": "repo-tools test run --cmd ava -- -T 3m --verbose sendTest.js" - }, - "dependencies": { - "@google-cloud/pubsub": "0.21.1", - "googleapis": ">=32.0.0", - "npm": "^6.4.1", - "yargs": "8.0.2" - }, - "devDependencies": { - "@google-cloud/nodejs-repo-tools": "^2.3.5", - "ava": "0.25.0", - "semistandard": "^12.0.1", - "uuid": "3.3.2" - }, - "cloud-repo-tools": { - "requiresKeyFile": true, - "requiresProjectId": true, - "test": { - "build": { - "requiredEnvVars": [ - "API_KEY" - ] - } - } - } -} diff --git a/iot/beta-features/commands/send/send.js b/iot/beta-features/commands/send/send.js deleted file mode 100644 index 015fe1fb2f..0000000000 --- a/iot/beta-features/commands/send/send.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Copyright 2018 Google LLC - * Licensed under the Apache License, Version 2.0 (the `License`); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an `AS IS` BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -'use strict'; - -const {google} = require('googleapis'); - -const API_VERSION = 'v1'; -const DISCOVERY_API = 'https://cloudiot.googleapis.com/$discovery/rest'; - -function sendCommand(deviceId, registryId, projectId, region, command) { - // [START iot_send_command] - const parentName = `projects/${projectId}/locations/${region}`; - const registryName = `${parentName}/registries/${registryId}`; - const binaryData = Buffer.from(command).toString('base64'); - const request = { - name: `${registryName}/devices/${deviceId}`, - binaryData: binaryData, - }; - - google.auth.getClient().then(authClient => { - const discoveryUrl = `${DISCOVERY_API}?version=${API_VERSION}`; - if (authClient.createScopedRequired && authClient.createScopedRequired()) { - // Scopes can be specified either as an array or as a single, - // space-delimited string. - authClient = authClient.createScoped([ - 'https://www.googleapis.com/auth/cloud-platform', - ]); - } - - google.options({ - auth: authClient, - }); - - google.discoverAPI(discoveryUrl).then((client, err) => { - if (err) { - console.log('Error during API discovery', err); - return undefined; - } - client.projects.locations.registries.devices.sendCommandToDevice( - request, - (err, data) => { - if (err) { - console.log('Could not send command:', request); - console.log('Message: ', err); - } else { - console.log('Success :', data.statusText); - } - } - ); - }); - }); - // [END iot_send_command] -} - -require(`yargs`) // eslint-disable-line - .demand(1) - .options({ - cloudRegion: { - alias: 'c', - default: 'us-central1', - requiresArg: true, - type: 'string', - }, - projectId: { - alias: 'p', - default: process.env.GCLOUD_PROJECT || process.env.GOOGLE_CLOUD_PROJECT, - description: `The Project ID to use. Defaults to the value of - the GCLOUD_PROJECT or GOOGLE_CLOUD_PROJECT environment variables.`, - requiresArg: true, - type: 'string', - }, - serviceAccount: { - alias: 's', - default: process.env.GOOGLE_APPLICATION_CREDENTIALS, - description: 'The path to your service credentials JSON.', - requiresArg: true, - type: 'string', - }, - }) - .command( - `sendCommand `, - `Sends a command to a device.`, - {}, - opts => { - sendCommand( - opts.deviceId, - opts.registryId, - opts.projectId, - opts.cloudRegion, - opts.command - ); - } - ) - .example(`node $0 sendCommand my-device my-registry "test"`) - .wrap(120) - .recommendCommands() - .epilogue(`For more information, see https://cloud.google.com/iot-core/docs`) - .help() - .strict().argv; diff --git a/iot/beta-features/commands/send/sendTest.js b/iot/beta-features/commands/send/sendTest.js deleted file mode 100644 index c22fbadfc8..0000000000 --- a/iot/beta-features/commands/send/sendTest.js +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright 2018 Google LLC - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -'use strict'; - -const path = require(`path`); -const {PubSub} = require(`@google-cloud/pubsub`); -const test = require(`ava`); -const tools = require(`@google-cloud/nodejs-repo-tools`); -const uuid = require(`uuid`); - -const topicName = `nodejs-docs-samples-test-iot-${uuid.v4()}`; -const registryName = `nodejs-test-registry-iot-${uuid.v4()}`; -const localRegName = `${registryName}-rsa256`; -const localDevice = `test-device-rsa256`; - -const helper = `node manager.js`; -const receiveCmd = `node receive.js`; -const sendCmd = `node send.js`; -const receiveCmdSuffix = `--privateKeyFile=resources/rsa_private.pem --algorithm=RS256`; -const cwdHelper = path.join(__dirname, `../../../manager`); -const cwdRcv = path.join(__dirname, `../receive`); -const cwdSend = path.join(__dirname, `../send`); -const installDeps = `npm install`; - -const pubsub = new PubSub(); - -test.before(tools.checkCredentials); -test.before(async () => { - let pubsubRes = await pubsub.createTopic(topicName); - const topic = pubsubRes[0]; - console.log(`Topic ${topic.name} created.`); -}); - -test.after.always(async () => { - const topic = pubsub.topic(topicName); - await topic.delete(); - console.log(`Topic ${topic.name} deleted.`); -}); - -test(`should send command message`, async t => { - // Create topic, registry, and device - await tools.runAsync(installDeps, cwdHelper); - await tools.runAsync(`${helper} setupIotTopic ${topicName}`, cwdHelper); - await tools.runAsync( - `${helper} createRegistry ${localRegName} ${topicName}`, - cwdHelper - ); - await tools.runAsync( - `${helper} createRsa256Device ${localDevice} ${localRegName} ./resources/rsa_cert.pem`, - cwdHelper - ); - - // Let the client run asynchronously since we don't need to test the output here - tools.runAsync( - `${receiveCmd} --deviceId=${localDevice} --registryId=${localRegName} ${receiveCmdSuffix}`, - cwdRcv - ); - - let out = await tools.runAsync( - `${sendCmd} sendCommand ${localDevice} ${localRegName} "me want cookies"`, - cwdSend - ); - - t.regex(out, new RegExp(`Success : OK`)); - - await tools.runAsync( - `${helper} getDeviceState ${localDevice} ${localRegName}`, - cwdHelper - ); - await tools.runAsync( - `${helper} deleteDevice ${localDevice} ${localRegName}`, - cwdHelper - ); - await tools.runAsync(`${helper} deleteRegistry ${localRegName}`, cwdHelper); -}); From b7ce35b60adc09ace20b086dc3f9781356b24028 Mon Sep 17 00:00:00 2001 From: Alex Hong Date: Mon, 10 Dec 2018 03:14:41 -0800 Subject: [PATCH 2/4] add iot gateway samples to beta-features --- iot/beta-features/gateway/README.md | 30 + iot/beta-features/gateway/gateway.js | 998 ++++++++++++++++++ iot/beta-features/gateway/gateway.test.js | 293 +++++ iot/beta-features/gateway/package.json | 34 + iot/beta-features/gateway/resources/README.md | 4 + iot/manager/package.json | 4 +- 6 files changed, 1361 insertions(+), 2 deletions(-) create mode 100644 iot/beta-features/gateway/README.md create mode 100644 iot/beta-features/gateway/gateway.js create mode 100644 iot/beta-features/gateway/gateway.test.js create mode 100644 iot/beta-features/gateway/package.json create mode 100644 iot/beta-features/gateway/resources/README.md diff --git a/iot/beta-features/gateway/README.md b/iot/beta-features/gateway/README.md new file mode 100644 index 0000000000..31bcbfe5a0 --- /dev/null +++ b/iot/beta-features/gateway/README.md @@ -0,0 +1,30 @@ +Google Cloud Platform logo + +# Google Cloud IoT Core NodeJS Gateway sample + +This sample app demonstrates sending telemetry data on behalf of device using +the a Cloud IoT Core gateway. + +# Setup + +Run the following command to install the library dependencies for NodeJS: + + npm install + +# Running the sample + + Commands: + relayData Sends data on behalf of a device. + + Options: + --projectId, -p The Project ID to use. Defaults to the value of the GCLOUD_PROJECT or GOOGLE_CLOUD_PROJECT + environment variables. [string] + --serviceAccount, -s The path to your service credentials JSON. [string] [default: "/Users/class/creds_cloud.json"] + --help Show help [boolean] + --cloudRegion, -c [string] [default: "us-central1"] + --data, -d [string] [default: "us-central1"] + + Examples: + node hub.js relayData my-device my-registry "test" + + For more information, see https://cloud.google.com/iot-core/docs diff --git a/iot/beta-features/gateway/gateway.js b/iot/beta-features/gateway/gateway.js new file mode 100644 index 0000000000..67ec377983 --- /dev/null +++ b/iot/beta-features/gateway/gateway.js @@ -0,0 +1,998 @@ +/** + * Copyright 2018 Google LLC + * Licensed under the Apache License, Version 2.0 (the `License`); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an `AS IS` BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +// [START iot_gateway_include] +const fs = require('fs'); +const {google} = require('googleapis'); +const jwt = require('jsonwebtoken'); +const mqtt = require('mqtt'); +// [END iot_gateway_include] + +// [START iot_gateway_client_config] +const API_VERSION = 'v1'; +const DISCOVERY_API = 'https://cloudiot.googleapis.com/$discovery/rest'; + +// Returns an authorized API client by discovering the Cloud IoT Core API with +// the provided API key. +function getClient(serviceAccountJson, cb) { + google.auth + .getClient({ + scopes: ['https://www.googleapis.com/auth/cloud-platform'], + }) + .then(authClient => { + const discoveryUrl = `${DISCOVERY_API}?version=${API_VERSION}`; + + google.options({ + auth: authClient, + }); + + google + .discoverAPI(discoveryUrl) + .then(client => { + cb(client); + }) + .catch(err => { + console.log('Error during API discovery.', err); + }); + }); +} +// [END iot_gateway_client_config] + +// [START iot_gateway_client_backoff_variables] +// The initial backoff time after a disconnection occurs, in seconds. +const MINIMUM_BACKOFF_TIME = 1; + +// The maximum backoff time before giving up, in seconds. +const MAXIMUM_BACKOFF_TIME = 32; + +// Whether to wait with exponential backoff before publishing. +let shouldBackoff = false; + +// The current backoff time. +let backoffTime = 1; + +// Whether an asynchronous publish chain is in progress +let publishChainInProgress = false; + +// [END iot_gateway_client_backoff_variables] + +// Create a Cloud IoT Core JWT for the given project id, signed with the given +// private key. +// [START iot_mqtt_jwt] +function createJwt(projectId, privateKeyFile, algorithm) { + // Create a JWT to authenticate this device. The device will be disconnected + // after the token expires, and will have to reconnect with a new token. The + // audience field should always be set to the GCP project id. + const token = { + iat: parseInt(Date.now() / 1000), + exp: parseInt(Date.now() / 1000) + 20 * 60, // 20 minutes + aud: projectId, + }; + const privateKey = fs.readFileSync(privateKeyFile); + return jwt.sign(token, privateKey, {algorithm: algorithm}); +} +// [END iot_mqtt_jwt] + +// Creates a gateway. +function createGateway( + client, + projectId, + cloudRegion, + registryId, + gatewayId, + certificateFile, + algorithm +) { + // [START create_gateway] + // const cloudRegion = 'us-central1'; + // const deviceId = 'my-unauth-device'; + // const gatewayId = 'my-gateway'; + // const projectId = 'adjective-noun-123'; + // const registryId = 'my-registry'; + const parentName = `projects/${projectId}/locations/${cloudRegion}/registries/${registryId}`; + console.log('Creating gateway:', gatewayId); + + const certFormat = algorithm === 'ES256' ? 'ES256_PEM' : 'RSA_X509_PEM'; + + console.log(certFormat); + + const createRequest = { + parent: parentName, + resource: { + id: gatewayId, + credentials: [ + { + publicKey: { + format: certFormat, + key: fs.readFileSync(certificateFile).toString(), + }, + }, + ], + gatewayConfig: { + gatewayType: 'GATEWAY', + gatewayAuthMethod: 'ASSOCIATION_ONLY', + }, + }, + }; + + client.projects.locations.registries.devices.create( + createRequest, + (err, res) => { + if (err) { + console.log('Could not create device'); + console.log(err); + } else { + console.log('Created device'); + console.log(res.data); + } + } + ); + // [END create_gateway] +} + +// Creates a device to bind to a gateway. +function createDeviceForGateway( + client, + projectId, + cloudRegion, + registryId, + deviceId, + gatewayId, + cb +) { + // [START create_device] + // const cloudRegion = 'us-central1'; + // const deviceId = 'my-unauth-device'; + // const gatewayId = 'my-gateway'; + // const projectId = 'adjective-noun-123'; + // const registryId = 'my-registry'; + const parentName = `projects/${projectId}/locations/${cloudRegion}/registries/${registryId}`; + const getRequest = { + name: `${parentName}/devices/${deviceId}`, + }; + + let exists = false; + let device = {}; + client.projects.locations.registries.devices.get(getRequest, (err, res) => { + if (err) { + // Device not found + console.log('Error while getting device', err); + } else { + console.log('Device exists'); + device = res.data; + exists = true; + } + + if (exists) { + cb(client, projectId, cloudRegion, registryId, device, gatewayId); + } else { + console.log('Creating device:', deviceId); + + const createRequest = { + parent: parentName, + resource: { + id: deviceId, + gatewayConfig: { + gatewayType: 'NON_GATEWAY', + gatewayAuthMethod: 'ASSOCIATION_ONLY', + }, + }, + }; + + client.projects.locations.registries.devices.create( + createRequest, + (err, res) => { + if (err) { + console.log('Could not create device'); + console.log(err); + } else { + console.log('Created device'); + device = res.data; + console.log(device); + } + cb(client, projectId, cloudRegion, registryId, device, gatewayId); + } + ); + } + }); + // [END create_device] +} + +// Binds a device to a gateway so that it can be attached. +function bindDeviceToGateway( + client, + projectId, + cloudRegion, + registryId, + deviceId, + gatewayId +) { + // [START bind_device_to_gateway] + // const cloudRegion = 'us-central1'; + // const deviceId = 'my-unauth-device'; + // const gatewayId = 'my-gateway'; + // const projectId = 'adjective-noun-123'; + // const registryId = 'my-registry'; + const callback = ( + client, + projectId, + cloudRegion, + registryId, + device, + gatewayId + ) => { + console.log(`Binding device: ${JSON.stringify(device.id)}`); + const parentName = `projects/${projectId}/locations/${cloudRegion}/registries/${registryId}`; + + const bindRequest = { + parent: parentName, + deviceId: device.id, + gatewayId: gatewayId, + }; + + client.projects.locations.registries.bindDeviceToGateway( + bindRequest, + (err, res) => { + if (err) { + console.log('Could not bind device', err); + } else { + console.log('Bound device', res.data); + } + } + ); + }; + + createDeviceForGateway( + client, + projectId, + cloudRegion, + registryId, + deviceId, + gatewayId, + callback + ); + // [END bind_device_to_gateway] +} + +// Unbinds a device from a gateway. +function unbindDeviceFromGateway( + client, + projectId, + cloudRegion, + registryId, + deviceId, + gatewayId +) { + // [START unbind_device_to_gateway] + // const cloudRegion = 'us-central1'; + // const deviceId = 'my-unauth-device'; + // const gatewayId = 'my-gateway'; + // const projectId = 'adjective-noun-123'; + // const registryId = 'my-registry'; + console.log(`Unbinding device: ${deviceId}`); + const parentName = `projects/${projectId}/locations/${cloudRegion}/registries/${registryId}`; + + const bindRequest = { + parent: parentName, + deviceId: deviceId, + gatewayId: gatewayId, + }; + + client.projects.locations.registries.unbindDeviceFromGateway( + bindRequest, + (err, res) => { + if (err) { + console.log('Could not unbind device', err); + } else { + console.log('Device no longer bound: ', res.data); + } + } + ); + // [END unbind_device_to_gateway] +} + +// Lists gateways in a registry. +function listGateways(client, projectId, cloudRegion, registryId) { + // [START list_gateways] + // const cloudRegion = 'us-central1'; + // const projectId = 'adjective-noun-123'; + // const registryId = 'my-registry'; + const parentName = `projects/${projectId}/locations/${cloudRegion}/registries/${registryId}`; + const request = { + parent: parentName, + fieldMask: 'config,gatewayConfig', + }; + + client.projects.locations.registries.devices.list(request, (err, res) => { + if (err) { + console.log('Could not list devices'); + console.log(err); + } else { + let data = res.data; + console.log('Current gateways in registry:'); + data.devices.forEach(function(device) { + if ( + device.gatewayConfig !== undefined && + device.gatewayConfig.gatewayType === 'GATEWAY' + ) { + console.log('----\n', device); + } else { + console.log('\t', device); + } + }); + } + }); + // [END list_gateways] +} + +// Lists devices bound to a gateway. +function listDevicesForGateway( + client, + projectId, + cloudRegion, + registryId, + gatewayId +) { + // [START list_devices_for_gateway] + // const cloudRegion = 'us-central1'; + // const gatewayId = 'my-gateway'; + // const projectId = 'adjective-noun-123'; + // const registryId = 'my-registry'; + const parentName = `projects/${projectId}/locations/${cloudRegion}/registries/${registryId}`; + const request = { + parent: parentName, + 'gatewayListOptions.associationsGatewayId': gatewayId, + }; + + client.projects.locations.registries.devices.list(request, (err, res) => { + if (err) { + console.log('Could not list devices'); + console.log(err); + } else { + console.log('Current devices bound to gateway: ', gatewayId); + let data = res.data; + if (data.devices && data.devices.length > 0) { + data.devices.forEach(device => { + console.log(`\tDevice: ${device.numId} : ${device.id}`); + }); + } else { + console.log('No devices bound.'); + } + } + }); + // [END list_devices_for_gateway] +} + +// Attaches a device to a gateway. +function attachDevice(deviceId, client) { + // [START attach_device] + // const deviceId = 'my-unauth-device'; + const attachTopic = `/devices/${deviceId}/attach`; + console.log(`Attaching: ${attachTopic}`); + // TODO {'authorization': ''} + const attachPayload = '{}'; + client.publish(attachTopic, attachPayload, {qos: 1}, err => { + if (!err) { + shouldBackoff = false; + backoffTime = MINIMUM_BACKOFF_TIME; + } else { + console.log(err); + } + }); + // [END attach_device] +} + +// Detaches a device from a gateway. +function detachDevice(deviceId, client) { + // [START detach_device] + const detachTopic = `/devices/${deviceId}/detach`; + console.log(`Detaching: ${detachTopic}`); + // TODO {'authorization': ''} + const detachPayload = '{}'; + client.publish(detachTopic, detachPayload, {qos: 1}, err => { + if (!err) { + shouldBackoff = false; + backoffTime = MINIMUM_BACKOFF_TIME; + } else { + console.log(err); + } + }); + // [END detach_device] +} + +// Listen for configuration messages on a gateway and bound device. +function listenForConfigMessages( + gatewayId, + deviceId, + registryId, + projectId, + region, + algorithm, + privateKeyFile, + mqttBridgeHostname, + mqttBridgePort, + clientDuration +) { + // [START listen_for_config_messages] + // const parentName = `projects/${projectId}/locations/${region}`; + // const registryName = `${parentName}/registries/${registryId}`; + + const mqttClientId = `projects/${projectId}/locations/${region}/registries/${registryId}/devices/${gatewayId}`; + console.log(mqttClientId); + let connectionArgs = { + host: mqttBridgeHostname, + port: mqttBridgePort, + clientId: mqttClientId, + username: 'unused', + password: createJwt(projectId, privateKeyFile, algorithm), + protocol: 'mqtts', + qos: 1, + secureProtocol: 'TLSv1_2_method', + }; + + // Create a client, and connect to the Google MQTT bridge. + let client = mqtt.connect(connectionArgs); + + client.on('connect', success => { + if (!success) { + console.log('Client not connected...'); + } else { + // TODO: wait for commands + console.log('Client connected: Gateway is listening, attaching device'); + attachDevice(deviceId, client); + + setTimeout(() => { + // Subscribe to any configuration topics. + client.subscribe(`/devices/${gatewayId}/config`, {qos: 1}); + client.subscribe(`/devices/${deviceId}/config`, {qos: 1}); + + setTimeout(() => { + detachDevice(deviceId, client); + console.log('Closing connection to MQTT. Goodbye!'); + client.end(true); + }, clientDuration); // Safely detach device and close connection. + }, 5000); + } + }); + + client.on('close', () => { + console.log('Connection closed'); + shouldBackoff = true; + }); + + client.on('error', err => { + console.log('error', err); + }); + + client.on('message', (topic, message) => { + let decodedMessage = Buffer.from(message, 'base64').toString('ascii'); + + if (topic === `/devices/${gatewayId}/errors`) { + console.log(`message received on error topic: ${decodedMessage}`); + } else { + console.log(`message received on topic ${topic}: ${decodedMessage}`); + } + }); + + client.on('packetsend', () => { + // Note: logging packet send is very verbose + }); + // [END listen_for_config_messages] +} + +// Listen for error messages on a gateway. +function listenForErrorMessages( + gatewayId, + registryId, + projectId, + region, + algorithm, + privateKeyFile, + mqttBridgeHostname, + mqttBridgePort, + clientDuration, + deviceId +) { + // [START listen_for_error_messages] + // const parentName = `projects/${projectId}/locations/${region}`; + // const registryName = `${parentName}/registries/${registryId}`; + + const mqttClientId = `projects/${projectId}/locations/${region}/registries/${registryId}/devices/${gatewayId}`; + console.log(mqttClientId); + let connectionArgs = { + host: mqttBridgeHostname, + port: mqttBridgePort, + clientId: mqttClientId, + username: 'unused', + password: createJwt(projectId, privateKeyFile, algorithm), + protocol: 'mqtts', + qos: 1, + secureProtocol: 'TLSv1_2_method', + }; + + // Create a client, and connect to the Google MQTT bridge. + let client = mqtt.connect(connectionArgs); + + client.on('connect', success => { + if (!success) { + console.log('Client not connected...'); + } else { + setTimeout(() => { + // Subscribe to gateway error topic. + client.subscribe(`/devices/${gatewayId}/errors`, {qos: 0}); + + attachDevice(deviceId, client); + + setTimeout(() => { + console.log('Closing connection to MQTT. Goodbye!'); + client.end(true); + }, clientDuration); // Safely detach device and close connection. + }, 5000); + } + }); + + client.on('close', () => { + console.log('Connection closed'); + shouldBackoff = true; + }); + + client.on('error', err => { + console.log('error', err); + }); + + client.on('message', (topic, message) => { + let decodedMessage = Buffer.from(message, 'base64').toString('ascii'); + + console.log(`message received on error topic ${topic}: ${decodedMessage}`); + }); + + client.on('packetsend', () => { + // Note: logging packet send is very verbose + }); + // [END listen_for_error_messages] +} + +// Sends telemetry on behalf of a device. +function sendDataFromBoundDevice( + gatewayId, + deviceId, + registryId, + projectId, + region, + algorithm, + privateKeyFile, + mqttBridgeHostname, + mqttBridgePort, + data, + numMessages, + tokenExpMins +) { + // [START iot_send_delegate_data] + // const parentName = `projects/${projectId}/locations/${region}`; + // const registryName = `${parentName}/registries/${registryId}`; + // const binaryData = Buffer.from(data).toString('base64'); + // const request = { + // name: `${registryName}/devices/${deviceId}`, + // binaryData: binaryData + // }; + + const mqttClientId = `projects/${projectId}/locations/${region}/registries/${registryId}/devices/${gatewayId}`; + console.log(`MQTT client id: ${mqttClientId}`); + let connectionArgs = { + host: mqttBridgeHostname, + port: mqttBridgePort, + clientId: mqttClientId, + username: 'unused', + password: createJwt(projectId, privateKeyFile, algorithm), + protocol: 'mqtts', + qos: 1, + secureProtocol: 'TLSv1_2_method', + }; + + // Create a client, and connect to the Google MQTT bridge. + let iatTime = parseInt(Date.now() / 1000); + let client = mqtt.connect(connectionArgs); + + client.on('connect', success => { + if (!success) { + console.log('Client not connected...'); + } else if (!publishChainInProgress) { + // TODO: wait for commands + console.log('Client connected: Attaching device'); + attachDevice(deviceId, client); + setTimeout(() => { + console.log('Client connected: Gateway is ready to relay'); + publishAsync( + client, + iatTime, + tokenExpMins, + 0, + numMessages, + registryId, + deviceId, + gatewayId, + connectionArgs, + projectId, + privateKeyFile, + algorithm + ); + }, 5000); + } + }); + + client.on('close', () => { + console.log('Connection closed'); + shouldBackoff = true; + }); + + client.on('error', err => { + console.log('error', err); + }); + + client.on('message', (topic, message) => { + console.log( + 'message received: ', + Buffer.from(message, 'base64').toString('ascii') + ); + }); + + client.on('packetsend', () => { + // Note: logging packet send is very verbose + }); + // [END iot_send_delegate_data] +} + +// Publish numMessages messages asynchronously, starting from message +// messagesSent. +function publishAsync( + client, + iatTime, + tokenExpMins, + messagesSent, + numMessages, + registryId, + deviceId, + gatewayId, + connectionArgs, + projectId, + privateKeyFile, + algorithm +) { + // [START iot_mqtt_publish] + // If we have published enough messages or backed off too many times, stop. + if (messagesSent > numMessages || backoffTime >= MAXIMUM_BACKOFF_TIME) { + if (backoffTime >= MAXIMUM_BACKOFF_TIME) { + console.log('Backoff time is too high. Giving up.'); + } + if (messagesSent >= numMessages) { + detachDevice(deviceId, client); + } + console.log('Closing connection to MQTT. Goodbye!'); + client.end(); + publishChainInProgress = false; + return; + } + + // Publish and schedule the next publish. + publishChainInProgress = true; + var publishDelayMs = 0; + if (shouldBackoff) { + publishDelayMs = 1000 * (backoffTime + Math.random()); + backoffTime *= 2; + console.log(`Backing off for ${publishDelayMs}ms before publishing.`); + } + let mqttTopic = `/devices/${gatewayId}/state`; + let payload = `${registryId}/${gatewayId}-connected-${new Date().getTime()}`; + console.log(`Publishing message ${messagesSent}/${numMessages}`); + if (messagesSent > 0) { + mqttTopic = `/devices/${deviceId}/state`; + payload = `${registryId}/${deviceId}-payload-${messagesSent}`; + } + + setTimeout(function() { + // Publish "payload" to the MQTT topic. qos=1 means at least once delivery. + // Cloud IoT Core also supports qos=0 for at most once delivery. + console.log(`Publishing message: ${payload} to ${mqttTopic}`); + client.publish(mqttTopic, payload, {qos: 1}, function(err) { + if (!err) { + shouldBackoff = false; + backoffTime = MINIMUM_BACKOFF_TIME; + } + }); + + var schedulePublishDelayMs = 5000; // messageType === 'events' ? 1000 : 2000; + setTimeout(function() { + // [START iot_mqtt_jwt_refresh] + let secsFromIssue = parseInt(Date.now() / 1000) - iatTime; + if (secsFromIssue > tokenExpMins * 60) { + iatTime = parseInt(Date.now() / 1000); + console.log(`\tRefreshing token after ${secsFromIssue} seconds.`); + + client.end(); + connectionArgs.password = createJwt( + projectId, + privateKeyFile, + algorithm + ); + client = mqtt.connect(connectionArgs); + } + // [END iot_mqtt_jwt_refresh] + publishAsync( + client, + iatTime, + tokenExpMins, + messagesSent + 1, + numMessages, + registryId, + deviceId, + gatewayId + ); + }, schedulePublishDelayMs); + }, publishDelayMs); + // [END iot_mqtt_publish] +} + +let argv = require(`yargs`) // eslint-disable-line + .demandCommand(1, 'You need at least one command before moving on') + .options({ + algorithm: { + default: 'RS256', + description: 'Encryption algorithm to generate the JWT.', + requiresArg: true, + demandOption: true, + choices: ['RS256', 'ES256'], + type: 'string', + }, + clientDuration: { + default: 60000, + description: 'Duration in milliseconds for MQTT client to last', + requiresArg: true, + type: 'number' + }, + cloudRegion: { + alias: 'c', + default: 'us-central1', + requiresArg: true, + type: 'string', + }, + data: { + alias: 'd', + default: 'Test data', + requiresArg: true, + type: 'string', + }, + deviceId: { + description: 'Cloud IoT device ID.', + requiresArg: false, + demandOption: false, + type: 'string', + }, + gatewayId: { + description: 'Cloud IoT gateway ID.', + requiresArg: false, + demandOption: false, + type: 'string', + }, + mqttBridgePort: { + default: 8883, + description: 'MQTT bridge port.', + requiresArg: true, + type: 'number', + }, + mqttBridgeHostname: { + default: 'mqtt.googleapis.com', + description: 'MQTT bridge hostname.', + requiresArg: true, + type: 'string', + }, + privateKeyFile: { + description: 'Path to private key file.', + requiresArg: true, + type: 'string', + }, + projectId: { + alias: 'p', + default: process.env.GCLOUD_PROJECT || process.env.GOOGLE_CLOUD_PROJECT, + description: + 'The Project ID to use. Defaults to the value of the GCLOUD_PROJECT or GOOGLE_CLOUD_PROJECT environment variables.', + requiresArg: true, + type: 'string', + }, + serviceAccount: { + alias: 's', + default: process.env.GOOGLE_APPLICATION_CREDENTIALS, + description: 'The path to your service credentials JSON.', + requiresArg: true, + type: 'string', + }, + tokenExpMins: { + default: 20, + description: 'Minutes to JWT token expiration.', + requiresArg: true, + type: 'number', + }, + }) + .command( + `listen `, + `Listens for configuration changes on a gateway and bound device.`, + { + privateKeyFile: { + demandOption: true, + }, + }, + opts => { + listenForConfigMessages( + opts.gatewayId, + opts.deviceId, + opts.registryId, + opts.projectId, + opts.cloudRegion, + opts.algorithm, + opts.privateKeyFile, + opts.mqttBridgeHostname, + opts.mqttBridgePort, + opts.clientDuration + ); + } + ) + .command( + `listenForErrors `, + `Listens for error messages on a gateway.`, + { + privateKeyFile: { + demandOption: true, + }, + }, + opts => { + listenForErrorMessages( + opts.gatewayId, + opts.registryId, + opts.projectId, + opts.cloudRegion, + opts.algorithm, + opts.privateKeyFile, + opts.mqttBridgeHostname, + opts.mqttBridgePort, + opts.clientDuration, + opts.deviceId + ); + } + ) + .command( + `relayData `, + `Sends data on behalf of a bound device.`, + { + numMessages: { + default: 5, + description: 'Number of messages to publish.', + requiresArg: true, + type: 'number', + }, + privateKeyFile: { + demandOption: true, + }, + }, + opts => { + sendDataFromBoundDevice( + opts.gatewayId, + opts.deviceId, + opts.registryId, + opts.projectId, + opts.cloudRegion, + opts.algorithm, + opts.privateKeyFile, + opts.mqttBridgeHostname, + opts.mqttBridgePort, + opts.data, + opts.numMessages, + opts.tokenExpMins + ); + } + ) + .command( + `bindDeviceToGateway `, + `Binds a device to a gateway`, + {}, + opts => { + const cb = function(client) { + bindDeviceToGateway( + client, + opts.projectId, + opts.cloudRegion, + opts.registryId, + opts.deviceId, + opts.gatewayId + ); + }; + getClient(opts.serviceAccount, cb); + } + ) + .command( + `createGateway `, + `Creates a gateway`, + { + publicKeyFile: { + demandOption: true, + }, + }, + opts => { + const cb = function(client) { + createGateway( + client, + opts.projectId, + opts.cloudRegion, + opts.registryId, + opts.gatewayId, + opts.publicKeyFile, + opts.algorithm + ); + }; + getClient(opts.serviceAccount, cb); + } + ) + .command( + `listDevicesForGateway `, + `Lists devices in a gateway.`, + {}, + opts => { + const cb = function(client) { + listDevicesForGateway( + client, + opts.projectId, + opts.cloudRegion, + opts.registryId, + opts.gatewayId + ); + }; + getClient(opts.serviceAccount, cb); + } + ) + .command( + `listGateways `, + `Lists gateways in a registry.`, + {}, + opts => { + const cb = function(client) { + listGateways(client, opts.projectId, opts.cloudRegion, opts.registryId); + }; + getClient(opts.serviceAccount, cb); + } + ) + .command( + `unbindDeviceFromGateway `, + `Unbinds a device from a gateway`, + {}, + opts => { + const cb = function(client) { + unbindDeviceFromGateway( + client, + opts.projectId, + opts.cloudRegion, + opts.registryId, + opts.deviceId, + opts.gatewayId + ); + }; + getClient(opts.serviceAccount, cb); + } + ) + .example(`node $0 relayData my-device my-registry "test"`) + .wrap(120) + .recommendCommands() + .epilogue(`For more information, see https://cloud.google.com/iot-core/docs`) + .help() + .strict().argv; diff --git a/iot/beta-features/gateway/gateway.test.js b/iot/beta-features/gateway/gateway.test.js new file mode 100644 index 0000000000..7a2e1ed616 --- /dev/null +++ b/iot/beta-features/gateway/gateway.test.js @@ -0,0 +1,293 @@ +/** + * Copyright 2018 Google LLC + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const path = require(`path`); +const PubSub = require(`@google-cloud/pubsub`); +const test = require(`ava`); +const tools = require(`@google-cloud/nodejs-repo-tools`); +const uuid = require(`uuid`); + +const cmd = `node gateway.js`; +const topicName = `nodejs-docs-samples-test-iot-${uuid.v4()}`; +const registryName = `nodejs-test-registry-iot-${uuid.v4()}`; + +const helper = `node manager.js`; +const cwdHelper = path.join(__dirname, `../../manager`); +const installDeps = `npm install`; +const publicKeyParam = `--publicKeyFile=./resources/rsa_cert.pem`; +const privateKeyParam = `--privateKeyFile=./resources/rsa_private.pem`; + +const pubsub = PubSub(); + +test.before(tools.checkCredentials); +test.before(async () => { + let pubsubRes = await pubsub.createTopic(topicName); + const topic = pubsubRes[0]; + console.log(`Topic ${topic.name} created.`); + + await tools.runAsync(installDeps, cwdHelper); + await tools.runAsync(`${helper} setupIotTopic ${topicName}`, cwdHelper); + await tools.runAsync( + `${helper} createRegistry ${registryName} ${topicName}`, + cwdHelper + ); + console.log(`Registry ${registryName} created`); +}); + +test.after.always(async () => { + await tools.runAsync(`${helper} deleteRegistry ${registryName}`, cwdHelper); + console.log(`Registry ${registryName} was deleted`); + + const topic = pubsub.topic(topicName); + await topic.delete(); + console.log(`Topic ${topic.name} deleted.`); +}); + +test(`should create a new gateway`, async t => { + // create gateway + const gatewayId = `nodejs-test-gateway-iot-${uuid.v4()}`; + let gatewayOut = await tools.runAsync( + `${cmd} createGateway ${registryName} ${gatewayId} RS256 ${publicKeyParam}` + ); // test no error on create gateway + t.regex(gatewayOut, new RegExp('Created device')); + + // delete gateway with deleteDevice + tools.runAsync( + `${helper} deleteDevice ${gatewayId} ${registryName}`, + cwdHelper + ); +}); + +test(`should list gateways`, async t => { + const gatewayId = `nodejs-test-gateway-iot-${uuid.v4()}`; + await tools.runAsync( + `${cmd} createGateway ${registryName} ${gatewayId} RS256 ${publicKeyParam}` + ); + + // look for output in list gateway + let gateways = await tools.runAsync(`${cmd} listGateways ${registryName}`); + t.regex(gateways, new RegExp(`${gatewayId}`)); + + tools.runAsync( + `${helper} deleteDevice ${gatewayId} ${registryName}`, + cwdHelper + ); +}); + +test(`should bind existing device to gateway`, async t => { + const gatewayId = `nodejs-test-gateway-iot-${uuid.v4()}`; + await tools.runAsync( + `${cmd} createGateway ${registryName} ${gatewayId} RS256 ${publicKeyParam}` + ); + + // create device + const deviceId = `nodejs-test-device-iot-${uuid.v4()}`; + await tools.runAsync( + `${helper} createRsa256Device ${deviceId} ${registryName} ./resources/rsa_cert.pem`, + cwdHelper + ); + + // bind device to gateway + let bind = await tools.runAsync( + `${cmd} bindDeviceToGateway ${registryName} ${gatewayId} ${deviceId}` + ); + + t.regex(bind, new RegExp('Device exists')); + t.regex(bind, new RegExp('Bound device')); + t.notRegex(bind, new RegExp('Could not bind device')); + + // test unbind + let unbind = await tools.runAsync( + `${cmd} unbindDeviceFromGateway ${registryName} ${gatewayId} ${deviceId}` + ); + t.regex(unbind, new RegExp('Device no longer bound')); + + await tools.runAsync( + `${helper} deleteDevice ${gatewayId} ${registryName}`, + cwdHelper + ); + await tools.runAsync( + `${helper} deleteDevice ${deviceId} ${registryName}`, + cwdHelper + ); +}); + +test(`should bind new device to gateway`, async t => { + const gatewayId = `nodejs-test-gateway-iot-${uuid.v4()}`; + await tools.runAsync( + `${cmd} createGateway ${registryName} ${gatewayId} RS256 ${publicKeyParam}` + ); + + // binding a non-existing device should create it + const deviceId = `nodejs-test-device-iot-${uuid.v4()}`; + let bind = await tools.runAsync( + `${cmd} bindDeviceToGateway ${registryName} ${gatewayId} ${deviceId}` + ); + + t.regex(bind, new RegExp('Created device')); + t.regex(bind, new RegExp('Bound device')); + t.notRegex(bind, new RegExp('Could not bind device')); + + // unbind and delete device and gateway + let unbind = await tools.runAsync( + `${cmd} unbindDeviceFromGateway ${registryName} ${gatewayId} ${deviceId}` + ); + t.regex(unbind, new RegExp('Device no longer bound')); + + await tools.runAsync( + `${helper} deleteDevice ${gatewayId} ${registryName}`, + cwdHelper + ); + await tools.runAsync( + `${helper} deleteDevice ${deviceId} ${registryName}`, + cwdHelper + ); +}); + +test(`should list devices bound to gateway`, async t => { + const gatewayId = `nodejs-test-gateway-iot-${uuid.v4()}`; + await tools.runAsync( + `${cmd} createGateway ${registryName} ${gatewayId} RS256 ${publicKeyParam}` + ); + + // binding a non-existing device should create it + const deviceId = `nodejs-test-device-iot-${uuid.v4()}`; + await tools.runAsync( + `${cmd} bindDeviceToGateway ${registryName} ${gatewayId} ${deviceId}` + ); + + let devices = await tools.runAsync( + `${cmd} listDevicesForGateway ${registryName} ${gatewayId}` + ); + + t.regex(devices, new RegExp(deviceId)); + t.notRegex(devices, new RegExp('No devices bound')); + + // cleanup + await tools.runAsync( + `${cmd} unbindDeviceFromGateway ${registryName} ${gatewayId} ${deviceId}` + ); + await tools.runAsync( + `${helper} deleteDevice ${gatewayId} ${registryName}`, + cwdHelper + ); + await tools.runAsync( + `${helper} deleteDevice ${deviceId} ${registryName}`, + cwdHelper + ); +}); + +test(`should listen for bound device config message`, async t => { + const gatewayId = `nodejs-test-gateway-iot-${uuid.v4()}`; + await tools.runAsync( + `${cmd} createGateway ${registryName} ${gatewayId} RS256 ${publicKeyParam}` + ); + + const deviceId = `nodejs-test-device-iot-${uuid.v4()}`; + await tools.runAsync( + `${cmd} bindDeviceToGateway ${registryName} ${gatewayId} ${deviceId}` + ); + + // listen for configuration changes + let out = await tools.runAsync( + `${cmd} listen ${deviceId} ${gatewayId} ${registryName} ${privateKeyParam} --clientDuration=30000` + ); + + t.regex(out, new RegExp('message received')); + + // cleanup + await tools.runAsync( + `${cmd} unbindDeviceFromGateway ${registryName} ${gatewayId} ${deviceId}` + ); + await tools.runAsync( + `${helper} deleteDevice ${gatewayId} ${registryName}`, + cwdHelper + ); + await tools.runAsync( + `${helper} deleteDevice ${deviceId} ${registryName}`, + cwdHelper + ); +}); + +test(`should listen for error topic messages`, async t => { + const gatewayId = `nodejs-test-gateway-iot-${uuid.v4()}`; + await tools.runAsync( + `${cmd} createGateway ${registryName} ${gatewayId} RS256 ${publicKeyParam}` + ); + + // create a device but don't associate it with the gateway + const deviceId = `nodejs-test-device-iot-${uuid.v4()}`; + await tools.runAsync( + `${helper} createRsa256Device ${deviceId} ${registryName} ./resources/rsa_cert.pem`, + cwdHelper + ); + + // check error topic contains error of attaching a device that is not bound + let out = await tools.runAsync( + `${cmd} listenForErrors ${gatewayId} ${registryName} ${deviceId} ${privateKeyParam} --clientDuration=30000` + ); + + t.regex( + out, + new RegExp(`DeviceId ${deviceId} is not associated with Gateway`) + ); + + // cleanup + await tools.runAsync( + `${cmd} unbindDeviceFromGateway ${registryName} ${gatewayId} ${deviceId}` + ); + await tools.runAsync( + `${helper} deleteDevice ${gatewayId} ${registryName}`, + cwdHelper + ); + await tools.runAsync( + `${helper} deleteDevice ${deviceId} ${registryName}`, + cwdHelper + ); +}); + +test(`should send data from bound device`, async t => { + const gatewayId = `nodejs-test-gateway-iot-${uuid.v4()}`; + await tools.runAsync( + `${cmd} createGateway ${registryName} ${gatewayId} RS256 ${publicKeyParam}` + ); + + const deviceId = `nodejs-test-device-iot-${uuid.v4()}`; + await tools.runAsync( + `${cmd} bindDeviceToGateway ${registryName} ${gatewayId} ${deviceId}` + ); + + // relay telemetry on behalf of device + let out = await tools.runAsync( + `${cmd} relayData ${deviceId} ${gatewayId} ${registryName} test ${privateKeyParam} --numMessages=5` + ); + + t.regex(out, new RegExp('Publishing message 5/5')); + t.notRegex(out, new RegExp('Error: Connection refused')); + + await tools.runAsync( + `${cmd} unbindDeviceFromGateway ${registryName} ${gatewayId} ${deviceId}` + ); + await tools.runAsync( + `${helper} deleteDevice ${gatewayId} ${registryName}`, + cwdHelper + ); + await tools.runAsync( + `${helper} deleteDevice ${deviceId} ${registryName}`, + cwdHelper + ); +}); diff --git a/iot/beta-features/gateway/package.json b/iot/beta-features/gateway/package.json new file mode 100644 index 0000000000..383a55faf5 --- /dev/null +++ b/iot/beta-features/gateway/package.json @@ -0,0 +1,34 @@ +{ + "name": "nodejs-docs-samples-iot-manager", + "version": "0.0.1", + "description": "Example of Cloud IoT Core gateways feature", + "main": "manager.js", + "license": "Apache-2.0", + "author": "Google LLC", + "repository": { + "type": "git", + "url": "https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git" + }, + "engines": { + "node": ">=8.0.0" + }, + "scripts": { + "test": "repo-tools test run --cmd ava -- -T 3m --verbose *.test.js" + }, + "dependencies": { + "@google-cloud/pubsub": "0.13.2", + "googleapis": "^32.0.0", + "jsonwebtoken": "^8.3.0", + "mqtt": "2.15.0", + "yargs": "8.0.2" + }, + "devDependencies": { + "@google-cloud/nodejs-repo-tools": "^3.0.0", + "ava": "0.22.0", + "uuid": "3.1.0" + }, + "cloud-repo-tools": { + "requiresKeyFile": true, + "requiresProjectId": true + } +} diff --git a/iot/beta-features/gateway/resources/README.md b/iot/beta-features/gateway/resources/README.md new file mode 100644 index 0000000000..29a1f453ee --- /dev/null +++ b/iot/beta-features/gateway/resources/README.md @@ -0,0 +1,4 @@ +# Test public certificate files + +The certificates in this folder are only provided for testing and should not be +used for registering or connecting your devices. diff --git a/iot/manager/package.json b/iot/manager/package.json index 60033f00bc..128e2fa01f 100644 --- a/iot/manager/package.json +++ b/iot/manager/package.json @@ -4,7 +4,7 @@ "description": "Example of Cloud IoT device administration", "main": "manager.js", "license": "Apache-2.0", - "author": "Google Inc.", + "author": "Google LLC", "repository": { "type": "git", "url": "https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git" @@ -13,7 +13,7 @@ "node": ">=8.0.0" }, "scripts": { - "test": "repo-tools test run --cmd ava -- -T 3m --verbose system-test/*.test.js" + "test": "repo-tools test run --cmd ava -- -T 3m --verbose *.test.js" }, "dependencies": { "@google-cloud/pubsub": "0.21.1", From 1861985ea61f1997af898c6a16823c1cc72d3137 Mon Sep 17 00:00:00 2001 From: Alex Hong Date: Mon, 10 Dec 2018 03:18:50 -0800 Subject: [PATCH 3/4] revert to previous testing command --- iot/manager/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iot/manager/package.json b/iot/manager/package.json index 128e2fa01f..32a6195ad0 100644 --- a/iot/manager/package.json +++ b/iot/manager/package.json @@ -13,7 +13,7 @@ "node": ">=8.0.0" }, "scripts": { - "test": "repo-tools test run --cmd ava -- -T 3m --verbose *.test.js" + "test": "repo-tools test run --cmd ava -- -T 3m --verbose system-test/*.test.js" }, "dependencies": { "@google-cloud/pubsub": "0.21.1", From f18bd416524de2c986d6f4df122d01641b94cf42 Mon Sep 17 00:00:00 2001 From: Alex Hong Date: Mon, 10 Dec 2018 14:57:46 -0800 Subject: [PATCH 4/4] add example usage to readme, fix typos --- iot/beta-features/gateway/README.md | 21 ++- iot/beta-features/gateway/gateway.js | 197 ++++++++++------------ iot/beta-features/gateway/gateway.test.js | 10 +- 3 files changed, 106 insertions(+), 122 deletions(-) diff --git a/iot/beta-features/gateway/README.md b/iot/beta-features/gateway/README.md index 31bcbfe5a0..349b47496b 100644 --- a/iot/beta-features/gateway/README.md +++ b/iot/beta-features/gateway/README.md @@ -2,8 +2,7 @@ # Google Cloud IoT Core NodeJS Gateway sample -This sample app demonstrates sending telemetry data on behalf of device using -the a Cloud IoT Core gateway. +This sample app demonstrates sending telemetry data on behalf of a device using the Cloud IoT Core gateways. # Setup @@ -14,17 +13,27 @@ Run the following command to install the library dependencies for NodeJS: # Running the sample Commands: - relayData Sends data on behalf of a device. + createGateway + listGateways + bindDeviceToGateway + unbindDeviceFromGateway + listDevicesForGateway + + listen Listen for config messages on a gateway and device + relayData Sends data on behalf of a device. Options: --projectId, -p The Project ID to use. Defaults to the value of the GCLOUD_PROJECT or GOOGLE_CLOUD_PROJECT environment variables. [string] - --serviceAccount, -s The path to your service credentials JSON. [string] [default: "/Users/class/creds_cloud.json"] - --help Show help [boolean] + --serviceAccount, -s The path to your service credentials JSON. [string] --cloudRegion, -c [string] [default: "us-central1"] - --data, -d [string] [default: "us-central1"] + --help Show help [boolean] Examples: node hub.js relayData my-device my-registry "test" For more information, see https://cloud.google.com/iot-core/docs + +# Notes + +By default, gateways use the "Association only" method for authentication, which means the device does not have to store its own JWT. For other authentication methods, check [here for more information](https://cloud.google.com/iot/docs/how-tos/gateways/manage-gateways#authentication_methods). \ No newline at end of file diff --git a/iot/beta-features/gateway/gateway.js b/iot/beta-features/gateway/gateway.js index 67ec377983..c6eb602134 100644 --- a/iot/beta-features/gateway/gateway.js +++ b/iot/beta-features/gateway/gateway.js @@ -383,7 +383,6 @@ function attachDevice(deviceId, client) { // const deviceId = 'my-unauth-device'; const attachTopic = `/devices/${deviceId}/attach`; console.log(`Attaching: ${attachTopic}`); - // TODO {'authorization': ''} const attachPayload = '{}'; client.publish(attachTopic, attachPayload, {qos: 1}, err => { if (!err) { @@ -401,7 +400,6 @@ function detachDevice(deviceId, client) { // [START detach_device] const detachTopic = `/devices/${deviceId}/detach`; console.log(`Detaching: ${detachTopic}`); - // TODO {'authorization': ''} const detachPayload = '{}'; client.publish(detachTopic, detachPayload, {qos: 1}, err => { if (!err) { @@ -451,7 +449,6 @@ function listenForConfigMessages( if (!success) { console.log('Client not connected...'); } else { - // TODO: wait for commands console.log('Client connected: Gateway is listening, attaching device'); attachDevice(deviceId, client); @@ -577,7 +574,6 @@ function sendDataFromBoundDevice( privateKeyFile, mqttBridgeHostname, mqttBridgePort, - data, numMessages, tokenExpMins ) { @@ -759,9 +755,9 @@ let argv = require(`yargs`) // eslint-disable-line }, clientDuration: { default: 60000, - description: 'Duration in milliseconds for MQTT client to last', + description: 'Duration in milliseconds for MQTT client to run', requiresArg: true, - type: 'number' + type: 'number', }, cloudRegion: { alias: 'c', @@ -769,12 +765,6 @@ let argv = require(`yargs`) // eslint-disable-line requiresArg: true, type: 'string', }, - data: { - alias: 'd', - default: 'Test data', - requiresArg: true, - type: 'string', - }, deviceId: { description: 'Cloud IoT device ID.', requiresArg: false, @@ -826,81 +816,35 @@ let argv = require(`yargs`) // eslint-disable-line type: 'number', }, }) + .command( - `listen `, - `Listens for configuration changes on a gateway and bound device.`, - { - privateKeyFile: { - demandOption: true, - }, - }, - opts => { - listenForConfigMessages( - opts.gatewayId, - opts.deviceId, - opts.registryId, - opts.projectId, - opts.cloudRegion, - opts.algorithm, - opts.privateKeyFile, - opts.mqttBridgeHostname, - opts.mqttBridgePort, - opts.clientDuration - ); - } - ) - .command( - `listenForErrors `, - `Listens for error messages on a gateway.`, - { - privateKeyFile: { - demandOption: true, - }, - }, + `createGateway `, + `Creates a gateway`, + {}, opts => { - listenForErrorMessages( - opts.gatewayId, - opts.registryId, - opts.projectId, - opts.cloudRegion, - opts.algorithm, - opts.privateKeyFile, - opts.mqttBridgeHostname, - opts.mqttBridgePort, - opts.clientDuration, - opts.deviceId - ); + const cb = function(client) { + createGateway( + client, + opts.projectId, + opts.cloudRegion, + opts.registryId, + opts.gatewayId, + opts.publicKeyFile, + opts.algorithm + ); + }; + getClient(opts.serviceAccount, cb); } ) .command( - `relayData `, - `Sends data on behalf of a bound device.`, - { - numMessages: { - default: 5, - description: 'Number of messages to publish.', - requiresArg: true, - type: 'number', - }, - privateKeyFile: { - demandOption: true, - }, - }, + `listGateways `, + `Lists gateways in a registry.`, + {}, opts => { - sendDataFromBoundDevice( - opts.gatewayId, - opts.deviceId, - opts.registryId, - opts.projectId, - opts.cloudRegion, - opts.algorithm, - opts.privateKeyFile, - opts.mqttBridgeHostname, - opts.mqttBridgePort, - opts.data, - opts.numMessages, - opts.tokenExpMins - ); + const cb = function(client) { + listGateways(client, opts.projectId, opts.cloudRegion, opts.registryId); + }; + getClient(opts.serviceAccount, cb); } ) .command( @@ -922,23 +866,18 @@ let argv = require(`yargs`) // eslint-disable-line } ) .command( - `createGateway `, - `Creates a gateway`, - { - publicKeyFile: { - demandOption: true, - }, - }, + `unbindDeviceFromGateway `, + `Unbinds a device from a gateway`, + {}, opts => { const cb = function(client) { - createGateway( + unbindDeviceFromGateway( client, opts.projectId, opts.cloudRegion, opts.registryId, - opts.gatewayId, - opts.publicKeyFile, - opts.algorithm + opts.deviceId, + opts.gatewayId ); }; getClient(opts.serviceAccount, cb); @@ -962,32 +901,68 @@ let argv = require(`yargs`) // eslint-disable-line } ) .command( - `listGateways `, - `Lists gateways in a registry.`, + `listen `, + `Listens for configuration changes on a gateway and bound device.`, {}, opts => { - const cb = function(client) { - listGateways(client, opts.projectId, opts.cloudRegion, opts.registryId); - }; - getClient(opts.serviceAccount, cb); + listenForConfigMessages( + opts.gatewayId, + opts.deviceId, + opts.registryId, + opts.projectId, + opts.cloudRegion, + opts.algorithm, + opts.privateKeyFile, + opts.mqttBridgeHostname, + opts.mqttBridgePort, + opts.clientDuration + ); } ) .command( - `unbindDeviceFromGateway `, - `Unbinds a device from a gateway`, + `listenForErrors `, + `Listens for error messages on a gateway.`, {}, opts => { - const cb = function(client) { - unbindDeviceFromGateway( - client, - opts.projectId, - opts.cloudRegion, - opts.registryId, - opts.deviceId, - opts.gatewayId - ); - }; - getClient(opts.serviceAccount, cb); + listenForErrorMessages( + opts.gatewayId, + opts.registryId, + opts.projectId, + opts.cloudRegion, + opts.algorithm, + opts.privateKeyFile, + opts.mqttBridgeHostname, + opts.mqttBridgePort, + opts.clientDuration, + opts.deviceId + ); + } + ) + .command( + `relayData `, + `Sends data on behalf of a bound device.`, + { + numMessages: { + default: 5, + description: 'Number of messages to publish.', + requiresArg: true, + type: 'number', + }, + }, + opts => { + sendDataFromBoundDevice( + opts.gatewayId, + opts.deviceId, + opts.registryId, + opts.projectId, + opts.cloudRegion, + opts.algorithm, + opts.privateKeyFile, + opts.mqttBridgeHostname, + opts.mqttBridgePort, + opts.numMessages, + opts.tokenExpMins + ); } ) .example(`node $0 relayData my-device my-registry "test"`) diff --git a/iot/beta-features/gateway/gateway.test.js b/iot/beta-features/gateway/gateway.test.js index 7a2e1ed616..4af1383876 100644 --- a/iot/beta-features/gateway/gateway.test.js +++ b/iot/beta-features/gateway/gateway.test.js @@ -28,8 +28,8 @@ const registryName = `nodejs-test-registry-iot-${uuid.v4()}`; const helper = `node manager.js`; const cwdHelper = path.join(__dirname, `../../manager`); const installDeps = `npm install`; -const publicKeyParam = `--publicKeyFile=./resources/rsa_cert.pem`; -const privateKeyParam = `--privateKeyFile=./resources/rsa_private.pem`; +const publicKeyParam = `./resources/rsa_cert.pem`; +const privateKeyParam = `./resources/rsa_private.pem`; const pubsub = PubSub(); @@ -97,7 +97,7 @@ test(`should bind existing device to gateway`, async t => { // create device const deviceId = `nodejs-test-device-iot-${uuid.v4()}`; await tools.runAsync( - `${helper} createRsa256Device ${deviceId} ${registryName} ./resources/rsa_cert.pem`, + `${helper} createRsa256Device ${deviceId} ${registryName} ${publicKeyParam}`, cwdHelper ); @@ -232,7 +232,7 @@ test(`should listen for error topic messages`, async t => { // create a device but don't associate it with the gateway const deviceId = `nodejs-test-device-iot-${uuid.v4()}`; await tools.runAsync( - `${helper} createRsa256Device ${deviceId} ${registryName} ./resources/rsa_cert.pem`, + `${helper} createRsa256Device ${deviceId} ${registryName} ${publicKeyParam}`, cwdHelper ); @@ -273,7 +273,7 @@ test(`should send data from bound device`, async t => { // relay telemetry on behalf of device let out = await tools.runAsync( - `${cmd} relayData ${deviceId} ${gatewayId} ${registryName} test ${privateKeyParam} --numMessages=5` + `${cmd} relayData ${deviceId} ${gatewayId} ${registryName} ${privateKeyParam} --numMessages=5` ); t.regex(out, new RegExp('Publishing message 5/5'));