开发环境下如何信任/忽略ASP.NET Core API的TLS证书验证?
解决开发环境下ASP.NET Core API的TLS证书信任问题
你碰到的这个错误,核心原因是ASP.NET Core在开发环境默认用的是自签名SSL证书,而你的客户端(这里是iOS/macOS的URLSession)会默认拒绝信任这类未被系统官方认可的证书。既然你明确是开发场景、不关心安全风险,确实可以临时跳过证书检查,但一定要记死:绝对不能把这个逻辑放到生产环境里!
方法一:自定义URLSession跳过证书验证
你可以创建一个忽略证书检查的自定义URLSession,替换默认的URLSession.shared来发起请求,代码示例如下:
// 创建自定义会话配置 let config = URLSessionConfiguration.default // 实现自定义Delegate,处理证书验证逻辑 class TrustAllCertificatesDelegate: NSObject, URLSessionDelegate { func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { // 直接信任所有服务器证书 completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!)) } } // 初始化带自定义Delegate的URLSession let trustAllSession = URLSession(configuration: config, delegate: TrustAllCertificatesDelegate(), delegateQueue: nil) // 用这个自定义会话发起POST请求 let jsonData = try? JSONSerialization.data(withJSONObject: data) let url = URL(string: "https://192.168.0.100:5001/api/Trips")! var request = URLRequest(url: url) request.httpMethod = "POST" request.httpBody = jsonData let task = trustAllSession.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { print(error?.localizedDescription ?? "Unknown error occurred") return } if let responseJSON = try? JSONSerialization.jsonObject(with: data) as? [String: Any] { // 处理返回的JSON数据 print(responseJSON) } } task.resume()
更规范的开发环境方案:信任自签名证书
如果不想让代码带上不安全的逻辑,你也可以把ASP.NET Core的开发证书添加到系统信任列表里,这样URLSession就不会再报错了:
- Windows:找到ASP.NET Core开发证书(通常在
%USERPROFILE%\.aspnet\https目录下),双击导入到「受信任的根证书颁发机构」 - macOS:打开「钥匙串访问」,找到对应的ASP.NET Core开发证书,右键选择「显示简介」,在「信任」选项卡设置「使用此证书时」为「始终信任」
这个方案更干净,也不会留下安全隐患,推荐在开发时优先使用。
重要警告
再强调一次:跳过证书验证的代码只能用于本地开发测试,一旦到生产环境,必须使用正规CA颁发的SSL证书,否则会导致用户数据泄露、被中间人攻击等严重安全问题!
内容的提问来源于stack exchange,提问作者ivan.vliza




