我正在尝试从Mac OS X 10.9.4上的.p12Keychain Access.app中提取不可提取的私钥作为/usr/bin/security文件。





基本上,看来security import有一个-x选项来指定private keys are non-extractable after being imported


http://opensource.apple.com/source/SecurityTool/SecurityTool-55115/keychain_import.c
http://opensource.apple.com/source/Security/Security-55471.14/libsecurity_keychain/lib/SecImportExport.h

如上所述,这是通过在导入过程中显式省略CSSM_KEYATTR_EXTRACTABLE来实现的。随后,当尝试导出时,没有此类属性的密钥无法导出。

我可以发现至少有两个相关的提及似乎阻止了此类密钥的导出(提示:请使用fgrep -OR避免遵循搜索Apple源代码时的符号链接):


http://opensource.apple.com/source/Security/Security-55471.14/libsecurity_keychain/lib/SecImportExportCrypto.cpp
http://opensource.apple.com/source/Security/Security-55471.14/libsecurity_pkcs12/lib/pkcs12Crypto.cpp


我已经尝试从github.com/torsten进行keychain_access ,但它不起作用。

我尝试使用lldb lldb -- security export -t identities -f pkcs12 -o /tmp/mycerts.p12中断SecWrappedKeys.cpp :: impExpWrappedKeyOpenSslExport(),但对于break impExpWrappedKeyOpenSslExport似乎也不起作用发出错误invalid command 'breakpoint impExpWrappedKeyOpenSslExport'

我尝试使用DTrace跟踪Cisco AnyConnect,但是我对DTrace不够了解,无法显示数据结构。尝试重新编译他的Security和SecurityTool软件包,但是它们似乎都需要引导,而引导似乎没有就位。

#1 楼

通过研究对我的一个钥匙串子问题的答案,我已经找到了解决方案。



https://stackoverflow.com/questions/25109994/non-extractable-

根据SecItem.h,此kSecAttrIsExtractable已在OS X 10.6中引入。


http://opensource.apple.com/source/Security/Security-55471.14/libsecurity_keychain/lib/SecItem.h

因此,我已经尝试并成功完成了以下任务:


从OS X 10.9到OS X 10.5的scp ~/Library/Keychains/login.keychain

在OS X 10.5上,按照手册页中的示例:

security export -k /tmp/login.keychain -t identities -f pkcs12 -o /tmp/mycerts.p12

security应用程序将询问您几个密码:


第一个对话框中的新密码是为了保护正在导出的p12;
第二个对话框中一个是login.keychain密码,通常与密钥链文件所来自的原始OS X 10.9上的用户登录密码相同。


scp /tmp/mycerts.p12 ba从10.5 ck到OS X 10.9


#2 楼

我发现了使用断链器叉的更简单方法。它适用于MacOS 10.14 Mojave。在此处查看完整说明。

对于我而言,我执行了以下操作:

$ pip2 install hexdump pycrypto pyopenssl
$ git clone https://github.com/gremwell/chainbreaker.git && cd chainbreaker
$ python2 chainbreaker.py -f ~/Library/Keychains/login.keychain-db -p <PASS>
$ openssl x509 -inform DER -in exported/associated/1/*.crt -out secret.crt
$ openssl rsa -inform DER -in exported/associated/1/*.key -out secret.key
$ openssl pkcs12 -export -out secret.p12 -inkey secret.key -in secret.crt


然后secret.p12可以导入另一个机器。