【问题标题】:Encode PKCS7 in Google App Engine (python, passbook)在 Google App Engine 中编码 PKCS7(python、passbook)
【发布时间】:2012-09-17 19:31:41
【问题描述】:

此问题与 Passbook 有关,在接下来的几天内处于 NDA 之下,但这是一个通用的 PKCS7 问题。

我有一个从我的钥匙串中导出的 .p12 文件。我可以使用以下命令将其分成 2 个 pem

openssl pkcs12 -in "mycert.p12" -clcerts -nokeys -out certificate.pem
openssl pkcs12 -in "mycert.p12" -nocerts -out key.pem

下一步是使用此密钥和证书创建签名的 PKCS7 文件。使用 openssl 很容易做到这一点:

openssl smime -binary -sign \
    -signer certificate.pem -inkey key.pem \
    -in <datafile> -out signature \
    -outform DER

问题是,假设我有证书和密钥,在 Google App Engine 中执行此操作的最佳方法是什么?不幸的是,我对密码学有点陌生,但我一直在谷歌搜索,发现 PyCrypto 和 keyczar。在 App Engine 上是否有一种可接受的方式来执行此操作,或者我需要写一些东西吗?关于从哪个包开始有什么建议吗?
我知道 Openssl 在 AppEngine 上不可用,但如果您使用 python 2.7,PyCrypto 是可用的,对吗?而且我已经看到人们让 keyczar 使用它的帖子。不过,在给定密钥和证书的情况下,我还没有找到一种生成 PKCS7 编码数据的简单方法。

提前感谢您的任何指导。

【问题讨论】:

  • 我已经设法通过明确查询安全远程服务器来完成签名部分来拼凑一个解决方法,但显然这不太理想。我仍然很想知道是否有人解决了这个问题。

标签: python google-app-engine encryption pkcs#7 passbook


【解决方案1】:

这是一种使用 M2Crypto 的方法,取自 https://github.com/devartis/passbook

def passwordCallback(*args, **kwds):
    return password

smime = SMIME.SMIME()
smime.load_key('key.pem', 'certificate.pem', callback=passwordCallback)        
pk7 = smime.sign(SMIME.BIO.MemoryBuffer(manifest), flags=SMIME.PKCS7_DETACHED | SMIME.PKCS7_BINARY)                
pem = SMIME.BIO.MemoryBuffer()
pk7.write(pem)
# convert pem to der
der = ''.join(l.strip() for l in pem.read().split('-----')[2].splitlines()).decode('base64')        

open('signature', 'w').write(der)

【讨论】:

  • 不幸的是,Google App Engine 中无法访问 M2Crypto,我认为是因为它在后台使用了 c。 GAE 目前只支持 PyCrypto 2.6
  • 这是一个普遍有用的答案,尽管不适用于 GAE。你的 github 链接是 404。
猜你喜欢
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 2011-02-16
  • 2023-04-04
  • 2015-03-16
  • 1970-01-01
  • 2016-05-24
相关资源
最近更新 更多