我在从azure上的linux上运行的节点应用程序中获取azure密钥库的密钥库时遇到了问题。
我使用以下代码:
import * as KeyVault from 'azure-keyvault';
import * as msRestAzure from 'ms-rest-azure'
function getKeyVaultCredentials(){
return msRestAzure.loginWithVmMSI();
}
function getKeyVaultSecret(credentials) {
let keyVaultClient = new KeyVault.KeyVaultClient(credentials,null);
return keyVaultClient.getSecret("my keyvault url here", 'my keyvault secret name here', "", null,null);
}
getKeyVaultCredentials().then(
getKeyVaultSecret
).then(function (secret){
//not getting here....
}).catch(function (err) {
//...error handling...
});当我打电话给getSecret时,我得到了一个401的响应。密钥库和MSI上的机器都有权限设置。在错误中,我得到的似乎没有任何身份验证头或标记,虽然我确实看到了一个标题,它看起来像响应上的身份验证头。
在我的实施过程中有什么遗漏吗?
编辑:--我在这里共享的示例如果我使用
msRestAzure.loginWithVmMSI({resource: 'https://vault.azure.net' });而不是叫它没有对角线。
发布于 2019-04-09 02:30:55
在您的密钥库中,确保使用正确的秘密权限在Access policies中添加了服务主体(通过启用MSI自动创建)。然后尝试单击Click to show advanced access policies->,选择Enable access to Azure Virtual Machines for deployment选项-> Save。
下面是一个代码示例,您可以检查检索秘密值的部分。
var http = require('http');
const KeyVault = require('azure-keyvault');
const msRestAzure = require('ms-rest-azure');
var server = http.createServer(function(request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
});
// The ms-rest-azure library allows us to login with MSI by providing the resource name. In this case the resource is Key Vault.
// For public regions the resource name is Key Vault
msRestAzure.loginWithAppServiceMSI({resource: 'https://vault.azure.net'}).then( (credentials) => {
const keyVaultClient = new KeyVault.KeyVaultClient(credentials);
var vaultUri = "https://" + "<YourVaultName>" + ".vault.azure.net/";
// We're setting the Secret value here and retrieving the secret value
keyVaultClient.setSecret(vaultUri, 'my-secret', 'test-secret-value', {})
.then( (kvSecretBundle, httpReq, httpResponse) => {
console.log("Secret id: '" + kvSecretBundle.id + "'.");
return keyVaultClient.getSecret(kvSecretBundle.id, {});
})
.then( (bundle) => {
console.log("Successfully retrieved 'test-secret'");
console.log(bundle);
})
.catch( (err) => {
console.log(err);
});
// Below code demonstrates how to retrieve a secret value
// keyVaultClient.getSecret(vaultUri, "AppSecret", "").then(function(response){
// console.log(response);
// })
});有关更多细节,您可以参考:使用Node应用程序从Azure密钥库中设置和检索一个秘密。
发布于 2020-12-22 02:24:14
现在,这在新的@azure/keyvault-secrets包中得到了简化,SecretClient可以从@azure/identity包中提取DefaultAzureCredential,后者足够聪明,可以在VM中运行时使用MSI详细信息,以及在本地开发环境中使用VS或Azure之类的开发人员凭据。您可以在@azure/identity自述中了解更多这方面的信息。
这样,您的代码将简化为
const { SecretClient } = require("@azure/keyvault-secrets");
const { DefaultAzureCredential } = require("@azure/identity");
async function getValue(secretName, secretVersion) {
const credential = new DefaultAzureCredential();
const client = new SecretClient(KEY_VAULT_URI, credential);
const secret = await client.getSecret(secretName);
return secret.value;
}要将应用程序从旧的azure-keyvault包中移出(现在已不再推荐),您可以看到新@azure/密钥库迁移指南-秘密
发布于 2019-07-25 13:40:02
您可以使用阅读-天蓝色-秘密,它将从天蓝色密钥库中检索所有的秘密。
例如
let secretClient = require('read-azure-secrets');
async function loadKeyVaultValues() {
let applicationID = '';
let applicationSecret = '';
let vaultURL = 'https://<your-key-vault-name>.vault.azure.net/';
let secrets = await secretClient.getSecrets(applicationID, applicationSecret, vaultURL);
secrets.forEach(secret => {
console.log(secret);
});
}
loadKeyVaultValues();https://stackoverflow.com/questions/55576242
复制相似问题