For AI agents: the complete documentation index is available at https://docs.ovhcloud.com/pl/llms.txt, the full documentation bundle is available at https://docs.ovhcloud.com/pl/llms-full.txt, and this page is available as Markdown at https://docs.ovhcloud.com/pl/guides/manage-and-operate/kms/import-export-keys-byok.md.
Przejdź do treści

Import i eksport kluczy w OVHcloud KMS za pomocą BYOK

Pokaż jako Markdown

Dowiedz się, jak bezpiecznie importować i eksportować zaszyfrowany materiał klucza w OVHcloud KMS przy użyciu asymetrycznego opakowywania kluczy RSA (BYOK)

Wprowadzenie

Bring Your Own Key (BYOK) umożliwia import i eksport materiału kryptograficznego klucza w OVHcloud Key Management Service (KMS) bez przesyłania go w postaci jawnej. Para kluczy transportowych RSA chroni materiał w trakcie przesyłania: klucz publiczny go opakowuje, a tylko posiadacz klucza prywatnego może go rozpakować.

Ten przewodnik wyjaśnia, jak zaimportować i wyeksportować klucz w OVHcloud KMS przy użyciu asymetrycznego opakowywania kluczy RSA (BYOK).

Info

BYOK przez KMIP nie jest jeszcze dostępne. Ten przewodnik obejmuje wyłącznie regionalne API REST, CLI OKMS oraz SDK Go.

Klucze z poziomem ochrony HSM podlegają dodatkowym regułom, zarówno jako klucze transportowe, jak i jako importowany lub eksportowany klucz. Zobacz Użycie BYOK z kluczami HSM.

Wymagania początkowe

W praktyce

Zrozumienie ceremonii opakowywania RSA

Przepływ importu klucza BYOK RSA ze źródła do docelowego KMS

Ceremonia obejmuje dwa środowiska i operatora:

  • Miejsce docelowe (Dst): Twoja domena OKMS, w której zostanie przechowywany zaimportowany klucz.
  • Źródło (Src): system, który obecnie przechowuje materiał klucza (inny KMS, aplikacja lub narzędzie takie jak OpenSSL).
  • Operator: podmiot posiadający uprawnienia dostępu zarówno do domeny OKMS, jak i do źródła klucza do zaimportowania. Może to być osoba korzystająca z CLI OKMS lub usługa działająca poprzez API.
  1. Wygeneruj parę kluczy transportowych RSA w OVHcloud KMS z operacjami wrapKey i unwrapKey.
  2. Wyeksportuj publiczny klucz transportowy z OVHcloud KMS.
  3. Zaimportuj publiczny klucz transportowy do środowiska źródłowego.
  4. Po stronie źródła wyeksportuj materiał klucza opakowany (zaszyfrowany) kluczem transportowym, używając RSA-OAEP lub RSA-OAEP-256.
  5. Po stronie miejsca docelowego zaimportuj opakowany klucz za pomocą POST /api/{okmsId}/v1/servicekey i ładunku wrappedKeys. KMS rozpakowuje ciphertext prywatnym kluczem transportowym i zapisuje wynikowy klucz serwisowy.

Klucze zaimportowane w ten sposób mają never_extractable ustawione na false, ponieważ materiał istniał poza KMS przed importem. Aby później wyodrębnić klucz w formie opakowanej, zaimportuj go z extractable ustawionym na true (nie można tego włączyć później) i postępuj zgodnie z sekcją Eksport opakowanego klucza. Pełną listę atrybutów znajdziesz w sekcji Atrybuty wrażliwości kluczy serwisowych.

Info

Aby wykonać czynności z tego przewodnika, potrzebujesz dwóch wartości swojej domeny OKMS: jej regionalnego endpointu oraz okmsId. Wywołania API REST zawierają obie w adresie URL, natomiast CLI OKMS i SDK Go odczytują je ze swojej konfiguracji. Obie są zwracane przez następujące wywołanie API:

GET/okms/resource

Są również widoczne w zakładce Informacje ogólne w .

Tip

Preferuj tę ceremonię zamiast importu klucza w postaci jawnej, gdy klucz musi pozostać zaufany podczas przesyłania.

Konfiguracja IAM dla BYOK

Zastosuj politykę do zasobu swojej domeny OKMS. Jego URN jest wyświetlany w zakładce Informacje ogólne w . Zastąp <identity_urn> i <okms_urn> swoimi wartościami. Utwórz polityki za pośrednictwem Panelu klienta OVHcloud lub API OVHcloud.

