如何在容器化Node.js Azure Function中使用证书完成MS Graph身份验证
实现方案
1. 前置资源配置
- 先在Azure AD注册应用,为该应用分配Microsoft Graph所需的应用权限,完成管理员同意授权。
- 生成自签名证书或导入商用证书到Azure Key Vault,开启证书自动续期配置。
- 为Azure Function App的托管身份分配Key Vault的
证书获取权限;如果使用Function App TLS加载证书,还需要额外分配密钥获取权限(Key Vault中的证书导出为pfx时会以密钥形式存储)。 - 配置Function App应用设置,添加参数
WEBSITE_LOAD_CERTIFICATES,值填对应证书的指纹,若要加载所有可访问证书可填*。该配置会自动把Key Vault中的证书同步加载到Function App运行环境的证书存储中,容器化场景下同样生效。
2. 容器内部证书获取逻辑
两种可选实现方式,均满足容器内完成认证的要求:
方式一:通过Function App预加载证书直接读取
- Windows容器场景下,证书会加载到
Cert:\CurrentUser\My证书存储,Node.js可使用win-ca类库读取对应指纹的证书,导出为pem格式即可。 - Linux容器场景下,预加载的证书会放在
/var/ssl/certs目录下,文件名为证书的指纹,直接读取对应路径的文件即可。
该方式无需自行编写Key Vault调用逻辑,证书自动续期后Function App会自动同步新证书到容器环境,无需修改代码。
方式二:代码直接从Key Vault拉取证书
- 使用Azure Identity库的
DefaultAzureCredential,在容器内自动获取Function App的托管身份凭证,无需手动配置密钥。 - 调用Key Vault Certificates客户端的
getCertificate接口拉取证书内容,导出为pfx或pem格式用于身份认证。 - 代码中添加缓存逻辑,设置证书过期前1天自动重新拉取,适配自动续期场景。
3. Node.js身份认证对接Microsoft Graph
使用MSAL Node库实现身份认证,配置客户端证书流,参数传入前序步骤获取的证书内容、Azure AD应用的客户端ID、租户ID即可,示例代码如下:
const { ConfidentialClientApplication } = require('@azure/msal-node'); const fs = require('fs'); // 示例为Linux容器下读取预加载证书的逻辑,路径和文件名可从环境变量注入 const certificateContent = fs.readFileSync('/var/ssl/certs/你的证书指纹.pem', 'utf8'); const msalConfig = { auth: { clientId: "你的AAD应用客户端ID", authority: "https://login.microsoftonline.com/你的租户ID", clientCertificate: { thumbprint: "你的证书指纹", privateKey: certificateContent, } } }; const tokenRequest = { scopes: ["https://graph.microsoft.com/.default"], }; const cca = new ConfidentialClientApplication(msalConfig); // 获取Graph访问令牌 const accessToken = await cca.acquireTokenByClientCredential(tokenRequest);
拿到访问令牌后即可正常调用Microsoft Graph接口。
4. 容器镜像适配注意事项
- 禁止把证书打包到镜像内,所有证书均通过运行时读取,避免证书过期后需要重新构建镜像。
- Linux镜像如果用到证书相关依赖,确保预装了
ca-certificates包,避免证书校验失败。 - 不要在代码中硬编码任何密钥、证书指纹、客户端ID等配置,所有参数都通过Function App的应用设置注入到容器环境变量中读取。
内容的提问来源于stack exchange,提问作者Heinrich Ulbricht
相关产品推荐
相关产品推荐

