VNet集成App Service上传Blob至私有端点存储时证书验证失败求助
问题场景
属于VNet集成的App Service向同一网络中受私有端点保护的存储容器上传Blob时,抛出以下错误:
Azure.RequestFailedExecption. 基础连接已关闭。无法为SSL/TLS安全通道建立信任关系。
System.Net.WebException: 基础连接已关闭。无法为SSL/TLS安全通道建立信任关系。
System.Security.Authentication.AuthenticationException. 远程证书验证无效。
已尝试降低Web和存储服务的TLS版本,问题未解决。
核心原因
出现该错误的核心是DNS解析不匹配导致证书验证失败:存储账户的私有端点依赖私有DNS将公共域名解析到私有IP,但App Service未正确获取到这个解析结果,导致请求要么指向存储账户的公共IP(被私有端点拦截),要么直接访问私有IP(证书与IP不匹配),最终触发SSL/TLS信任校验失败。
解决步骤
配置私有DNS区域关联
为存储账户的Blob服务创建或关联对应的Azure私有DNS区域(privatelink.blob.core.windows.net),并将App Service所在的VNet链接到该私有DNS区域。确保App Service能将存储账户的Blob端点域名解析到私有IP地址,这样请求走私有网络,且访问的域名与证书绑定的域名一致,通过SSL校验。确认VNet集成类型
确保App Service使用的是区域VNet集成(而非传统网关集成),区域集成支持直接访问VNet内的私有端点,无需额外网关配置。同时检查集成子网的NSG规则,允许出站443端口流量到存储账户的私有IP段。验证证书信任链
- Windows App Service默认信任Azure根证书,无需额外配置;
- 若使用Linux自定义镜像,需手动导入Azure根CA证书。可在App Service控制台执行命令
openssl s_client -connect <你的存储账户名>.blob.core.windows.net:443,检查返回的证书链是否完整、可信。
禁止直接访问私有IP
不要通过存储账户的私有IP直接访问Blob服务,必须使用存储账户的官方Blob端点域名(如xxx.blob.core.windows.net),依赖私有DNS解析到私有IP,保证证书域名匹配。检查存储账户防火墙设置
确认存储账户的防火墙已禁用公共访问(或仅允许私有网络访问),确保流量只能通过私有端点进入存储服务,避免公共网络请求干扰。
内容的提问来源于stack exchange,提问作者shedev