Import BYOK — odczyt, tworzenie lub import kluczy serwisowych oraz rozpakowywanie za pomocą klucza transportowego:

{
  "name": "okms-byok-import",
  "description": "Import wrapped keys into an OKMS domain using RSA BYOK",
  "identities": ["<identity_urn>"],
  "resources": [{ "urn": "<okms_urn>" }],
  "action": [
    "okms:apikms:serviceKey/get",
    "okms:apikms:serviceKey/create",
    "okms:apikms:serviceKey/unwrapKey",
    "okms:apikms:serviceKey/import"
  ]
}

Eksport BYOK — import publicznego klucza transportowego, aktualizacja możliwości wyodrębnienia oraz opakowanie klucza do eksportu:

{
  "name": "okms-byok-export",
  "description": "Export wrapped keys from an OKMS domain using RSA BYOK",
  "identities": ["<identity_urn>"],
  "resources": [{ "urn": "<okms_urn>" }],
  "action": [
    "okms:apikms:serviceKey/get",
    "okms:apikms:serviceKey/create",
    "okms:apikms:serviceKey/import",
    "okms:apikms:serviceKey/update",
    "okms:apikms:serviceKey/wrapKey"
  ]
}
Info

W przypadku importu serviceKey/unwrapKey musi być dozwolone na kluczu transportowym RSA wskazanym przez wrappingKeyId. W przypadku eksportu najpierw zaimportuj publiczny klucz transportowy miejsca docelowego (create / import), następnie zezwól na serviceKey/wrapKey na tym kluczu transportowym oraz serviceKey/get na eksportowanym kluczu. serviceKey/update jest wymagane, aby ustawić extractable na false po eksporcie.

Utworzenie klucza transportowego RSA w docelowym KMS

Utwórz klucz RSA przeznaczony do opakowywania. Na potrzeby ceremonii importu ustaw na tym kluczu zarówno wrapKey, jak i unwrapKey; wzajemnie wykluczają się one z sign i verify.

Obsługiwane rozmiary kluczy RSA: 2048, 3072 lub 4096 bitów.

Info

SOFTWARE to domyślny poziom ochrony, więc nie musisz go określać.

API REST
CLI OKMS
SDK Go
curl -X POST "https://<region>.okms.ovh.net/api/<okmsId>/v1/servicekey" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "byok-transport-rsa",
    "type": "RSA",
    "size": 2048,
    "operations": ["wrapKey", "unwrapKey"]
  }'

Zapisz zwrócone id klucza — potrzebujesz go jako wrappingKeyId podczas importu.

Pobranie publicznego klucza transportowego

Wyeksportuj publiczną część klucza transportowego i przekaż ją środowisku źródłowemu. Nigdy nie udostępniaj klucza prywatnego — pozostaje on wewnątrz docelowego KMS.

API REST
CLI OKMS
SDK Go
curl -X GET "https://<region>.okms.ovh.net/api/<okmsId>/v1/servicekey/<transport-key-id>?format=jwk" \
  -H "Authorization: Bearer <token>"

Odpowiedź zawiera materiał klucza publicznego w tablicy keys (JWK).

Opakowanie materiału klucza źródłowego

W środowisku źródłowym zaszyfruj materiał klucza publicznym kluczem RSA miejsca docelowego.

Ten krok odbywa się poza OVHcloud KMS: w środowisku źródłowym użyj biblioteki JOSE.

Obsługiwane algorytmy opakowywania (RFC 7518):

AlgorytmOpis
RSA-OAEPRSAES-OAEP z SHA-1
RSA-OAEP-256RSAES-OAEP z SHA-256 (zalecane)

keyFormatType opisuje format jawnego materiału klucza przed opakowaniem i po rozpakowaniu. Ciphertext jest zawsze ciągiem JWE Compact Serialization (algorytm opakowywania jest przenoszony w nagłówku JWE).

keyFormatTypeTypowe zastosowanie
RAWWewnętrzny format klucza OVHcloud KMS dla kluczy SOFTWARE lub surowe bajty symetrycznego klucza AES przy eksporcie kluczy HSM (AES to jedyny typ klucza, który można wyeksportować z HSM)
JWKDokument JSON Web Key (RFC 7517)
PKCS1Materiał klucza RSA w kodowaniu PKCS#1
PKCS8Materiał klucza prywatnego w kodowaniu PKCS#8

