Pełne szyfrowanie

Omówienie HPKE

Hybrydowe szyfrowanie kluczem publicznym (HPKE) to mechanizm kryptograficzny używany do szyfrowania ładunku za pomocą klucza publicznego. Jest to „hybrydowe” szyfrowanie, ponieważ sam ładunek jest szyfrowany kluczem symetrycznym, a HPKE wyprowadza ten klucz symetryczny za pomocą wymiany kluczy Diffiego-Hellmana.

Tryby HPKE

  • Podstawowy: najczęściej używany tryb.
  • Uwierzytelnianie: do uwierzytelniania używa klucza prywatnego nadawcy.
  • PSK:do uwierzytelniania używa wstępnie udostępnionego klucza o wysokiej entropii.
  • AuthPSK: łączy klucz prywatny nadawcy i wstępnie udostępniony klucz o wysokiej entropii na potrzeby uwierzytelniania.

Interakcja w trybie podstawowym (urządzenie i organ wydający)

Poniżej przedstawiamy ogólny przepływ danych w scenariuszu, w którym urządzenie chce wysłać dane wrażliwe do instytucji wydającej.

Krok 1. Generowanie i wymiana kluczy

  • Urząd wydający tworzy parę kluczy szyfrowania: IE₍ₚₖ, ₛₖ₎, gdzie ₚₖ to klucz publiczny, a ₛₖ to klucz prywatny.
  • Urząd wydający wysyła klucz publiczny (IEₚₖ) do urządzenia i udostępnia go.

Krok 2. Szyfrowanie i wysyłanie

Urządzenie wykonuje Hybrid-Encrypt(Data, IEₚₖ, Context).

  • Urządzenie generuje tymczasową parę kluczy asymetrycznych do szyfrowania: ₍Eₚₖ, Eₛₖ₎.
  • Wyprowadza symetryczny klucz AES, zwany tajnym kluczem udostępnionym (SS), za pomocą formuły: SS = ExtractAndExpand(Diffie-Hellman(IEₚₖ, Eₛₖ), _Context).
  • Urządzenie szyfruje dane za pomocą tego klucza wspólnego, aby uzyskać wartość encData.
  • Przekazuje { encData, Eₚₖ } i wysyła je do organu wydającego.

Krok 3. Odszyfrowanie

Instytucja wydająca ma obecnie IE₍ₚₖ, ₛₖ₎ i otrzymała { encData, Eₚₖ }. Wykonuje Hybrid-Decrypt(encData, Eₚₖ, IEₛₖ, Context).

  • Wyprowadza symetryczny klucz AES (tajny klucz wspólny, SS) za pomocą wzoru: SS = ExtractAndExpand(Diffie-Hellman(IEₛₖ, Eₚₖ), _Context).
  • Odszyfrowuje encData za pomocą SS.

Terminologia

Hasło Definicja i szczegóły
DIₚₖ Credential Key Certificate Chain (Device Identity Certs): łańcuch certyfikatów X.509 dla klucza CredentialKey, który identyfikuje dane logowania w urzędzie wydającym.
  • Zawiera rozszerzenie atestacji Android Keystore opisujące klucz i jego sprzęt zabezpieczający.
  • Służy do potwierdzania własności danych logowania.
  • Wystawca MUSI dokładnie sprawdzić ten łańcuch certyfikatów (np. zweryfikować, czy certyfikat główny jest dobrze znany, czy występuje Tag::IDENTITY_CREDENTIAL_KEY, czy występuje wyzwanie, czy Tag::ATTESTATION_APPLICATION_ID jest prawidłowy, czy włączone jest zweryfikowane uruchamianie oraz czy podpis i stan odwołania są prawidłowe).
Aₚₖ Klucze uwierzytelniania: dynamiczne klucze uwierzytelniania X.509 wymagające certyfikacji, z których każdy jest podpisany przez CredentialKey.
  • Wystawca generuje statyczne dane autoryzacyjne dla każdego klucza, wysyła je na urządzenie, a urządzenie zapisuje je za pomocą interfejsu storeStaticAuthenticationData.
  • Ten klucz to ładunek, który zostanie zaszyfrowany, a nie użyty bezpośrednio do szyfrowania E2EE.
  • Pola X.509, które nie są opcjonalne, to: version (INTEGER 2), serialNumber (INTEGER 1), signature (ECDSA), subject (CN ustawione na „Android Identity Credential Authentication Key”), issuer (CN ustawione na „Android Identity Credential Key”), validity (bieżący czas do 365 dni w przyszłości) i subjectPublicKeyInfo (musi zawierać poświadczony klucz publiczny).
