Menggunakan kunci Cloud HSM untuk menyalurkan traffic Apache

Panduan ini memberikan petunjuk untuk menyiapkan server Apache agar menggunakan kunci Cloud HSM untuk penandatanganan TLS di Debian 11 (Bullseye). Anda mungkin perlu mengubah perintah ini agar berfungsi dengan OS atau distribusi Linux Anda.

Anda dapat menemukan versi blueprint berbasis Terraform dari tutorial ini di repositori GitHub kms-solutions.

Sebelum memulai

Sebagai prasyarat, selesaikan konfigurasi yang didokumentasikan dalam Penyiapan OpenSSL.

Setelah penyiapan OpenSSL selesai, pastikan Apache versi terbaru telah diinstal:

sudo apt-get update
sudo apt-get install apache2

Konfigurasi

Membuat kunci penandatanganan yang dihosting Cloud KMS

Buat kunci penandatanganan EC-P256-SHA256 Cloud KMS di projectGoogle Cloud , di key ring yang sebelumnya Anda konfigurasikan untuk OpenSSL:

gcloud kms keys create "KEY_NAME" --keyring "KEY_RING" \
  --project "PROJECT_ID" --location "LOCATION" \
  --purpose "asymmetric-signing" --default-algorithm "ec-sign-p256-sha256" \
  --protection-level "hsm"

Membuat sertifikat yang ditandatangani sendiri dengan OpenSSL

Buat sertifikat yang ditandatangani sendiri dengan kunci penandatanganan yang dihosting Cloud KMS. Anda dapat menggunakan OpenSSL untuk menggunakan URI PKCS #11, bukan jalur file, dan mengidentifikasi kunci berdasarkan labelnya. Di library PKCS #11 Cloud KMS, label kunci adalah nama CryptoKey.

openssl req -new -x509 -days 3650 -subj '/CN=CERTIFICATE_NAME/' \
  DIGEST_FLAG -engine pkcs11 -keyform engine \
  -key PKCS_KEY_TYPE=KEY_IDENTIFIER > PATH_TO_CERTIFICATE

Ganti kode berikut:

  • CERTIFICATE_NAME: nama untuk sertifikat.
  • DIGEST_FLAG: algoritma ringkasan yang digunakan oleh kunci penandatanganan asimetris. Gunakan -sha256, -sha384, atau -sha512, bergantung pada kunci.
  • PKCS_KEY_TYPE: jenis ID yang digunakan untuk mengidentifikasi kunci. Untuk menggunakan versi kunci terbaru, gunakan pkcs11:object dengan nama kunci. Untuk menggunakan versi kunci tertentu, gunakan pkcs11:id dengan ID resource lengkap versi kunci.
  • KEY_IDENTIFIER: ID untuk kunci. Jika Anda menggunakan pkcs11:object, gunakan nama kunci—misalnya, KEY_NAME. Jika Anda menggunakan pkcs11:id, gunakan ID resource lengkap kunci atau versi kunci—misalnya, projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION.
  • PATH_TO_CERTIFICATE: jalur tempat Anda ingin menyimpan file sertifikat.

Jika perintah ini gagal, PKCS11_MODULE_PATH mungkin telah ditetapkan dengan salah, atau Anda mungkin tidak memiliki izin yang tepat untuk menggunakan kunci penandatanganan Cloud KMS.

Sekarang Anda akan memiliki sertifikat yang terlihat seperti ini:

-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----

Menyiapkan server Apache

  1. Buat direktori di /etc/apache2 untuk menyimpan sertifikat yang ditandatangani sendiri:

    sudo mkdir /etc/apache2/ssl
    sudo mv ca.cert /etc/apache2/ssl
    
  2. Edit file konfigurasi host virtual 000-default.conf yang terletak di /etc/apache2/sites-available untuk memberikan jalur file sertifikat dan memastikan SSLEngine aktif.

    Berikut adalah contoh konfigurasi yang memproses port 443:

      <VirtualHost *:443>
            ServerAdmin webmaster@localhost
            DocumentRoot /var/www/html
            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined
            SSLEngine on
            SSLCertificateFile /etc/apache2/ssl/ca.cert
            SSLCertificateKeyFile "PKCS_KEY_TYPE=KEY_IDENTIFIER"
      </VirtualHost>
    
  3. Pastikan Apache mengekspor variabel lingkungan dengan benar dengan menambahkannya ke file /etc/apache2/envvars menggunakan editor teks pilihan Anda. Anda mungkin perlu mengedit file sebagai root menggunakan sudo. Tambahkan baris berikut ke akhir file:

    export PKCS11_MODULE_PATH="<var>PATH_TO_LIBKMSP11</var>"
    export KMS_PKCS11_CONFIG="<var>PATH_TO_PKCS11_CONFIG</var>"
    export GRPC_ENABLE_FORK_SUPPORT=1
    

    Ganti kode berikut:

    • PATH_TO_LIBKMSP11: jalur ke libkmsp11.so.
    • PATH_TO_PKCS11_CONFIG: jalur ke pkcs11-config.yaml.

    GRPC_ENABLE_FORK_SUPPORT diperlukan agar gRPC menyertakan dukungan fork dan menjalankan library PKCS #11 Cloud KMS dengan benar sebagai bagian dari server Apache.

    Jika ingin mengautentikasi menggunakan kunci akun layanan, Anda juga harus mengekspor nilai untuk variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS.

Menjalankan server

Aktifkan modul SSL Apache, aktifkan konfigurasi virtualhost, dan tambahkan halaman web pengujian di folder DocumentRoot Anda:

sudo a2enmod ssl
sudo a2ensite 000-default.conf
echo '<!doctype html><html><body><h1>Hello World!</h1></body></html>' | \
  sudo tee /var/www/html/index.html

Mulai ulang server Apache dan uji dengan curl bahwa konfigurasi berfungsi seperti yang diharapkan. Flag --insecure diperlukan untuk mengabaikan pemeriksaan sertifikat yang ditandatangani sendiri.

sudo systemctl restart apache2
curl -v --insecure https://127.0.0.1

Jika Anda mengalami error, log error Apache adalah tempat yang tepat untuk memulai dan melihat apa yang salah. Masalah autentikasi adalah sumber error yang umum. Jika Anda melihat error PERMISSION_DENIED, pastikan Anda diautentikasi sepenuhnya dan file kredensial memiliki izin yang tepat. Untuk memastikan Anda telah sepenuhnya diautentikasi, jalankan perintah berikut:

gcloud auth application-default login

Untuk mengonfirmasi bahwa autentikasi berhasil, output harus menyertakan baris Credentials saved to file: [/path/to/credentials.json].