Po opakowaniu publicznym kluczem miejsca docelowego prześlij uzyskaną wartość ciphertext w formacie JWE Compact Serialization w żądaniu importu. Przykład w Go dla tego kroku opakowywania znajdziesz w sekcji Przykład end-to-end w Go.

Import opakowanego klucza

Wywołaj POST /api/{okmsId}/v1/servicekey z tablicą wrappedKeys zamiast jawnych keys.

MetodaŚcieżkaOpis
POST/api/{okmsId}/v1/servicekeyUtworzenie, import lub import opakowany klucza serwisowego
PoleWymaganeOpis
nameTakNazwa wyświetlana zaimportowanego klucza (1–32 znaki)
wrappedKeysTak (dla BYOK)Tablica bloków opakowanych kluczy
operationsTakZamierzone zastosowania zaimportowanego klucza
extractableNieCzy klucz będzie można później wyeksportować (false domyślnie; klucze wyłącznie publiczne domyślnie mają true)
protectionLevelNiePoziom ochrony klucza: SOFTWARE (domyślnie) lub HSM. W przypadku importu do HSM zobacz Import klucza do HSM.
type / size / curveNie (z wyjątkiem type w przypadku importu do HSM)Wnioskowane z odszyfrowanego materiału, gdy obecne jest wrappedKeys. W przypadku importu do HSM parametr type jest wymagany (zobacz Import klucza do HSM).

Każdy wpis wrappedKeys:

PoleWymaganeOpis
keyFormatTypeTak (z wyjątkiem importu do HSM, gdzie należy go pominąć)RAW, JWK, PKCS1 lub PKCS8
wrappingKeyIdTakUUID docelowego klucza transportowego RSA
ciphertextTakZaszyfrowany materiał klucza jako JWE Compact Serialization. Nagłówek JWE musi ustawiać alg na RSA-OAEP lub RSA-OAEP-256, a enc na A256GCM.

Możesz zaimportować sam klucz publiczny (class staje się PUBLIC_KEY) lub klucz prywatny (KMS odtwarza część publiczną; class staje się KEY_PAIR). Materiał symetryczny jest przechowywany jako SECRET_KEY.

Akcje IAM przy tym wywołaniu: okms:apikms:serviceKey/create, okms:apikms:serviceKey/import oraz okms:apikms:serviceKey/unwrapKey na kluczu transportowym.

API REST
CLI OKMS
SDK Go
curl -X POST "https://<region>.okms.ovh.net/api/<okmsId>/v1/servicekey" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "imported-aes-byok",
    "operations": ["encrypt", "decrypt"],
    "wrappedKeys": [
      {
        "keyFormatType": "JWK",
        "wrappingKeyId": "<transport-key-id>",
        "ciphertext": "<jwe-compact-serialization>"
      }
    ]
  }'

Wartości keyFormatType: RAW, JWK, PKCS1 lub PKCS8.

Weryfikacja zaimportowanego klucza

Potwierdź, że klucz istnieje i odpowiada oczekiwanemu typowi oraz operacjom.

API REST
CLI OKMS
SDK Go
curl -X GET "https://<region>.okms.ovh.net/api/<okmsId>/v1/servicekey/<imported-key-id>" \
  -H "Authorization: Bearer <token>"

Sprawdź, czy:

  • atrybut state klucza ma wartość active (lub aktywuj go, jeśli wymaga tego Twój przepływ pracy).
  • type, size i operations odpowiadają Twoim założeniom.
  • atrybuty wrażliwości w attributes odzwierciedlają zaimportowany klucz (never_extractable ma wartość false).

Następnie możesz używać klucza do operacji encrypt, decrypt, sign lub verify zgodnie z dokumentacją Korzystanie z OVHcloud Key Management Service (KMS).

Eksport opakowanego klucza

Bezpieczny eksport jest odwrotnością importu: OVHcloud KMS szyfruje materiał klucza kluczem transportowym RSA i zwraca wyłącznie ciphertext JWE. Prywatny klucz transportowy musi znajdować się w środowisku docelowym — czyli w systemie zewnętrznym, który otrzymuje klucz, a nie w OVHcloud KMS — aby tylko to środowisko mogło rozpakować materiał.

