在Azure应用服务中横向扩展时如何跨示例使用相同的公钥和私钥- Linux - PHP

5jvtdoz2  于 2023-03-03  发布在  Linux
关注(0)|答案(1)|浏览(194)

我在Azure应用服务上有一个运行Azure Linux的PHP应用程序。
在我的本地机器上,我使用openssl创建了公钥-私钥对,并在JWT身份验证流中使用这些密钥
访问令牌创建

$private_key = file_get_contents(ROOTPATH . 'localkey.pem');
$access_payload = [...];
$access_token = JWT::encode($access_payload, $private_key, 'RS256');

访问令牌验证

$public_key = file_get_contents(ROOTPATH . 'localkey.pub');
$decoded_token = JWT::decode($access_token, new Key($public_key, 'RS256'));

我通过SSH登录在Azure应用服务示例上创建了公钥-私钥对。
现在,如何在横向扩展时跨示例使用相同的公钥-私钥对?使用自动扩展时,.pub.pem文件是否会复制到每个示例?推荐的方法是什么?

7fyelxc5

7fyelxc51#

现在,如何在横向扩展时跨示例使用相同的公钥-私钥对?使用自动扩展时,.pub.pem文件是否会复制到每个示例?推荐的方法是什么?
默认情况下,Azure自动缩放将使用默认配置,它将动态缩放您的示例,并在不需要时删除它们。
你可以使用Azure密钥保管库存储你的公钥和私钥,并使用它们向App Service进行身份验证。
我在Azure中部署了一个PHP应用程序,并创建了一个Azure Key Vault示例,如下所示:-
我为Azure应用服务创建了托管身份,并将其所有者角色提供给部署应用服务和密钥保管库的资源组,如下所示:-

提供了对密钥库Keys的相同托管身份访问,我还在访问策略中添加了一个名为Powershell的服务主体,以便稍后在PHP代码中使用它来验证App的密钥。
创建密钥值存储在里面的秘密,如下所示:-

访问策略:-

使用以下代码通过密钥保管库验证Azure应用服务托管标识:-

use Azure\Identity\ManagedIdentityCredential;

use Azure\SecurityCenter\SecretsClient;

  

$managedIdentityClientId = 'xxxxxxx-xxxx-xxxx-9d57-e63ca3946c62';

  

// Create a ManagedIdentityCredential to authenticate with the specified managed identity

$credential = new ManagedIdentityCredential($managedIdentityClientId);

  

// Create a SecretsClient to access the Key Vault

$keyVaultName = 'keyvaultphp';

$secretName = 'phpkeyapp';

$secretsClient = new SecretsClient('https://'.$keyVaultName.'.vault.azure.net', $credential);

  

// Retrieve the public and private keys from the Key Vault

$publicKey = $secretsClient->getSecret($secretName.'-public')->getValue();

$privateKey = $secretsClient->getSecret($secretName.'-private')->getValue();

  

// Use the keys for JWT token creation and verification

$access_payload = [...];

$access_token = JWT::encode($access_payload, $privateKey, 'RS256');

$decoded_token = JWT::decode($access_token, new Key($publicKey, 'RS256'));

您也可以使用以下代码向服务主体进行身份验证:-
在应用服务配置中添加AZURE_CLIENT_ID和AZURE_CLIENT_SECRET:-

use Azure\Identity\ClientSecretCredential;
use Azure\SecurityCenter\SecretsClient;

// Get the credentials for the service principal
$clientId = getenv('AZURE_CLIENT_ID');
$clientSecret = getenv('AZURE_CLIENT_SECRET');
$credential = new ClientSecretCredential($tenantId, $clientId, $clientSecret);

// Create a SecretsClient to access the Key Vault
$keyVaultName = 'mykeyvault';
$secretName = 'mykey';
$secretsClient = new SecretsClient('https://'.$keyVaultName.'.vault.azure.net', $credential);

// Retrieve the public and private keys from the Key Vault
$publicKey = $secretsClient->getSecret($secretName.'-public')->getValue();
$privateKey = $secretsClient->getSecret($secretName.'-private')->getValue();

或者,您可以在Web应用的"配置"设置中添加WEBSITE_SSH_PUBLIC_KEY以及"公钥"的内容,以便应用服务使用此密钥。

保存设置并重新启动Web应用。
Use Key Vault from App Service with Azure Managed Identity - Code Samples | Microsoft Learn

相关问题