Este guia fornece instruções para configurar um servidor Apache para usar uma Chave do Cloud HSM para assinatura TLS no Debian 11 (Bullseye). Talvez seja necessário modifique esses comandos para que funcionem com sua distribuição do SO ou Linux.
Encontre uma versão do blueprint baseada no Terraform deste tutorial no repositório do GitHub kms-solutions.
Antes de começar
Como pré-requisito, conclua a configuração documentada em Configuração do OpenSSL.
Após a conclusão da configuração do OpenSSL, verifique se uma versão recente do Apache está instalada:
sudo apt-get update
sudo apt-get install apache2
Configuração
Criar uma chave de assinatura hospedada no Cloud KMS
Crie uma chave de assinatura EC-P256-SHA256
do Cloud KMS na sua
projeto do Google Cloud, no keyring configurado anteriormente
Para 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"
Criar um certificado autoassinado com o OpenSSL
Gere um certificado autoassinado com a chave de assinatura hospedada no Cloud KMS. Você pode usar o OpenSSL para usar um URI PKCS #11 em vez de um caminho de arquivo e identificar a chave pelo rótulo. Na biblioteca PKCS #11 do Cloud KMS, o rótulo da chave é o nome da 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
Substitua:
CERTIFICATE_NAME
: um nome para o certificado.DIGEST_FLAG
: o algoritmo de resumo usado pela chave de assinatura assimétrica. Use-sha256
,-sha384
ou-sha512
, dependendo da chave.PKCS_KEY_TYPE
: o tipo de identificador usado para identificar a chave. Para usar a versão mais recente da chave, usepkcs11:object
com o nome da chave. Para use uma versão de chave específica, usepkcs11:id
com o ID completo do recurso da a versão da chave.KEY_IDENTIFIER
: um identificador da chave. Se você estiver usandopkcs11:object
, use o nome da chave, por exemplo,KEY_NAME
. Se você estiver usandopkcs11:id
, use o ID de recurso completo da chave ou da versão da chave, por exemplo,projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION
.PATH_TO_CERTIFICATE
: o caminho em que você quer salvar o arquivo de certificado.
Se esse comando falhar, é possível que PKCS11_MODULE_PATH
tenha sido definido incorretamente ou
que você não tenha as permissões corretas para usar a chave de assinatura do Cloud KMS.
Agora você terá um certificado como este:
-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----
Configurar o servidor Apache
Crie um diretório em
/etc/apache2
para armazenar seu certificado autoassinado em:sudo mkdir /etc/apache2/ssl sudo mv ca.cert /etc/apache2/ssl
Edite os arquivos de configuração de host virtual
000-default.conf
localizados em/etc/apache2/sites-available
para fornecer o caminho do arquivo do certificado. verificar se SSLEngine está ativado.Este é um exemplo de configuração que detecta na porta 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>
Adicione as variáveis de ambiente ao arquivo para verificar se elas foram exportadas corretamente o arquivo
/etc/apache2/envvars
usando o editor de texto de sua preferência. Talvez seja necessário editar o arquivo como raiz usandosudo
. Adicione as seguintes linhas ao fim do arquivo: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
Substitua:
PATH_TO_LIBKMSP11
: o caminho paralibkmsp11.so
.PATH_TO_PKCS11_CONFIG
: o caminho parapkcs11-config.yaml
.
GRPC_ENABLE_FORK_SUPPORT
é necessário para que o gRPC inclua suporte à bifurcação e execute corretamente a biblioteca PKCS #11 do Cloud KMS como parte do servidor Apache.Se você quiser fazer a autenticação usando uma chave de conta de serviço, também será necessário exportar um valor para a variável de ambiente
GOOGLE_APPLICATION_CREDENTIALS
.
Execute seu servidor
Habilite o módulo Apache SSL, ative a configuração virtualhost e adicione um teste da página da Web na pasta DocumentRoot:
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
Reinicie o servidor Apache e teste com curl
se a configuração funciona conforme
o esperado. A sinalização --insecure
é necessária para ignorar verificações de certificado
assinadas.
sudo systemctl restart apache2
curl -v --insecure https://127.0.0.1
Se você encontrar erros, o registro de erros do Apache será um bom ponto de partida para ver o que deu errado. Problemas de autenticação são uma fonte comum de erros. Se você
encontrar erros PERMISSION_DENIED
, verifique se você está totalmente autenticado
se o arquivo de credenciais tem as permissões corretas. Para garantir que você está totalmente
autenticado, execute o seguinte comando:
gcloud auth application-default login
Para confirmar que a autenticação foi concluída, a saída precisa incluir a
linha Credentials saved to file: [/path/to/credentials.json]
.