ASP.NET Core应用报证书不匹配错误,为何Postman无此问题?
问题场景
ASP.NET Core客户端调用接口时,在以下代码行触发错误:
... var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); HttpResponseMessage response = await client.PostAsync(tokenEndpoint, content); ...
报错信息:
SSL连接无法建立:AuthenticationException: 根据验证流程,远程证书无效:RemoteCertificateNameMismatch。
已确认token端点地址正确,未收到401、403等权限类响应;使用Postman测试该端点可正常运行,且Postman默认关闭了“SSL配置”和“CA证书”验证。已将API服务器证书导入客户端所在机器,但问题仍未解决,疑问:为何Postman不会报证书名称不匹配错误?
原因解析
Postman默认跳过SSL证书验证:Postman默认关闭的“SSL配置”本质是禁用了SSL证书的有效性校验,包括证书域名匹配、证书链信任等检查。只要能建立加密连接,Postman就会忽略证书的各类验证错误,自然不会触发
RemoteCertificateNameMismatch这类域名不匹配的报错。.NET HttpClient默认严格校验证书:.NET的
HttpClient默认会严格执行SSL证书的完整验证流程,其中就包括检查证书的域名(证书的CN字段或SAN扩展)是否与请求的tokenEndpoint域名完全一致。你导入服务器证书只能解决“证书不受信任”的问题,但当前错误是证书域名和请求域名不匹配,所以导入证书无法解决该问题。补充:如果是测试环境临时调试,可以给
HttpClient配置自定义验证回调忽略域名不匹配,但生产环境绝对禁止这种操作,必须确保服务器证书的域名与请求地址一致,且证书由受信任CA签发。
内容的提问来源于stack exchange,提问作者user2835586