IE₍ₛₖ,ₚₖ₎ Para kluczy szyfrowania wydawcy: klucz asymetryczny wygenerowany przez wydawcę. Urządzenie używa tego klucza do wykonywania szyfrowania hybrydowego na potrzeby wystawcy.
II₍ₛₖ,ₚₖ₎ Para kluczy tożsamości wystawcy: klucz asymetryczny wygenerowany przez wystawcę. Urządzenie używa tego klucza do weryfikacji tożsamości wydawcy.
DE₍ₛₖ,ₚₖ₎ Para kluczy szyfrowania urządzenia: tymczasowy klucz asymetryczny generowany przez urządzenie na potrzeby każdego żądania. Wystawca używa tego klucza do szyfrowania hybrydowego na urządzeniu.
FE₍ₛₖ,ₚₖ₎ Klucz szyfrowania pola: efemeryczny klucz asymetryczny generowany dla każdego pola podczas szyfrowania hybrydowego.

Szyfrowanie E2EE w interfejsie Google Digital Credential Provisioning API

Krok 1. Uzyskaj klucz tożsamości wystawcy i klucz szyfrowania

  • Punkty końcowe interfejsu API: /getIdentityKey, /getHybridEncryptionKey.
  • Zwroty: IIₚₖ, IEₚₖ.

Krok 2. Uzyskaj jednorazowy kod rejestracji urządzenia

  • Wygeneruj identyfikator referencyjny urządzenia (deviceReferenceId).
  • Punkt końcowy API: wywołaj /getDeviceRegistrationNonce(deviceReferenceId).
  • Zwroty: nonce.

Krok 3. Zarejestruj urządzenie

  • Skonfiguruj dane logowania tożsamości na Androidzie.
  • Wywołaj funkcję IC.getCredentialKeyCertificateChain(nonce), która zwraca DIₚₖ z osadzonym parametrem nonce.
  • Punkt końcowy API: wywołaj /registerDevice(deviceReferenceId, DIₚₖ).
  • Urząd wydający musi dokładnie sprawdzić ten łańcuch certyfikatów, aby upewnić się, że certyfikat główny jest dobrze znany, wyzwanie jest obecne, ATTESTATION_APPLICATION_ID pasuje do oczekiwanej aplikacji, weryfikowane uruchamianie jest włączone, a podpisy lub odwołania są prawidłowe.
  • Zwroty: ack.

Krok 4a. Wyślij prośbę o weryfikację

  • W przypadku każdego pola:
    • Wykonaj Hybrid-Encrypt(Data, IEₚₖ, Context=FieldName), aby wygenerować encDataFEₚₖ.
    • Zadzwoń pod numer IC.proveOwnership(SHA-256(Data + IEₚₖ)), aby uzyskać sigData (strukturę danych COSE_Sign1 podpisaną przez CredentialKey, z ładunkiem ustawionym na ProofofOwnership).
  • Punkt końcowy API: wywołaj /proofUser([encData, sigData, FEₚₖ]).
  • Organ wydający weryfikuje sigData za pomocą DIₚₖ.
  • Organ wydający wykonuje Hybrid-Decrypt(encData, FEₚₖ, IEₛₖ, Context=FieldName), aby wygenerować Data.
  • Zwroty: ack.

Krok 4b. Aktualizacja stanu korekty

  • Powiadom Google o aktualizacji stanu korekty za pomocą znaków deviceReferenceIdproofingId.
  • Punkt końcowy API: wywołaj /notifyProofingStatusUpdateAvailable(...).
  • Serwery Google pobierają stan weryfikacji od wystawcy, wywołując /getProofingStatus(deviceReferenceId, proofingId).