Zrozumienie ceremonii eksportu

  1. Wygeneruj parę kluczy transportowych RSA w środowisku docelowym (inny KMS lub narzędzie, które odbierze klucz).
  2. Zaimportuj publiczny klucz transportowy miejsca docelowego do OVHcloud KMS z operacją wrapKey. Ten klucz to wrappingKeyId używany w momencie eksportu.
  3. W OVHcloud KMS wyeksportuj klucz serwisowy opakowany tym kluczem transportowym. Klucz musi zostać utworzony lub zaimportowany z extractable ustawionym na true. Następnie, gdy to możliwe, ustaw extractable na false.
  4. Przenieś ciphertext do miejsca docelowego i rozpakuj go prywatnym kluczem transportowym miejsca docelowego.
Info

Nie generuj pary kluczy transportowych eksportu w OVHcloud KMS. Gdyby prywatny klucz transportowy pozostał w OVHcloud KMS, miejsce docelowe nie mogłoby rozpakować ciphertextu. Do OVHcloud KMS importowana jest wyłącznie część publiczna, służąca do opakowywania.

Klucz transportowy wskazany przez wrappingKeyId musi być kluczem RSA w tej samej domenie OKMS z użyciem wrapKey. Aby wyeksportować klucz przechowywany w HSM, zobacz Użycie BYOK z kluczami HSM. Klucze wrażliwe (materiał AES/oct oraz prywatny materiał RSA/EC) można wyodrębnić tylko po opakowaniu — wyodrębnianie w postaci jawnej nie jest obsługiwane dla tych kluczy.

Import publicznego klucza transportowego miejsca docelowego do OVHcloud KMS

Zarejestruj publiczny klucz miejsca docelowego, aby OVHcloud KMS mógł nim opakować eksportowany klucz. Zaimportuj go jako klucz RSA wyłącznie publiczny z wrapKey (bez materiału prywatnego).

API REST
CLI OKMS
SDK Go
curl -X POST "https://<region>.okms.ovh.net/api/<okmsId>/v1/servicekey" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "byok-export-transport-pub",
    "type": "RSA",
    "operations": ["wrapKey"],
    "keys": [
      {
        "kty": "RSA",
        "n": "<base64url-modulus>",
        "e": "<base64url-exponent>",
        "key_ops": ["wrapKey"]
      }
    ]
  }'

Zapisz zwrócone id klucza jako wrappingKeyId.

Włączenie wyodrębniania

Eksportowany klucz musi być możliwy do wyodrębnienia, a decyzja o tym zapada podczas tworzenia lub importu klucza. Później extractable można zmienić tylko z true na false: po ustawieniu na false nie można go już nigdy przywrócić do true. Klucza utworzonego lub zaimportowanego bez extractable ustawionego na true nie będzie więc nigdy można wyeksportować. Ta reguła dotyczy zarówno kluczy SOFTWARE, jak i kluczy HSM.

Warning

Włączenie wyodrębniania zmniejsza granicę ochrony klucza, a klucz utworzony z extractable ustawionym na true ma trwale ustawione never_extractable na false. Twórz klucz możliwy do wyodrębnienia tylko wtedy, gdy planujesz jego migrację.

Ustaw extractable na true podczas tworzenia klucza:

API REST
CLI OKMS
SDK Go
curl -X POST "https://<region>.okms.ovh.net/api/<okmsId>/v1/servicekey" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "aes-to-migrate",
    "type": "oct",
    "size": 256,
    "operations": ["encrypt", "decrypt"],
    "extractable": true
  }'

W przypadku importu ustaw "extractable": true w treści żądania (API REST), dodaj --extractable (CLI OKMS) lub przekaż okms.WithExtractable(true) (SDK Go).

Gdy klucz nie musi już być eksportowany, na przykład po udanym eksporcie opakowanym (patrz sekcja Eksport klucza opakowanego kluczem transportowym), wyłącz wyodrębnianie. Tej operacji nie można cofnąć. Akcja IAM: okms:apikms:serviceKey/update.

API REST
CLI OKMS
SDK Go
curl -X PATCH "https://<region>.okms.ovh.net/api/<okmsId>/v1/servicekey/<key-id>" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "extractable": false
  }'

Eksport klucza opakowanego kluczem transportowym

Wywołaj GET /api/{okmsId}/v1/servicekey/{keyId} z poniższymi parametrami zapytania opakowywania. Gdy te parametry są obecne, API zwraca wrappedKeys zamiast jawnych keys.

