问题标签 [security-framework]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - 移动应用中的证书信任验证
当我的应用程序第一次连接到服务器上的帐户时,服务器会生成并返回一个 PKCS12 文件,其中包含来自服务器的私钥和自签名证书。
此主密钥的目的是 a) 解密服务器发送给它的数据,以及 b) 签署请求,以便服务器可以验证客户端的身份。
SecTrustEvaluate
在这种情况下有什么意义吗?我没有使用证书以任何方式验证服务器的身份,仅用于数据的解密/签名。目前我有:
这与 kSecTrustResultRecoverableTrustFailure 失败 - 几乎可以肯定是由于自签名证书。
如果需要(或强烈建议),有人可以指出我需要做些什么来解决这个问题吗?
ios - iOS 钥匙串:SecItemUpdate 在更新 kSecAttrAccessible 时返回 -50 (paramErr)
我需要更新钥匙串条目的 kSecAttrAccessible。我不需要更新实际数据,只需更新可访问性属性。
首先,我尝试找到该项目以确保我的查询字典是好的:
此行成功找到我要查找的项目(返回代码为 0)。
然后我使用相同的查询更新 kSecAttrAccessible 属性:
此时,updateItemStatus 为 -50 (paramErr)。
我看过这个帖子:Is it possible to update a Keychain item's kSecAttrAccessible value?
但是我的问题是不同的。即使我将 kSecValueData 添加到我的updatedAttributes
. 此外,文档还指出我们只需要为 iOS 4 和更早版本添加 kSecValueData。我支持 iOS 7 及更高版本,所以这不应该是我的问题。
谁能指出我在这里缺少什么?非常感谢。
ios - 在 OS X 上登录,在 iOS 和 OSStatus 上验证 -9809
我正在使用 Apple 的安全框架。我能够在 OS X 上签名并成功验证所有内容,但是当我尝试SecKeyRawVerify
在 iOS 上使用时,它失败并出现 -9809 错误。
我玩过各种 PKCS 填充选项和许多其他属性,但我无法正确验证。
请注意,下面的代码可能到处都有泄漏,只是试图首先使其正常运行。
OS X 签名代码:
和iOS验证码:
我使用以下 OpenSSL 命令通过命令行创建了私钥和公钥:
任何帮助是极大的赞赏。
ios - Swift 中的 SecAccessControlCreateWithFlags()
我正在尝试从 swift 代码中调用 Security.framework 中的函数。如果我这样调用函数,请暂时忘记“错误输出”(最后一个)参数:
我得到以下错误:
找不到接受“(CFAllocator!,CFStringRef,SecAccessControlCreateFlags,nil)”类型参数列表的“SecAccessControlCreateFlags”类型的初始化程序
...但是,如果我将代码重新格式化为以下内容:
(特定类型——例如CFAllocatorRef
——取自 Xcode 的自动完成功能原型)......它编译没有问题。这是怎么回事?
接下来是错误参数。我应该通过什么?迁移我的 Objective-C 代码时,我很想传递以下变量(&
当然,前面带有 ):
...这给出了错误:
无法使用类型为“(CFAllocatorRef!,AnyObject!,SecAccessControlCreateFlags,inout CFErrorRef!)”的参数列表调用“SecAccessControlCreateWithFlags”
相反,如果我传递以下变量(同样,前面带有地址运算符):
(与原型自动完成建议的类型相同),我得到:
无法使用类型为“(CFAllocatorRef!,AnyObject!,SecAccessControlCreateFlags,inout UnsafeMutablePointer?>)”的参数列表调用“SecAccessControlCreateWithFlags”
......那么,什么给了?
编辑:忘记错误参数。我似乎将地址取了两次(即指向指针的指针)。相反,我应该这样做:
来源:此答案中的示例代码。
ios - IOS 安全框架 p12 和到期日期
我正在尝试从 p12 数据中提取到期日期。我从头到尾阅读了苹果文档,但无法找到如何去做 - https://developer.apple.com/library/prerelease/mac/documentation/Security/Conceptual/CertKeyTrustProgGuide/CertKeyTrustProgGuide.pdf
我在pdf中的代码,我正在使用带有私钥p12数据的NSData加载SecKeyRef,并且能够解密在服务器上加密的数据。
问题是我试图阻止在 p12 过期时进行解密,但我无法检测到密钥何时过期。
在java上,解决方案非常简单
任何人都知道如何在 ios 上做同样的事情?
编辑:还附上苹果论坛上的问题 https://forums.developer.apple.com/message/53696#53696 谢谢
swift - SecTransformExecute() 使用 EXEC_BAD_ACCESS 使应用程序崩溃
我有一个私钥/公钥对,我正在尝试用它们中的任何一个加密一个字符串。该代码在 OSX 10.11 和 Xcode 7.2 上运行
以上失败得很惨,导致应用程序在运行时崩溃EXEC_BAD_ACCESS
。没有错误,什么都没有。
我的研究表明,可能存在与显式指定kSecPaddingPKCS1Key
而不是 NULL 相关的错误,默认情况下会将填充设置为 PKCS1。但是,我无法将此值设置为 NULL,因为 Swift 已将其替换为 nil 并且不能在此位置使用。
app-store - 如何在 tvOS 上提取和解码 ASN.1 消息?
我想从 tvOS 应用程序的 App Store 收据中提取一些信息。我以为我可以使用安全框架,但是缺少以下两个头文件:
在 OS X SDK 中,这些头文件存在。是否从公共 tvOS SDK 中删除了 ASN.1 支持?我必须使用 OpenSSL 来处理收据吗?
objective-c - 在 os x 中创建 DER 证书
这个问题很简单。如何仅使用 SecurityFramework API 在 osx 中创建 x509 证书。我想用我用 SecKeyGeneratePair 生成的公钥创建证书。
到目前为止,我只在文档中找到了方法 SecCertificateCreateWithData,但这已经需要一个 x509 证书作为参数,所以这对我来说不起作用。我找不到任何可以从头开始创建证书的方法。我对这个话题也不是很有经验,所以我很可能在这里遗漏了一些东西。任何帮助是极大的赞赏。
我的项目也不能选择使用 openSSL 或任何已弃用的 API。
我已经遇到过这个问题,在 Objective-C 中使用安全框架以编程方式创建 x509 证书,但是由于这已经有一年了,我想知道现在是否有可能这样做,
ios - 在 iOS 上运行时创建 PKCS12 而不使用 openssl
我的 iOS 应用程序在运行时处理 x509 证书 + 密钥(DER 编码)。我能够成功地将它们导入钥匙串的唯一方法是使用 PKCS12 使用以下功能:SecPKCS12Import()
我一直在努力让它运行仅使用SecItemAdd()
. 我将该函数用于 DER 编码证书,并再次用于 DER 编码密钥。但即使调用成功返回,之后查询钥匙串也不会产生SecIdentityRef
.
所以我最终使用了 OpenSSL PKCS12 实现。我非常热衷于摆脱对 OpenSSL 的依赖。我一直在寻找 PKCS12 的替代实现。我发现的唯一替代库托管在苹果开源存储库中:
https ://opensource.apple.com/source/Security/Security-57031.10.10/Security/libsecurity_pkcs12/
尽管这是一个 OS X 项目,它(我想)对安全框架的其他模块有很多依赖。在我开始深入研究之前
我想知道:
- 我有机会在 iOS 上运行 libsecurity_pkcs12 吗?
- 或者更好:是否有任何我不知道的替代小型 PKCS12 库?
SecIdentityRef
甚至更好:有没有人在不使用 PKCS12的情况下将x509 + 密钥导入 iOS 钥匙串(之后产生一个)?
macos - Mac Launch Daemon 保存后无法从系统钥匙串中检索密码
我们有一个启动守护程序,它(出于各种原因必然)以 root 身份运行,并通过网络与服务器组件通信。它需要通过服务进行身份验证,因此当它首次获取密码时,我们将其保存到系统钥匙串中。在随后的启动中,想法是从钥匙串中检索密码并使用它与网络服务进行身份验证。
这一直运行良好,但在 macOS 10.12 上,现有代码停止工作,我们完全不知道如何解决这个问题。归结为:
无论我们是保存新密码还是检索旧密码,我们都使用以下方法获取对系统钥匙串的引用:
我们还禁用了用户交互,尽管我们希望它在守护进程的上下文中已经关闭。
将新密码保存到钥匙串时,我们使用
这很管用。报成功,可以在Keychain Access.app的“system”keychain中看到item。
在我们的守护进程的后续运行中检索它是通过以下行完成的:
errSecAuthFailed
不幸的是,由于我们不清楚的原因,这已经开始回归。
我们检查了一些额外的细节和我们尝试过的事情,但无济于事:
- 守护程序二进制文件使用 Developer Id 证书进行签名。
- 守护程序二进制文件包含一个嵌入的 Info.plist 部分,其中包含捆绑 ID 和版本。
- 我可以在 Keychain Access.app 中密码项的“访问控制”选项卡中的“始终允许这些应用程序访问”列表中看到守护程序二进制文件。
- 如果我在钥匙串访问中手动切换到“允许所有应用程序访问此项目”,它就可以工作。然而,这在某种程度上违背了将密码保存在钥匙串中的意义。
- 我们尝试过使用 to 的参数
SecKeychainAddInternetPassword
,但这似乎没有任何区别。 - 我们已经尝试使用 显式解锁钥匙串
SecKeychainUnlock()
,但正如文档所示,这似乎是多余的。 - 如您所料,删除
Keychain Access.app
导致SecKeychainFindInternetPassword()
yield中的项目。errSecItemNotFound
所以它肯定可以找到保存的项目,只是不允许读取它。
钥匙串文档不是很容易阅读,而且部分内容是重言式的。(“为了做 Y,你需要做 Y”,而没有提到你为什么想做 Y。)不过,我认为我已经完成并理解了其中的大部分内容。没有详细介绍我们特定设置的各个方面(从守护程序访问),但很明显,访问以前由同一应用程序保存的项目不需要任何特殊授权或身份验证。这与我们所看到的行为直接矛盾。
有任何想法吗?