TrustKit
TrustKit 是一个开源框架,可在任何 iOS 12+、macOS 10.13+、tvOS 12+ 或 watchOS 4+ 应用中轻松部署 SSL 公钥固定和报告;它支持 Swift 和 Objective-C 应用。
如果您需要在您的 Android 应用程序中启用 SSL 签名/报告,我们还在 https://github.com/datatheorem/TrustKit-Android 发布了 TrustKit for Android。
概述
TrustKit 提供以下功能
- 简单的 API,用于配置 SSL 公钥固定策略并在应用程序内执行它。策略设置基于HTTP 公钥固定规范。
- 通过对证书的主题公钥信息进行固定,实现了合理的实现,而不是证书本身或公钥位。
- 报告机制,通知服务器有关在应用程序内发生的公钥固定验证失败,当检测到意外证书链时。这与 HPKP 规范中描述的 report-uri 指令类似。报告机制也可以通过利用 TrustKit 发送的公钥验证通知来自定义应用程序中的报告。
- 通过交换App的NSURLConnection和NSURLSession代理来开启自动加载数据功能,从而将验证功能添加到App的HTTPS连接中;这样可以部署TrustKit而不需要修改App的源代码。
入门
- 阅读入门指南。
- 查看API文档。
- TrustKit最初在Black Hat USA 2015发布,并在PayPal的工程博客上介绍。
示例用法
在App中部署SSL锁定需要初始化TrustKit并配置锁定策略(域名、Subject Public Key Info散列以及附加设置)。
可以在这App的Info.plist
中配置策略。
也可以通过程序代码设置锁定策略
NSDictionary *trustKitConfig =
@{
kTSKSwizzleNetworkDelegates: @NO,
kTSKPinnedDomains : @{
@"www.datatheorem.com" : @{
kTSKExpirationDate: @"2017-12-01",
kTSKPublicKeyHashes : @[
@"HXXQgxueCIU5TTLHob/bPbwcKOKw6DkfsTWYHbxbqTY=",
@"0SDf3cRToyZJaMsoS17oF72VMavLxj/N7WBNasNuiR8="
],
kTSKEnforcePinning : @NO,
},
@"yahoo.com" : @{
kTSKPublicKeyHashes : @[
@"TQEtdMbmwFgYUifM4LDF+xgEtd0z69mPGmkp014d6ZY=",
@"rFjc3wG7lTZe43zeYTvPq8k4xdDEutCmIhI5dn4oCeE=",
],
kTSKIncludeSubdomains : @YES
}
}};
[TrustKit initSharedInstanceWithConfiguration:trustKitConfig];
在Swift应用程序中也可以程序化地设置策略
let trustKitConfig = [
kTSKSwizzleNetworkDelegates: false,
kTSKPinnedDomains: [
"yahoo.com": [
kTSKExpirationDate: "2017-12-01",
kTSKPublicKeyHashes: [
"JbQbUG5JMJUoI6brnx0x3vZF6jilxsapbXGVfjhN8Fg=",
"WoiWRyIOVNa9ihaBciRSC7XHjliYS9VwUGOIud4PB18="
],]]] as [String : Any]
TrustKit.initSharedInstance(withConfiguration:trustKitConfig)
初始化TrustKit后,可以从TrustKit单例中获取一个TSKPinningValidator
实例,并可用于在App的网络代理中执行SSL锁定验证。例如在一个NSURLSessionDelegate中
- (void)URLSession:(NSURLSession *)session
task:(NSURLSessionTask *)task
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler {
{
TSKPinningValidator *pinningValidator = [[TrustKit sharedInstance] pinningValidator];
// Pass the authentication challenge to the validator; if the validation fails, the connection will be blocked
if (![pinningValidator handleChallenge:challenge completionHandler:completionHandler])
{
// TrustKit did not handle this challenge: perhaps it was not for server trust
// or the domain was not pinned. Fall back to the default behavior
completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil);
}
}
有关更多信息,请参阅入门指南。
致谢
TrustKit是由Data Theorem和雅虎移动团队共同协作的结果。有关详细信息,请参阅<码>AUTHORS。
许可协议
TrustKit是以MIT许可证发布的。有关详细信息,请参阅LICENSE
文件。