Parametr zapytaniaWymaganeOpis
wrappingKeyIdTakUUID publicznego klucza transportowego miejsca docelowego zaimportowanego do OVHcloud KMS
wrappedKeyFormatTakRAW, JWK, PKCS1 lub PKCS8 — format jawny przed opakowaniem
wrappingAlgorithmTakRSA-OAEP lub RSA-OAEP-256
MetodaŚcieżkaOpis
GET/api/{okmsId}/v1/servicekey/{keyId}Pobranie metadanych lub eksport materiału klucza w formie opakowanej

Akcje IAM: okms:apikms:serviceKey/get na eksportowanym kluczu oraz okms:apikms:serviceKey/wrapKey na kluczu transportowym.

API REST
CLI OKMS
SDK Go
curl -X GET "https://<region>.okms.ovh.net/api/<okmsId>/v1/servicekey/<key-id>?wrappingKeyId=<wrapping-key-id>&wrappedKeyFormat=JWK&wrappingAlgorithm=RSA-OAEP-256" \
  -H "Authorization: Bearer <token>"

Przykładowa odpowiedź:

{
  "id": "<key-id>",
  "name": "imported-aes-byok",
  "type": "oct",
  "class": "SECRET_KEY",
  "size": 256,
  "operations": ["encrypt", "decrypt"],
  "wrappedKeys": [
    {
      "keyFormatType": "JWK",
      "wrappingKeyId": "<wrapping-key-id>",
      "ciphertext": "<jwe-compact-serialization>"
    }
  ]
}

Rozpakowanie ciphertextu w miejscu docelowym

Przenieś ciphertext do środowiska docelowego. Rozpakuj go prywatnym kluczem transportowym miejsca docelowego (odpowiednikiem klucza publicznego zaimportowanego do OVHcloud KMS).

  • Jeśli miejscem docelowym jest inna domena OKMS, zaimportuj tam opakowany materiał za pomocą wrappedKeys jak w Import opakowanego klucza, używając identyfikatora klucza transportowego tej domeny jako wrappingKeyId.
  • Jeśli miejscem docelowym jest system zewnętrzny, użyj jego natywnego API rozpakowywania / importu z prywatnym kluczem transportowym oraz tym samym keyFormatType / algorytmem opakowywania, którego użyto przy eksporcie.

Użycie BYOK z kluczami HSM

Przy poziomie ochrony HSM materiał klucza jest opakowywany i rozpakowywany wewnątrz HSM: nigdy nie pojawia się w postaci jawnej w OVHcloud KMS. Format JWE jest taki sam jak dla kluczy SOFTWARE (RSA-OAEP lub RSA-OAEP-256 z A256GCM).

Info

Poziom ochrony HSM nie jest dostępny we wszystkich regionach. Aby sprawdzić jego dostępność w regionie swojej domeny OKMS, zapoznaj się z listą protectionLevel zwracaną dla tego regionu przez następujące wywołanie API:

Klucz transportowy musi być przechowywany w HSM zawsze wtedy, gdy przechowywany jest w nim importowany lub eksportowany klucz, co podsumowuje poniższa tabela:

OperacjaKlucz transportowyImportowany lub eksportowany klucz
Import do HSMKlucz RSA HSM z unwrapKeyKlucz symetryczny (oct) lub klucz prywatny RSA/EC
Eksport z HSMKlucz RSA HSM z wrapKeyTylko klucz symetryczny (oct)
Import lub eksport klucza SOFTWAREKlucz RSA SOFTWARE lub HSMDowolny typ klucza, jak opisano w poprzednich sekcjach

Opisane poniżej operacje importu do HSM są przedstawione wyłącznie dla API REST.

Utworzenie klucza transportowego HSM

Aby zaimportować klucz do HSM, utwórz klucz transportowy z poziomem ochrony HSM:

API REST
CLI OKMS
SDK Go
curl -X POST "https://<region>.okms.ovh.net/api/<okmsId>/v1/servicekey" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "byok-transport-rsa-hsm",
    "type": "RSA",
    "size": 2048,
    "operations": ["wrapKey", "unwrapKey"],
    "protectionLevel": "HSM"
  }'

Następnie wyeksportuj jego klucz publiczny i opakuj materiał klucza w źródle, jak opisano w sekcjach Pobranie publicznego klucza transportowego i Opakowanie materiału klucza źródłowego.

Import klucza do HSM