Krok 5. Skonfiguruj dane logowania

  • Wywołaj IC.proveOwnership(SHA-256(DEₚₖ)), aby uzyskać sigDEₚₖ (struktura COSE_Sign1 podpisana przez CredentialKey/DIₛₖ z ładunkiem ProofofOwnership).
  • Punkt końcowy API: wyślij deviceReferenceId, proofingId, credentialIdsigDEₚₖ do wydawcy za pomocą /provisionCredential(dRId, pId, cId, DEₚₖ, sigDEₚₖ).
  • Po stronie wydawcy:
    • Zweryfikuj sigDEₚₖ za pomocą DIₚₖ.
    • zaszyfrować dane logowania (PersonalizationData + AccessControlProfiles);
    • Wykonaj Hybrid-Encrypt(Cred, DEₚₖ, Context=FieldName), aby wygenerować encCredFEₚₖ.
    • Utwórz sigCred, podpisując COSE_Sign1 SHA-256(Cred + DEₚₖ) za pomocą IIₛₖ.
    • Zwróć encCred, sigCred, FEₚₖ.
  • Strona urządzenia:
    • Zweryfikuj sigCred za pomocą IIₚₖ.
    • Wykonaj Hybrid-Decrypt(encCred, FEₚₖ, DEₛₖ, Context=FieldName), aby wyodrębnić Cred.
    • Zadzwoń na WC.personalize(Cred), aby uzyskać sigCredReceipt (COSE_Sign1 podpisany przez CredentialKey, ładunek ProofOfProvisioning).
    • Wykonaj Hybrid-Encrypt(sigCredReceipt, DEₛₖ, Context=FieldName), generując encReceiptFE1ₚₖ.
    • Zadzwoń na IC.proveOwnership(SHA-256(encReceipt + IEₚₖ)), aby uzyskać sigReceipt (COSE_Sign1 podpisany przez CredentialKey, ładunek ProofofOwnership).
    • Wygeneruj klucze autoryzacji [Aₚₖ].

Krok 6. Wygeneruj MSO i StaticAuthData

  • Strona urządzenia:
    • Dla każdego klucza autoryzacji: wykonaj Hybrid-Encrypt(AuthKey, IEₚₖ, Context=FieldName), aby wygenerować encAuthKeyFEₚₖ.
    • Zadzwoń pod numer IC.proveOwnership(SHA-256(AuthKey + IEₚₖ)), aby uzyskać sigAuthKey.
    • Punkt końcowy API: wywołaj /provisionMSOs(.., encReceipt, sigReceipt, [encAuthKey, sigAuthKey, FEₚₖ], DEₚₖ, sigDEₚₖ).
  • Po stronie wydawcy:
    • Sprawdź, czy wartości sigReceiptsigDEₚₖ są zgodne z wartością DIₚₖ, aby zweryfikować paragon.
    • Dla każdego [encAuthKey, sigAuthKey, FEₚₖ]: wykonaj Hybrid-Decrypt(encAuthKey, FEₚₖ, IEₛₖ, Context=FieldName), aby wyodrębnić AuthKey.
    • Wygeneruj MSO (w tym AuthKey) i staticAuthData (SAD), w tym digestIdMapping i issuerAuth.
    • Wykonaj Hybrid-Encrypt(SAD, DEₚₖ, Context=FieldName), aby wygenerować encSADFEₚₖ.
    • Podpisz za pomocą COSE_Sign1 SHA-256(SAD + DEₚₖ) z IIₛₖ, aby uzyskać sigSAD.
    • Zwrot: [encSAD, sigSAD, FEₚₖ].
  • Urządzenie (ostateczna):
    • W przypadku każdego zwróconego encSAD, sigSAD, FEₚₖ sprawdź sigSAD za pomocą IIₚₖ.
    • Wykonaj Hybrid-Decrypt(encSAD, FEₚₖ, DEₛₖ, Context=FieldName), aby wyodrębnić SAD.
    • Zadzwoń pod numer storeStaticAuthenticationData, używając numeru SAD, aby dokończyć ten proces.

Wymagania dotyczące rotacji

Klucz tożsamości wydawcy powinien być poddawany rotacji raz w roku. W okresie rotacji wydawca powinien hostować stary i nowy klucz, a urządzenie będzie ufać obu tym kluczom. Gdy wystawca całkowicie przejdzie na używanie nowego klucza tożsamości wystawcy, powinien przestać hostować stary klucz, a urządzenie przestanie mu ufać.

