当前位置: 首页 > wzjs >正文

江西个人网站备案做论坛seo优化网站源码

江西个人网站备案做论坛,seo优化网站源码,网页设计与网站建设 1.班级网站. 2.个人主页. 3.求职招聘.,免费网络电话软件哪个好用引言 在移动应用安全领域,HTTPS/TLS 是数据传输的第一道防线,但仅依赖系统默认的证书验证仍有被中间人(MITM)攻击的风险。Certificate Pinning(证书固定)通过将客户端信任“钉”在指定的服务器证书或公钥上…

引言

在移动应用安全领域,HTTPS/TLS 是数据传输的第一道防线,但仅依赖系统默认的证书验证仍有被中间人(MITM)攻击的风险。Certificate Pinning(证书固定)通过将客户端信任“钉”在指定的服务器证书或公钥上,彻底杜绝了伪造证书带来的隐患,是面向金融、医疗、支付等高安全场景的必备防护手段。


为什么要做证书固定

  • 防范中间人攻击(MITM)
    攻击者可能在公共网络或被劫持的路由中插入自签或盗取的证书,绕过系统验证,让用户数据泄露或被篡改。
  • 抵御企业/校园 HTTPS 代理
    有些网络环境部署了 HTTPS 解密代理,虽然系统层面信任了其根证书,但应用层可通过固定真实服务器证书拒绝代理中转。
  • 满足合规审计
    金融、医疗等行业对通信安全有严格审计要求,证书固定可证明客户端仅信任预定义的证书或公钥。

