关于Azure Function App中TLS/SSL设置证书功能及公钥证书代码访问的技术问询
Azure Function App TLS/SSL设置与证书存储的关系及公钥证书访问示例
嘿,我来直接解答你的疑问:Azure Function App的TLS/SSL设置不完全等同于通用的证书存储,但它确实支持存储公钥证书,并且允许你的函数代码从这里获取证书使用。下面我一步步拆解给你看:
一、TLS/SSL设置的核心用途 vs 证书存储
- TLS/SSL设置最初是为Function App的自定义域名配置HTTPS加密服务的——也就是绑定SSL证书,确保客户端到Function App的通信是加密的。
- 但Azure也放开了这个区域的额外用途:你可以上传额外的公钥(甚至私钥)证书,把这里当成一个应用级的证书存储来用,这时候它就具备了类似通用证书存储的功能。
二、能不能存储公钥证书并在代码中访问?
完全可以!你可以把.cer格式的公钥证书上传到这个区域,然后在函数代码里直接读取使用。需要注意这两点:
- 上传的证书会存在Azure托管的安全存储里,Function App运行时有权限访问。
- 公钥证书不需要私钥,适合只需要验证签名、加密数据这类场景;当然如果是带私钥的
.pfx证书也支持,但公钥证书更轻量化。
三、操作步骤与代码示例
1. 上传公钥证书到TLS/SSL设置
- 登录Azure门户,找到你的Function App。
- 左侧导航栏点TLS/SSL设置,然后选**公钥证书(.cer)**标签。
- 点击上传证书,选择本地的
.cer文件,给证书起个好记的名称(后续代码要用到这个名称),完成上传。
2. 配置应用设置(推荐)
为了代码不硬编码证书名,建议去Function App的配置 > 应用程序设置里加个配置项,比如MY_PUBLIC_CERT_NAME,值就是你刚才上传的证书名称。这样后续改证书名只需要改配置,不用动代码。
3. C#代码示例
如果你的Function是C#写的,可以这样获取证书:
using System; using System.Security.Cryptography.X509Certificates; using Microsoft.Azure.WebJobs; using Microsoft.Extensions.Logging; public static class CertAccessFunction { [FunctionName("GetPublicKeyCert")] public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log) { try { // 从应用设置读取证书名称 string certName = Environment.GetEnvironmentVariable("MY_PUBLIC_CERT_NAME"); // 打开当前用户的证书存储(Azure Function会把上传的证书放在这里) using (X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser)) { store.Open(OpenFlags.ReadOnly); // 根据证书名称查找 X509Certificate2Collection certCollection = store.Certificates.Find( X509FindType.FindBySubjectName, certName, validOnly: false); if (certCollection.Count > 0) { X509Certificate2 publicCert = certCollection[0]; log.LogInformation($"成功获取公钥证书:{publicCert.Subject}"); // 这里可以用公钥做验证签名、加密等操作 var rsaPublicKey = publicCert.GetRSAPublicKey(); // ... 你的业务逻辑代码 } else { log.LogError($"没找到名称为 {certName} 的证书"); } } } catch (Exception ex) { log.LogError($"获取证书出错:{ex.Message}"); } } }
4. Node.js代码示例
对于Node.js的Function,需要先配置一个关键的应用设置:WEBSITE_LOAD_CERTIFICATES,值填证书的thumbprint(可以在TLS/SSL设置里查看证书的thumbprint)或者*(加载所有上传的证书)。然后代码可以这样写:
const { app } = require('@azure/functions'); const { X509Certificate } = require('crypto'); const fs = require('fs'); const path = require('path'); app.timer('GetPublicKeyCert', { schedule: '0 */5 * * * *', handler: async (timerContext) => { try { const targetThumbprint = process.env.MY_CERT_THUMBPRINT; // Azure Function会把加载的证书放在这个目录下 const certDir = path.join(process.env.WEBSITE_HOME_DIR, 'certificates'); // 遍历目录找对应thumbprint的证书 const certFiles = fs.readdirSync(certDir); for (const file of certFiles) { const certPath = path.join(certDir, file); const cert = new X509Certificate(fs.readFileSync(certPath)); // 注意thumbprint格式要匹配(去掉冒号,大小写一致) if (cert.fingerprint.replace(/:/g, '') === targetThumbprint.replace(/:/g, '')) { console.log(`成功获取公钥证书:${cert.subject}`); // 获取公钥用于后续操作 const publicKey = cert.publicKey; // ... 你的业务逻辑 break; } } } catch (error) { console.error(`获取证书失败:${error.message}`); } } });
四、一些注意事项
- 上传的公钥证书必须是
.cer格式,编码为Base64或DER,Azure不支持其他格式的公钥证书。 - 不管是哪种运行时(C#、Node.js等),Function App的运行环境都默认有权限访问这些证书,不需要额外配置权限。
- 如果用的是消耗计划,冷启动时证书可能还没加载完成,建议在代码里加个简单的重试逻辑,避免首次执行失败。
内容的提问来源于stack exchange,提问作者Jasmine
相关产品推荐
相关产品推荐