Klucz szyfrowania hybrydowego wydawcy powinien być poddawany rotacji co 3 miesiące. W okresie rotacji wystawca powinien zacząć hostować tylko nowy klucz, a urządzenie zacznie szyfrować dane za pomocą nowego klucza. Aby uniknąć przestojów, wystawca musi przez rozsądny okres czasu obsługiwać odszyfrowywanie zarówno za pomocą starego, jak i nowego klucza.

Wartości AAD

W przypadku AAD użyj tych wartości kontekstowych.

Pola Wartości kontekstowe
preAuthorizationCode PreAuthorizationCode

Aby uzyskać wartości AAD dla innych typów dowodów, skontaktuj się z przedstawicielem Google.

Wektory testowe pełnego szyfrowania cyfrowych dokumentów tożsamości

Wektory testowe do kompleksowego szyfrowania to zestaw predefiniowanych wiadomości i ich zaszyfrowanych wersji, które służą do testowania poprawności algorytmu szyfrowania.

Parametry szyfrowania HPKE:

  KEM = DHKEM(P-256, HKDF-SHA256), id = 0x0010
  KDF = HKDF-SHA256, id = 0x0001
  AEAD = AES-256-GCM, id = 0x0002
  • Dodatkowe dane powiązane (AAD) są danymi wejściowymi dla HPKE CtxInfo. W przypadku szyfrowania AES (symetrycznego) AAD ma wartość NULL (pustą).
  • Dane binarne w strukturach JSON są zakodowane w formacie Base64, a wartości pośrednie w tym dokumencie są zakodowane w formacie szesnastkowym.
  • Format podpisu w tej dokumentacji:
    • Urządzenie → wydawca, wydawca → urządzenie: COSE_Sign1

Klient → wystawca, wystawca → klient

Przykład komunikacji w obu kierunkach.

Przykładowe zaszyfrowane pole żądania

Plaintext = "Hello, world!", associated-data = "field1"

{
  "field1": {
    "encryptedValue": "yGFWT9MkgV6/IZfYUZjqGEf3k2M/HQhz9XnKWyI\u003d",
    "encapsulatedKey": "BOpBC2LGh1RWk99iIm6ISsaPbtrNnu9hIgHeby5khXY6PG+ZmDOYmorEUne7uzhDmD6JCVYyME1+A8ueJ0CZvAI\u003d",
    "signature": "hEOhASagWE+EcFByb29mT2ZPd25lcnNoaXB4GG9yZy5pc28uMTgwMTMtNS4yMDE5Lm1kbFggTOsHXzsgDgh/2chekltve8rJsFFb6DTtBjY98H58gjb0WEBUnwNT3gvbavE8QoaAKaELqF7JKqh0+ivPisQg6RerTmx8Zsk/tCjW/y1cxhGKatl2EjASemns67r1/lZumEqZ",
    "recipientKeyId": "4D7E5D8B9460810A"
  }
}

Szczegółowe informacje:

>> plaintext = "Hello, world!"
48656C6C6F2C20776F726C6421

>> associated-data = "field1"
6669656C6431

## AES key = 
2831F07355FEAB3A8654EADEEC2E2D497B9FD3C76CB8B5E776DB03583F302332

## AES initialization vector = 
64620929032C85B352156528

## AES associated data (empty) = 

>> encrypted-value = HPKE(plaintext, associated-data)
C861564FD324815EBF2197D85198EA1847F793633F1D0873F579CA5B22

>> encapsulated-key (ephemeral) =
04EA410B62C687545693DF62226E884AC68F6EDACD9EEF612201DE6F2E648576
3A3C6F999833989A8AC45277BBBB3843983E89095632304D7E03CB9E274099BC
02

>> tbs-data = plaintext || issuer-encryption-key
48656C6C6F2C20776F726C6421044F1FC726AFFFC32EAA1275B5B49D67018ADE
7D8599DE53FE049996C0EC45D26EA3375BF467B631CF8AB0F284E4B628E287C8
99107465529DCA93DCF5F7A7EA5F

>> sha-256(tbs-data)
4CEB075F3B200E087FD9C85E925B6F7BCAC9B0515BE834ED06363DF07E7C8236

