此问题涉及在客户端应用程序中针对Web api和证书过期使用SSL Pinning.
场景:
我拥有example.com并且有一个托管api的子域,例如:api.example.com
我希望通过SSL使用api ,因此为子域创建了SSL证书.
获得证书后,我有:
我的理解是我在我的网络服务器上安装了这些证书.
然后我希望我的客户端应用程序连接到api.为了减轻中间人攻击风格,我希望使用SSL Pinning,以便客户端只与我的api通信,而不是欺骗它的人.
为了引入客户端应用程序,我有两个选择,针对公共证书或中间证书.
假设我实现了这一点.
当api.example.com上的证书到期时会发生什么?
我的理解是客户端应用程序将不再有效.
我是否需要再次重新生成一整套公共/中间/私人物品?然后在应用程序中添加新的公共或中间证书?
问题:
在api.example.com上的证书更新之前,我仍然希望客户端应用程序能够正常运行.当然,新的证书可以放在客户端应用程序中,但是推出需要时间.
我怎么处理这个?
我已经读过Google每个月都会更新他们的证书,但不知何故设法让公钥保持不变:如何在iOS上固定证书的公钥
如果可行,那么解决方案就是从服务器中提取公钥并根据本地存储的公钥进行检查......但谷歌如何做到这一点?
谢谢
克里斯
我想在swift中使用ssl公钥固定,我读了很多例子怎么做,最后想想我找不到的是如何比较SecKey对象格式的两个公钥.例:
let serverPublicKey = SecTrustCopyPublicKey(secTrust) /*return SecKey object from actual SecTrust*/
let clientPublicKey = getLocalPublicKeyFromDer() /*return SecKey from .der local*/
Run Code Online (Sandbox Code Playgroud)
如何比较它们?现在我这样做,它的工作原理:
if(serverPublicKey! as AnyObject).isEqual(clientPublicKey){
/*Key is the same, pinning OK!*/
}
Run Code Online (Sandbox Code Playgroud)
在gitHub上找到它的方式:https://github.com/teamcarma/IOS-AlamofireDomain/blob/master/Source/ServerTrustPolicy.swift
但是转向AnyObject是一个好主意吗?如何工作isEqual在铸造的SecKey?可以解释一下吗?
PS.另一个想法是从SecKey获取base64 - 我尝试它也可以工作,但它需要一个KeyChain临时操作,看起来没有专业.
我正在使用OWASP样本进行证书和公钥锁定.该示例使用random.org,random.org最近获得了新证书.这意味着connection:didReceiveAuthenticationChallenge:失败.这是预期和良好的:)
但是,失败显示为"NSURLErrorDomain",代码为-1012.这不是很有帮助,用户将无法使用它做任何有意义的事情:
提供类似于"警告:标识网站已更改的公钥......"的文本的消息会好得多.
另一个小问题:connection:didFailWithError:我不知道-1012是否是由于钉扎失败或其他网络错误造成的.所以我想仅为证书失败提供消息,而不是其他-1012错误.
如何为调用[[challenge sender] cancelAuthenticationChallenge: challenge](在connection:didReceiveAuthenticationChallenge:失败时调用)提供"丰富的错误信息" .NSURLConnectionDelegate协议参考和NSURLAuthenticationChallengeSender协议参考未提及如何执行此操作.
ios ×2
certificate ×1
cocoa ×1
cocoa-touch ×1
iphone ×1
pinning ×1
security ×1
ssl ×1
swift ×1