Menggabungkan kunci menggunakan OpenSSL di Linux

Topik ini menunjukkan cara menggabungkan kunci secara manual sebelum mengimpor kunci ke Cloud KMS. Anda hanya perlu mengikuti petunjuk dalam topik ini jika tidak ingin menggunakan Google Cloud CLI untuk menggabungkan kunci secara otomatis sebelum mengimpornya. Untuk mengetahui ringkasan perbedaannya, baca Cara kerja impor kunci.

Anda dapat menyelesaikan langkah-langkah dalam topik ini dalam waktu 5 hingga 10 menit, tidak termasuk langkah Sebelum memulai.

Sebelum memulai

Sebelum dapat menggabungkan kunci, Anda harus menyelesaikan prasyarat berikut.

  1. Buat key ring dan kunci target, lalu buat tugas impor.
  2. Pastikan kunci Anda tersedia secara lokal dan diformat dengan benar untuk diimpor ke Cloud KMS.
  3. Melakukan patch dan mengompilasi ulang OpenSSL

Mengambil kunci penggabungan

Bagian ini menunjukkan cara mengambil kunci penggabungan dari tugas impor yang Anda buat di bagian Sebelum memulai. Sebaiknya gunakan konsol Google Cloud.

Konsol

  1. Buka halaman Key Management di Konsol Google Cloud.

    Buka halaman Key Management

  2. Klik nama key ring yang berisi tugas impor Anda.

  3. Klik tab Impor Tugas di bagian atas halaman.

  4. Klik More , lalu Download kunci penggabungan di menu pop-up.

gcloud CLI

Untuk memastikan bahwa tugas impor aktif, jalankan perintah gcloud kms import-jobs describe:

gcloud kms import-jobs describe IMPORT_JOB \
  --location LOCATION \
  --keyring KEY_RING \
  --format="value(state)"
state: ACTIVE

Jalankan perintah berikut untuk menyimpan kunci publik dari tugas impor ke ${HOME}/wrapping-key.pem

gcloud kms import-jobs describe \
  --location=LOCATION \
  --keyring=KEY_RING \
  --format="value(publicKey.pem)" \
  IMPORT_JOB > ${HOME}/wrapping-key.pem

API

  1. Panggil metode ImportJob.get.

  2. Ambil kunci publik melalui kolom publicKey dari respons ImportJob.get. Nilai ini berjenis WrappingPublicKey. Kolom pem dari jenis WrappingPublicKey adalah kunci publik yang dienkode dalam format Privacy Enhanced Mail (PEM).

Untuk informasi selengkapnya tentang format yang dienkode ke PEM, lihat RFC 7468, terutama bagian Pertimbangan Umum dan Encoding Teks untuk Info Kunci Publik Subjek.

Menyiapkan variabel lingkungan

Perintah OpenSSL memerlukan beberapa jalur file sebagai nilai input. Tentukan variabel lingkungan untuk jalur file guna mempermudah dalam menjalankan perintah. Pastikan Anda memiliki akses untuk menulis ke direktori yang Anda tentukan di bawah.

  1. Tetapkan variabel PUB_WRAPPING_KEY ke jalur lengkap ke kunci penggabungan yang Anda download dari tugas impor. Kunci penggabungan diakhiri dengan .pem.

    PUB_WRAPPING_KEY="WRAPPING_KEY_PATH"
    

  2. Tetapkan variabel TARGET_KEY ke jalur lengkap ke kunci (target) yang tidak digabungkan.

    TARGET_KEY=TARGET_KEY_PATH
    

    Ganti TARGET_KEY_PATH dengan jalur ke file .bin untuk kunci simetris atau jalur ke file .der untuk kunci asimetris.

  3. Jika melakukan penggabungan dengan RSA-AES, tetapkan variabel TEMP_AES_KEY ke jalur lengkap ke kunci AES sementara.

    TEMP_AES_KEY=TEMP_AES_KEY_PATH
    

  4. Tetapkan variabel WRAPPED_KEY ke jalur lengkap tempat Anda ingin menyimpan kunci target yang digabungkan dan siap untuk diimpor.

    WRAPPED_KEY=WRAPPED_KEY_PATH
    

  5. Pastikan semua variabel lingkungan sudah ditetapkan dengan benar menggunakan perintah berikut:

    echo "PUB_WRAPPING_KEY: " ${PUB_WRAPPING_KEY}; \
    echo "TARGET_KEY: " ${TARGET_KEY}; \
    echo "TEMP_AES_KEY: " ${TEMP_AES_KEY}; \
    echo "WRAPPED_KEY: " ${WRAPPED_KEY}
    