>> proof-of-ownership (cbor array)
847050726F6F664F664F776E65727368697078186F72672E69736F2E31383031
332D352E323031392E6D646C58204CEB075F3B200E087FD9C85E925B6F7BCAC9
B0515BE834ED06363DF07E7C8236F4

>> signature (cose_sign1)
8443A10126A0584F847050726F6F664F664F776E65727368697078186F72672E
69736F2E31383031332D352E323031392E6D646C58204CEB075F3B200E087FD9
C85E925B6F7BCAC9B0515BE834ED06363DF07E7C8236F45840549F0353DE0BDB
6AF13C42868029A10BA85EC92AA874FA2BCF8AC420E917AB4E6C7C66C93FB428
D6FF2D5CC6118A6AD9761230127A69ECEBBAF5FE566E984A99

Przykładowy klucz szyfrowania wydawcy lub urządzenia

{
  "deviceEncryptionKey": {
    "publicKey": "BP5vgzZ+UTozzb6cmaZ8tkof2nh2Q2oHVAsggvc8V8SR6C9wWU6W9JEq0AmsGbou3jYw4BLftJP2XQeCB3uD/to\u003d",
    "signature": "hEOhASagWE+EcFByb29mT2ZPd25lcnNoaXB4GG9yZy5pc28uMTgwMTMtNS4yMDE5Lm1kbFgg7641tE2UhuT5Tw9p1u9yEDpyYzDf1Jf9m//mIQfd4Kf0WEBB7PvHbfWozCYlFUqMJ6x+QWzoUU/OT10F1J1zoB8MTELPqfC9acF6IX5oMmsgLn2RtPS7QfylRqEAfG0FyYli",
    "keyIdentifier": "F29BA6298BC93156D2D50EA7E2233FC4"
  }
}

Szczegółowe informacje:

>> ec-point
04FE6F83367E513A33CDBE9C99A67CB64A1FDA7876436A07540B2082F73C57C4
91E82F70594E96F4912AD009AC19BA2EDE3630E012DFB493F65D0782077B83FE
DA

>> sha-256(ec-point)
EFAE35B44D9486E4F94F0F69D6EF72103A726330DFD497FD9BFFE62107DDE0A7

>> proof-of-ownership (cbor array)
847050726F6F664F664F776E65727368697078186F72672E69736F2E31383031
332D352E323031392E6D646C5820EFAE35B44D9486E4F94F0F69D6EF72103A72
6330DFD497FD9BFFE62107DDE0A7F4

>> signature (cose_sign1)
8443A10126A0584F847050726F6F664F664F776E65727368697078186F72672E
69736F2E31383031332D352E323031392E6D646C5820EFAE35B44D9486E4F94F
0F69D6EF72103A726330DFD497FD9BFFE62107DDE0A7F4584041ECFBC76DF5A8
CC2625154A8C27AC7E416CE8514FCE4F5D05D49D73A01F0C4C42CFA9F0BD69C1
7A217E68326B202E7D91B4F4BB41FCA546A1007C6D05C98962

Testowanie kluczy i certyfikatów

Podczas implementacji możesz korzystać z tych kluczy testowych.

Klucz tożsamości wystawcy testowego (podpis)

  • Klucz prywatny

    -----BEGIN PRIVATE KEY-----
    MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCBSDJqogkjkqD7O8mX5
    FcUvwOxFp0CxPOGnMD8BfSbcyw==
    -----END PRIVATE KEY-----

  • Certyfikat klucza publicznego

    -----BEGIN CERTIFICATE-----
    MIIBkDCCATegAwIBAgIIIi7oI6UIMEYwCgYIKoZIzj0EAwIwNzE1MDMGA1UEAxMs
    Ly9leHBlcmltZW50YWwvdXNlcnMvaWdhcmlldi9jcnlwdG86U2lnbkNlcnQwHhcN
    MjIxMjEyMjAyNDA0WhcNMjMxMjEyMjAyNDA0WjBSMQ8wDQYDVQQLEwZXYWxsZXQx
    DzANBgNVBAoTBkdvb2dsZTEuMCwGA1UEAxMlVEVTVCBEQVRBIElzc3VlciBJZGVu
    dGl0eSAoU2lnbmF0dXJlKTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHV9uYlT
    wGV3UB+SM62fXcW6QzFfSoxq2gU34xG+XVMjxk9JDP9UTE34zX72WIfZ9nqRN9y/
    SsbSxw5WrSQdGY2jEjAQMA4GA1UdDwEB/wQEAwIHgDAKBggqhkjOPQQDAgNHADBE
    AiBnMgsyJhdfelqpOFvT4H63dWSrNPxyrKEdxTwbYMfCKQIgOh2n2gCETH07tjxR
    l9HQfUcb6vqQY4EoPz2O0wNs6yc=
    -----END CERTIFICATE-----