Ponieważ HSM nigdy nie ujawnia rozpakowanego materiału, OVHcloud KMS nie może wywnioskować typu klucza. Żądanie importu różni się od importu SOFTWARE:

  • Ustaw protectionLevel na HSM. Klucz transportowy również musi być kluczem HSM.
  • Zadeklaruj type: oct, RSA lub EC. Nie ustawiaj size ani curve dla RSA i EC: HSM odczytuje je z klucza. Dla oct parametr size jest opcjonalny (128, 192 lub 256).
  • Nie ustawiaj keyFormatType w wrappedKeys. Tekst jawny opakowany w JWE musi zawierać surowe bajty klucza w przypadku klucza oct oraz klucz prywatny w formacie PKCS#8 (DER) w przypadku klucza RSA lub EC.
  • Obsługiwane klucze: AES 128, 192 lub 256 bitów, RSA 2048, 3072 lub 4096 bitów, EC P-256, P-384 lub P-521. Samego klucza publicznego nie można zaimportować do HSM w postaci opakowanej; możliwy jest tylko import w postaci jawnej.
curl -X POST "https://<region>.okms.ovh.net/api/<okmsId>/v1/servicekey" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "imported-aes-hsm",
    "type": "oct",
    "operations": ["encrypt", "decrypt"],
    "protectionLevel": "HSM",
    "wrappedKeys": [
      {
        "wrappingKeyId": "<hsm-transport-key-id>",
        "ciphertext": "<jwe-compact-serialization>"
      }
    ]
  }'

Klucz transportowy HSM może również rozpakować klucz SOFTWARE: w takim przypadku postępuj zgodnie z sekcją Import opakowanego klucza, podając keyFormatType.

Eksport klucza z HSM

Z HSM można eksportować tylko klucze symetryczne (oct): HSM nigdy nie udostępnia kluczy prywatnych RSA ani EC. Podobnie jak w przypadku klucza SOFTWARE, klucz musi zostać utworzony lub zaimportowany z extractable ustawionym na true, czego nie można włączyć później (zobacz Włączenie wyodrębniania).

Klucz transportowy musi być przechowywany w HSM. Zaimportuj publiczny klucz transportowy miejsca docelowego z poziomem ochrony HSM:

curl -X POST "https://<region>.okms.ovh.net/api/<okmsId>/v1/servicekey" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "byok-export-transport-pub-hsm",
    "type": "RSA",
    "operations": ["wrapKey"],
    "protectionLevel": "HSM",
    "keys": [
      {
        "kty": "RSA",
        "n": "<base64url-modulus>",
        "e": "<base64url-exponent>",
        "key_ops": ["wrapKey"]
      }
    ]
  }'

Następnie wyeksportuj klucz, ustawiając wrappedKeyFormat na RAW: HSM zawsze opakowuje surowe bajty klucza, więc odszyfrowana zawartość JWE to sam klucz AES (32 bajty w przypadku klucza 256-bitowego).

API REST
CLI OKMS
SDK Go
curl -X GET "https://<region>.okms.ovh.net/api/<okmsId>/v1/servicekey/<hsm-key-id>?wrappingKeyId=<hsm-wrapping-key-id>&wrappedKeyFormat=RAW&wrappingAlgorithm=RSA-OAEP-256" \
  -H "Authorization: Bearer <token>"

W miejscu docelowym odszyfruj JWE prywatnym kluczem transportowym, jak opisano w sekcji Rozpakowanie ciphertextu w miejscu docelowym.

Przykład end-to-end w Go

Poniższe przykłady przeprowadzają obie ceremonie z parą kluczy RSA, używając SDK Go do wywołań OVHcloud KMS oraz go-jose do operacji JWE wykonywanych poza OVHcloud KMS. Oba przykłady kodują materiał klucza w formacie PKCS#8 (DER), co odpowiada wartości PKCS8 pola keyFormatType.

Import klucza wygenerowanego lokalnie

Program generuje klucz za pomocą standardowej biblioteki Go, opakowuje go lokalnie publicznym kluczem transportowym, a następnie go importuje. Klucz nigdy nie trafia do OVHcloud KMS w postaci jawnej.

