使用 iOS "Shared Web Credentials" API 的 SSL 证书签署文件

Sign a file with SSL certificate for iOS "Shared Web Credentials" API

我从 Symantec 获得了 Web 服务器证书,该证书已启用 Digital Signature X509v3 密钥用法,我想用它来签署 apple-app-site-association JSON 文件Shared Web Credentials API.

要求

当我使用以下命令签署文件时:

$ openssl smime \
-sign \
-inkey my.key \
-signer certificate.pem \
-certfile SymantecSSG4.crt \
-noattr -nodetach \
-in content \
-outform DER -out result

…我没有收到任何错误。但是当我尝试验证 result 它失败并出现错误:

$ openssl smime -verify -inform DER -in result
Verification failure
140735229006672:error:21075075:PKCS7 routines:PKCS7_verify:certificate verify error:pk7_smime.c:328:Verify error:unsupported certificate purpose

知道我遗漏了什么吗?

RFC 5750 的 4.4.4 Extended Key Usage Extension 部分明确指出,证书的 Extended Key Usage 扩展必须包含 emailProtection OID,以便public 证书中用于验证签名 S/MIME 消息的密钥。

If the extended key usage extension is present in the certificate, then interpersonal message S/MIME receiving agents MUST check that it contains either the emailProtection or the anyExtendedKeyUsage OID as defined in [KEYM].

这就是 OpenSSL 在尝试验证已签名的 S/MIME 负载时抱怨的原因。为了使其真正有效,我需要使用 emailProtection 扩展密钥用法申请一个新证书。

不过,在实践中,我可以验证 iOS 8.3 在用于 Shared Web Credentials 时愉快地接受这样的签名文件,这是我的预期用途。