Setelah variabel ditetapkan dengan benar, Anda siap menggabungkan kunci. Ada dua pendekatan seperti yang dijelaskan di bawah: dengan khusus RSA atau dengan RSA-AES.

Menggabungkan kunci

Gabungkan kunci dengan RSA

Dalam pendekatan ini, kunci target digabungkan dalam blok RSA. Oleh karena itu, ukuran kunci target menjadi terbatas. Misalnya, Anda tidak dapat menggunakan metode ini untuk menggabungkan kunci RSA lain. Metode impor yang didukung adalah rsa-oaep-3072-sha256 dan rsa-oaep-4096-sha256.

  • Gabungkan kunci target dengan kunci publik penggabungan menggunakan algoritma CKM_RSA_PKCS_OAEP:

    openssl pkeyutl \
      -encrypt \
      -pubin \
      -inkey ${PUB_WRAPPING_KEY} \
      -in ${TARGET_KEY} \
      -out ${WRAPPED_KEY} \
      -pkeyopt rsa_padding_mode:oaep \
      -pkeyopt rsa_oaep_md:sha256 \
      -pkeyopt rsa_mgf1_md:sha256
    

Gabungkan kunci dengan RSA-AES

Dalam pendekatan ini, kunci target dibungkus dengan kunci AES sementara. Kunci AES sementara tersebut kemudian digabungkan dengan kunci RSA. Kedua kunci yang digabungkan ini digabungkan dan diimpor. Pendekatan ini dapat digunakan untuk menggabungkan kunci besar karena kunci target digabungkan menggunakan AES, bukan RSA. Metode impor yang didukung adalah rsa-oaep-3072-sha1-aes-256, rsa-oaep-4096-sha1-aes-256, rsa-oaep-3072-sha256-aes-256, dan rsa-oaep-4096-sha256-aes-256.

  1. Buat kunci AES acak sementara dengan panjang 32 byte, lalu simpan ke lokasi yang diidentifikasi oleh ${TEMP_AES_KEY}:

    openssl rand -out "${TEMP_AES_KEY}" 32
    

  2. Gabungkan kunci AES sementara dengan kunci publik penggabungan menggunakan algoritma CKM_RSA_PKCS_OAEP. Jika metode impor adalah rsa-oaep-3072-sha1-aes-256 atau rsa-oaep-4096-sha1-aes-256, gunakan sha1 untuk rsa_oaep_md dan rsa_mgf1_md. Gunakan sha256 untuk rsa-oaep-3072-sha256-aes-256 dan rsa-oaep-4096-sha256-aes-256.

    openssl pkeyutl \
      -encrypt \
      -pubin \
      -inkey ${PUB_WRAPPING_KEY} \
      -in ${TEMP_AES_KEY} \
      -out ${WRAPPED_KEY} \
      -pkeyopt rsa_padding_mode:oaep \
      -pkeyopt rsa_oaep_md:{sha1|sha256} \
      -pkeyopt rsa_mgf1_md:{sha1|sha256}
    

  3. Tetapkan variabel OpenSSL_V110 ke jalur skrip openssl.sh Anda. Jika mengikuti petunjuk untuk mem-patch dan mengompilasi ulang OpenSSL dengan tepat, Anda dapat menggunakan perintah ini tanpa mengubah nilai variabel.

    OPENSSL_V110="${HOME}/local/bin/openssl.sh"
    

  4. Gabungkan kunci target dengan kunci AES sementara menggunakan algoritma CKM_AES_KEY_WRAP_PAD, lalu tambahkan ke WRAPPED_KEY.

    "${OPENSSL_V110}" enc \
      -id-aes256-wrap-pad \
      -iv A65959A6 \
      -K $( hexdump -v -e '/1 "%02x"' < "${TEMP_AES_KEY}" ) \
      -in "${TARGET_KEY}" >> "${WRAPPED_KEY}"
    

    Flag -iv A65959A6 menetapkan A65959A6 sebagai Nilai Awal Alternatif. Hal ini diperlukan oleh spesifikasi RFC 5649.

Langkah selanjutnya