// 1. Utwórz klucz transportowy w OVHcloud KMS i pobierz jego część publiczną.
transportKey, err := okmsClient.GenerateRSAKeyPair(
  ctx,
  okmsId,
  types.N2048,
  "byok-transport-rsa",
  types.SOFTWARE,
  "",
  []types.CryptographicUsages{types.WrapKey, types.UnwrapKey},
)
if err != nil {
  return err
}
transportPub, err := okmsClient.ExportPublicKey(ctx, okmsId, transportKey.Id)
if err != nil {
  return err
}

// 2. Wygeneruj klucz do zaimportowania i zakoduj go w formacie PKCS#8 (DER).
srcKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
  return err
}
plaintext, err := x509.MarshalPKCS8PrivateKey(srcKey)
if err != nil {
  return err
}

// 3. Opakuj materiał klucza jako JWE: opakowanie klucza RSA-OAEP-256, szyfrowanie treści A256GCM.
encrypter, err := jose.NewEncrypter(
  jose.A256GCM,
  jose.Recipient{Algorithm: jose.RSA_OAEP_256, Key: transportPub},
  nil,
)
if err != nil {
  return err
}
jwe, err := encrypter.Encrypt(plaintext)
if err != nil {
  return err
}
ciphertext, err := jwe.CompactSerialize()
if err != nil {
  return err
}

// 4. Zaimportuj opakowany klucz. KMS rozpakowuje go i wnioskuje typ oraz rozmiar z materiału.
// Jest importowany jako możliwy do wyodrębnienia, aby następny przykład mógł go wyeksportować: nie można tego włączyć później.
imported, err := okmsClient.ImportWrappedServiceKey(
  ctx,
  okmsId,
  transportKey.Id,
  ciphertext,
  types.PKCS8,
  "imported-rsa-byok",
  "",
  []types.CryptographicUsages{types.Sign, types.Verify},
  okms.WithExtractable(true),
)
if err != nil {
  return err
}
keyID := imported.Id

Algorytm szyfrowania treści JWE (enc) musi mieć wartość A256GCM.

Eksport klucza i odszyfrowanie JWE

Miejsce docelowe (tutaj lokalny program) generuje parę kluczy transportowych, importuje do OVHcloud KMS tylko jej część publiczną, a następnie odszyfrowuje wyeksportowany JWE częścią prywatną.

// Identyfikator klucza serwisowego do wyeksportowania, na przykład klucza zaimportowanego w poprzednim przykładzie.
keyID := uuid.MustParse("<key-id>")

// 1. Wygeneruj parę kluczy transportowych w miejscu docelowym.
destKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
  return err
}

// 2. Zaimportuj do OVHcloud KMS tylko jej część publiczną, z użyciem wrapKey.
wrappingKey, err := okmsClient.ImportKey(
  ctx,
  okmsId,
  &destKey.PublicKey,
  "byok-export-transport-pub",
  "",
  []types.CryptographicUsages{types.WrapKey},
)
if err != nil {
  return err
}

// 3. Wyeksportuj klucz opakowany publicznym kluczem miejsca docelowego. Klucz musi zostać utworzony lub
// zaimportowany jako możliwy do wyodrębnienia. Po eksporcie wyodrębnianie zostaje nieodwracalnie wyłączone.
defer func() {
  extractable := false
  _, _ = okmsClient.UpdateServiceKey(ctx, okmsId, keyID, types.PatchServiceKeyRequest{Extractable: &extractable})
}()
wrapped, err := okmsClient.GetWrappedServiceKey(
  ctx,
  okmsId,
  keyID,
  wrappingKey.Id,
  types.PKCS8,
  types.RSAOAEP256,
)
if err != nil {
  return err
}

// 4. Odszyfruj JWE prywatnym kluczem miejsca docelowego i przeanalizuj materiał PKCS#8.
jwe, err := jose.ParseEncrypted(
  wrapped[0].Ciphertext,
  []jose.KeyAlgorithm{jose.RSA_OAEP_256},
  []jose.ContentEncryption{jose.A256GCM},
)
if err != nil {
  return err
}
plaintext, err := jwe.Decrypt(destKey)
if err != nil {
  return err
}

exportedKey, err := x509.ParsePKCS8PrivateKey(plaintext)
if err != nil {
  return err
}
// exportedKey zawiera wyeksportowany materiał klucza, używany w dalszej części programu.

Sprawdź również

Korzystanie z OVHcloud Key Management Service (KMS)

Metody uwierzytelniania OKMS

Pierwsze kroki z OVHcloud Key Management Service (KMS)

Dołącz do grona naszych użytkowników.

Czy ta strona była pomocna?