从Python运行安全性导入命令与命令行具有不同的行为

时间:2016-06-13 06:53:30

标签: python macos keychain pkcs#12 pyopenssl

我正在尝试使用以下命令将pkcs#12证书导入OS X Keychain:

security import filename -k ~/Library/Keychains/login.keychain -P password -f pkcs12

在python中,我使用subprocess,如下所示:

  if os.path.isfile(_file) and platform.system() == 'Darwin':
    keychain = os.path.expanduser('~/Library/Keychains/login.keychain')
    command_line = 'security import {} -k {} -P {} -f pkcs12'.format(_file, keychain, password)
    logger.info('Importing {} into OS X KeyChain.'.format(_file))
    return subprocess.call(shlex.split(command_line))

但是我收到此错误消息:

security: SecKeychainItemImport: One or more parameters passed to a function were not valid.

我甚至尝试过使用shell=True,但后来我得到了security用法,好像我已经通过了一些错误的论点。

Usage: security [-h] [-i] [-l] [-p prompt] [-q] [-v] [command] [opt ...]
...
...

但是,从命令行运行它时,该命令按预期工作:

security import <filename> -k <home>/Library/Keychains/login.keychain -P DTWLDHPYNBWBJB3 -f pkcs12
1 identity imported.
1 certificate imported.

有什么想法吗?从非交互式控制台运行security时是否存在限制?

任何python库都能实现同样的目标吗?

问候

1 个答案:

答案 0 :(得分:0)

这实际上是由于另一个问题。

我使用的是未被刷新或关闭的tmpfile。

当脚本运行时,该函数无法在该文件中找到任何内容。

脚本结束后,文件(其中包含&#39; delete = False&#39;)被刷新,因此命令行没有问题。

解决方案是设置bufsize=0 :(