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, gunakanpkcs11:object
dengan nama kunci. Untuk menggunakan versi kunci tertentu, gunakanpkcs11:id
dengan ID resource lengkap versi kunci.KEY_IDENTIFIER
: ID untuk kunci. Jika Anda menggunakanpkcs11:object
, gunakan nama kunci—misalnya,KEY_NAME
. Jika Anda menggunakanpkcs11: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
Buat direktori di
/etc/apache2
untuk menyimpan sertifikat yang ditandatangani sendiri:sudo mkdir /etc/apache2/ssl sudo mv ca.cert /etc/apache2/ssl
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>
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 menggunakansudo
. 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 kelibkmsp11.so
.PATH_TO_PKCS11_CONFIG
: jalur kepkcs11-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]
.