GCXTrustPolicy
SSL-pinning和信任验证框架,适用于iOS。
针对Swift进行了优化,同时也适用于原始的Objective-C。
概述
用户、开发者和应用都期望在他们的安全通道上获得端到端的安全性,但有些安全通道并没有达到这种预期。特别是,使用众所周知的协议(如VPN、SSL和TLS)构建的通道可能容易受到多种攻击。这就是SSL验证发挥作用的地方,它防止中间人攻击和其他漏洞。这个框架旨在作为一个可自定义的插入解决方案,使SSL验证更加舒适和可靠。
一般说明
当一个TLS证书被验证时,操作系统会验证其信任链。如果这个信任链中只包含有效的证书,并且以一个已知的(受信任的)锚证书结束,则该证书被视为有效。如果不满足这些条件,则该证书被视为无效。当使用主要供应商的商业签名证书时,证书应该“直接使用”。当使用自签名证书时,如果通过IP地址连接到主机(网络堆栈无法确定服务器的主机名)或为单个证书中未信任的多个域提供服务,证书将不会工作,并且您需要进行一些额外的工作。
安装
如果遇到问题,请查看我们的故障排除部分或提交一个 Issue。
我们将尽全力帮助您解决问题。
Carthage
github "grandcentrix/GCXTrustPolicy"
Cocoapods
use_frameworks!
pod 'GCXTrustPolicy'
Cocoa Pods
即将推出!
手册
- 开始一个新的 Xcode 工作空间。
- 创建新的应用程序
- 将 GCXTrustPolicy.xcodeproj 导入到您的工作空间
- 转到 "项目设置" -> "通用选项卡"
- 将
GCXTrustPolicy.framework
添加到 "嵌入式二进制文件" 部分 - 构建和运行
示例
一般步骤
- 将证书添加到您的项目以便固定
- 创建验证策略
- 使用安全连接(如https)执行URL请求
- URLSessionDelegate接收到身份验证挑战
- 将策略与远程信任进行验证
简单示例
// create a policy for the host:
let policy = trustManager.create(type: .pinPublicKey, hostName: "pinnedHost.com")
// >>> perform URL request to remot host <<<
// In URLSessionDelegate or NSURLConnectionDelegate callbacks retrieve the remote trust on authentication challenge:
guard let serverTrust = challenge.protectionSpace.serverTrust else { /* handle case ... */ }
// Let the policy validate the given trust:
let isTrusted = pinningPolicy.validate(trust: serverTrust)
// Reject connection to suspicious servers
if isTrusted {
// Success! Server trust has been established.
} else {
// Fail! Non-trustable server!
}
验证类型
GCXTrustPolicy提供多种验证类型
- 固定证书的公钥
- 固定证书
- 使用完整的自定义验证
- 使用操作系统的默认验证
- 禁用给定主机的验证
详细示例
有关详细示例,请参阅示例或集成测试中的Swift和ObjC示例代码。
文档
请参阅TrustPolicy.swift中的源代码文档以获取详细信息。
术语表
TLS
传输层安全(TLS)是一种加密协议,旨在为计算机网络提供通信安全性。
SSL
安全套接字层(SSL)是一种已弃用并已被TLS取代的加密协议。
证书
证书是一种数字文件,可用于SSL或TLS。它协助验证和验证主机的或网站的标识。它还可以启用交换信息的加密。
X.509
定义公共密钥基础设施(PKI)的标准,以验证公钥是否属于证书中包含的标识。
故障排除
如果在运行Objective-C项目时遇到dyld: Library not loaded: @rpath/libswiftCore.dylib
错误,请尝试将Xcode构建选项“嵌入式内容包含Swift代码”设置为“是”。
更多信息
Apple开发者文档涵盖了增强信任身份验证,请参见:[执行手动服务器信任身份验证](https://developer.apple.com/documentation/foundation/url_loading_system/handling_an_authentication_challenge/performing_manual_server_trust_authentication)
以下OWASP页面提供了关于传输层保护和视觉概述的详细资料:[传输层保护](https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet)以及整个过程:[固定](https://www.owasp.org/index.php/Pinning_Cheat_Sheet)
以下信息性博客文章提供了一些关于哪些密钥可以固定以及权衡的信息:[关于HTTP公共密钥固定的信息](https://noncombatant.org/2015/05/01/about-http-public-key-pinning/)
致谢
底层代码基于OWASP《证书和公钥固定》章节的建议和实现策略。Swift的单元测试方法灵感来源于知名的Alamofire和TrustKit。
许可证
Copyright 2017 grandcentrix GmbH
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://apache.ac.cn/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.