Testowy klucz szyfrowania wydawcy

  • Klucz prywatny

    -----BEGIN PRIVATE KEY-----
    MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCDZMUnwmygUdKXSujXS
    ye7YbVnk1Zy/qwnQtzlZs3pQFQ==
    -----END PRIVATE KEY-----

  • Certyfikat klucza publicznego

    -----BEGIN CERTIFICATE-----
    MIIBpjCCAUygAwIBAgIIIVwLEOrrzm0wCgYIKoZIzj0EAwIwNzE1MDMGA1UEAxMs
    Ly9leHBlcmltZW50YWwvdXNlcnMvaWdhcmlldi9jcnlwdG86U2lnbkNlcnQwHhcN
    MjIxMjIyMjA1NzIzWhcNMjMxMjIyMjA1NzIzWjBIMQ8wDQYDVQQLEwZXYWxsZXQx
    DzANBgNVBAoTBkdvb2dsZTEkMCIGA1UEAxMbVEVTVCBEQVRBIElzc3VlciBFbmNy
    eXB0aW9uMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETx/HJq//wy6qEnW1tJ1n
    AYrefYWZ3lP+BJmWwOxF0m6jN1v0Z7Yxz4qw8oTktijih8iZEHRlUp3Kk9z196fq
    X6MxMC8wDgYDVR0PAQH/BAQDAgMYMB0GA1UdDgQWBBQKFb7K4eZjtp70DLoCHWe7
    v/toXzAKBggqhkjOPQQDAgNIADBFAiEAwN1gOwiSx3999Zxc980eKv3p2H8kA4J6
    9aWH6jiVaGMCIA7lLkebHFhD0fItGqXv1f5fwiMBV0605KZFh5+RBj/W
    -----END CERTIFICATE-----

Klucz tożsamości urządzenia (podpis), zwany też kluczem dostępu

  • Łańcuch certyfikatów klucza publicznego (X.509)
    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

Więcej informacji znajdziesz w dokumentacji dotyczącej atestowania kluczy na Androidzie.

Klucz szyfrowania urządzenia

  • Klucz prywatny

    -----BEGIN PRIVATE KEY-----
    MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCBJY8n7A1v+thMM63np
    m0wr+rAoMFEYmMZ+mWzBIj2CiQ==
    -----END PRIVATE KEY-----

  • Certyfikat klucza publicznego

    -----BEGIN CERTIFICATE-----
    MIIBhzCCAS2gAwIBAgIIAyJ+NkzueMUwCgYIKoZIzj0EAwIwNzE1MDMGA1UEAxMs
    Ly9leHBlcmltZW50YWwvdXNlcnMvaWdhcmlldi9jcnlwdG86U2lnbkNlcnQwHhcN
    MjMwMTA5MjMwOTIwWhcNMjQwMTA5MjMwOTIwWjBIMQ8wDQYDVQQLEwZXYWxsZXQx
    DzANBgNVBAoTBkdvb2dsZTEkMCIGA1UEAxMbVEVTVCBEQVRBIERldmljZSBFbmNy
    eXB0aW9uMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/m+DNn5ROjPNvpyZpny2
    Sh/aeHZDagdUCyCC9zxXxJHoL3BZTpb0kSrQCawZui7eNjDgEt+0k/ZdB4IHe4P+
    2qMSMBAwDgYDVR0PAQH/BAQDAgMYMAoGCCqGSM49BAMCA0gAMEUCIQD9syewRhvK
    KcyaM7fLwuuCidpiIVd/CZxFCLOo9adCPAIgNd3FMcT710KtYptJBZQ/i7N+C7G5
    pLbHmAUoFwNuB2E=
    -----END CERTIFICATE-----