核心原理与验证流程

  1. 预嵌入证书或公钥

    • 将服务器证书(.cer)或对应公钥哈希(Base64)打包进 App Bundle。
  2. 拦截 TLS 验证回调

    • URLSessionDelegatedidReceiveChallenge 中,先调用系统的 SecTrustEvaluate 完成基础验证,再进行自定义校验。
  3. 提取公钥并计算哈希

    • 从服务器返回的证书中提取公钥数据,对其执行 SHA-256 运算,生成 Base64 编码的哈希值。
  4. 哈希比对并决策

    • 将计算所得哈希与预置的“钉扎”值对比:

      • 匹配 → 继续通信(.useCredential(trust:)
      • 不匹配 → 拒绝连接(.cancelAuthenticationChallenge

实现示例

1. 原生 NSURLSession 公钥固定

class PinnedDelegate: NSObject, URLSessionDelegate {// 本地存储的公钥哈希(Base64 编码)private let pinnedHash = "Base64EncodedPublicKeyHashHere"func urlSession(_ session: URLSession,didReceive challenge: URLAuthenticationChallenge,completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {// 1. 检查是否为 ServerTrust 验证guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust,let trust = challenge.protectionSpace.serverTrust else {completionHandler(.performDefaultHandling, nil)return}// 2. 系统默认验证var result = SecTrustResultType.invalidguard SecTrustEvaluate(trust, &result) == errSecSuccess,(result == .unspecified || result == .proceed) else {completionHandler(.cancelAuthenticationChallenge, nil)return}// 3. 提取服务器证书并获取公钥数据guard let cert = SecTrustGetCertificateAtIndex(trust, 0),let pubKey = SecCertificateCopyKey(cert),let pubData = SecKeyCopyExternalRepresentation(pubKey, nil) as Data? else {completionHandler(.cancelAuthenticationChallenge, nil)return}// 4. 计算 SHA-256 哈希let hash = sha256(pubData).base64EncodedString()// 5. 与预置哈希对比if hash == pinnedHash {completionHandler(.useCredential, URLCredential(trust: trust))} else {completionHandler(.cancelAuthenticationChallenge, nil)print("🚨 公钥哈希不匹配,证书固定校验失败")}}private func sha256(_ data: Data) -> Data {var buf = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))data.withUnsafeBytes { _ = CC_SHA256($0.baseAddress, CC_LONG(data.count), &buf) }return Data(buf)}
}// 使用方式
let session = URLSession(configuration: .default,delegate: PinnedDelegate(),delegateQueue: nil)
session.dataTask(with: URL(string: "https://api.yourdomain.com/data")!).resume()

2. Alamofire 整证书固定

import Alamofire// 1. 从 Bundle 加载本地 .cer
let url = Bundle.main.url(forResource: "server", withExtension: "cer")!
let cert = SecCertificateCreateWithData(nil, try! Data(contentsOf: url) as CFData)!// 2. 配置 ServerTrustManager
let evaluators: [String: ServerTrustEvaluating] = ["api.yourdomain.com":PinnedCertificatesTrustEvaluator(certificates: [cert],acceptSelfSignedCertificates: false,performDefaultValidation: true,validateHost: true)
]let manager = ServerTrustManager(evaluators: evaluators)
let session = Session(serverTrustManager: manager)// 3. 发起请求
session.request("https://api.yourdomain.com/data").validate().responseJSON { response inswitch response.result {case .success:print("✔️ 证书固定验证通过")case .failure(let error):print("❌ 验证失败:\(error)")}}

3. AFNetworking 公钥固定

#import "AFNetworking.h"// 1. 确保将 server.cer 放入 App Bundle
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer  = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];// 2. 配置公钥固定(Public Key Pinning)
AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
// 不允许无效证书
policy.allowInvalidCertificates = NO;
// 必须校验域名
policy.validatesDomainName = YES;
manager.securityPolicy = policy;// 3. 发起 GET 请求
[manager GET:@"https://api.yourdomain.com/data"parameters:nilheaders:nilprogress:nilsuccess:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {NSLog(@"✔️ 请求成功并通过公钥固定校验:%@", responseObject);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {NSLog(@"❌ 请求失败或证书固定校验失败:%@", error);}];

实践建议

  • 优先使用公钥固定:对证书更新更具兼容性。
  • 结合远程配置动态更新:如 Firebase Remote Config,下发最新哈希,降低 App 发布频率。
  • 限定固定规则数量:仅对核心域名或关键 CA 进行固定,避免过度复杂。
  • 完整测试与监控:在预发布环境模拟证书换新,确保校验逻辑可用,并对失败情况设置告警。

结语

本文从“为什么要做证书固定”到“核心验证流程”,再到三种主流网络框架(原生 NSURLSession、Alamofire、AFNetworking)的实战示例,帮助初学者系统掌握 iOS 证书固定的落地方案。做好 Certificate Pinning,为你的应用网络通信再添一道牢不可破的安全防线。

扩展阅读

  • 苹果官方文档:Networking and Security → Secure Connections
  • OWASP Mobile Top 10 → M3: Insufficient Cryptography

http://www.dtcms.com/wzjs/270915.html

相关文章:

  • 做网站内容字体多少ptseo描述是什么意思
  • 长沙做网站品牌山东关键词优化联系电话
  • 电商网站设计思想电商营销策略
  • 桂城网站建设费用危机舆情公关公司
  • 手机制作网站开发外贸seo软文发布平台
  • 宁波网页网站制作百度账号客服24小时人工电话
  • wordpress主题软件杭州seo公司
  • 网络营销服务有哪些关键词优化公司靠谱推荐
  • 单位网站等级保护必须做吗百度蜘蛛池自动收录seo
  • 临汾尚世互联网站建设2022年国际十大新闻
  • 怎样在赶集微网站做微招聘搜索引擎下载入口
  • 招代理的网站建设公司免费b站推广网站在线
  • 建设网站是什么样的代刷网站推广快速
  • 网站关键词seo费用拉新app推广平台排名
  • 如何用手机做钓鱼网站网站关键字排名优化
  • 专业教育网站建设江苏百度推广代理商
  • 网站域名到期如何续费站长
  • 大一网站开发体会深圳百度快照优化
  • 如何编写网站上海优化排名网站
  • wang域名注册网站百度关键词搜索怎么做
  • 九江网站制作足球比赛直播2021欧冠决赛
  • 电器网站制作价格宁波正规站内优化seo
  • 网站全屏大图代码网络营销的特点有哪些
  • 公司的网站建设公司网站建设什么叫口碑营销
  • 上海的最新新闻广州aso优化公司 有限公司
  • 廊坊高端模板建站泉州seo
  • 深圳营销型网站建设-龙华信科代写平台在哪找
  • 兄弟网络(西安网站建设制作公司)中国腾讯和联通
  • 个人电影网站建设湖南正规seo优化报价
  • 做问卷有哪些网站数字营销包括哪六种方式