var secresult = SecTrustResultType.invalid
let status = SecTrustEvaluate(serverTrust, &secresult)
if errSecSuccess == status {
// Proceed with evaluation
switch result {
case .unspecified, .proceed: return true
default: return false
}
}
字符串 我写// Proceed with evaluation部分的原因是因为你应该验证secresult,这可能意味着证书实际上是无效的。你可以选择覆盖它,并添加任何提出的问题作为例外,最好在提示用户做出决定之后。
应该是这样的:
if SecTrustEvaluateWithError(server, nil) {
// Certificate is valid, proceed.
}
这个问题很老了,所有的答案可能都是正确的。但是对于2021年之后遇到这个问题的人来说,现在有一个**official no-code solution described by Apple in a short blog article**。 它基于 App Transport Security 的概念,在macOS和iOS上的所有应用上强制执行加密网络连接。现在,您只需将服务器URL及其(CA)证书哈希列表添加到Info.plist中即可将其固定。如果您的端点的证书与哈希不匹配,URLSession将返回证书错误,您可以像处理任何其他网络错误一样处理该错误。 在你的Info.plist中,你可以像这样添加它(来自Apple的示例代码):
8条答案
按热度按时间zf2sa74q1#
**Swift 3+**更新:
只需为
NSURLSessionDelegate
定义一个委托类并实现didReceiveChallenge函数(* 此代码改编自objective-c OWASP示例 *):字符串
(you可以找到Gist for Swift 2 here - from the initial answer)
然后使用
openssl
为网站创建.der
文件型
并将其添加到xcode项目中。仔细检查它是否存在于
Copy Bundle Resources
列表中的Build phases
选项卡中。否则将其拖放到该列表中。最后,在代码中使用它来发出URL请求:
型
00jrzges2#
多亏了这个网站上的例子:https://www.bugsee.com/blog/ssl-certificate-pinning-in-mobile-applications/,我构建了一个固定公钥而不是整个证书的版本(如果定期更新证书,会更方便)。
**更新:**删除了强制解包并替换了SecTrustEvaluate。
字符串
r3i60tvu3#
这是Swift 3的更新版本
字符串
2eafrhcq4#
保存您的网站的证书(作为.cer文件)在主包中。然后使用this URLSessionDelegate方法:
字符串
...
型
kse8i1jr5#
提醒一下,
SecTrustEvaluate
已被弃用,应替换为SecTrustEvaluateWithError
。所以这个:
字符串
我写
// Proceed with evaluation
部分的原因是因为你应该验证secresult
,这可能意味着证书实际上是无效的。你可以选择覆盖它,并添加任何提出的问题作为例外,最好在提示用户做出决定之后。应该是这样的:
型
第二个参数将捕获任何错误,但如果您对细节不感兴趣,则可以传递
nil
。kknvjkwl6#
@lifeisfoo的答案中的
openssl
命令将在OS X中为某些使用ECDSA等较新密码的SSL证书提供给予错误。如果在@lifeisfoo的回答中运行
openssl
命令时出现以下错误:字符串
您网站的SSL证书可能使用的算法在OS X的默认
openssl
版本(v0.9.X,不支持ECDSA等)中不受支持。这里是修复:
要获得正确的
.der
文件,您必须首先执行brew install openssl
,然后将来自@lifeisfoo的答案的openssl
命令替换为:/usr/local/Cellar/openssl/1.0.2h_1/bin/openssl [rest of the above command]
个Homebrew install命令:
型
希望能帮上忙。
d4so4syb7#
你可以试试这个
字符串
来源:https://www.steveclarkapps.com/using-certificate-pinning-xcode/
nlejzf6q8#
这个问题很老了,所有的答案可能都是正确的。但是对于2021年之后遇到这个问题的人来说,现在有一个**official no-code solution described by Apple in a short blog article**。
它基于 App Transport Security 的概念,在macOS和iOS上的所有应用上强制执行加密网络连接。现在,您只需将服务器URL及其(CA)证书哈希列表添加到
Info.plist
中即可将其固定。如果您的端点的证书与哈希不匹配,URLSession
将返回证书错误,您可以像处理任何其他网络错误一样处理该错误。在你的
Info.plist
中,你可以像这样添加它(来自Apple的示例代码):字符串
要获取SHA256 Base 64哈希值,请下载服务器的公共证书(通常您可以使用浏览器轻松完成此操作)并在其上运行以下OpenSSL命令:
型