使用PHP为Apple Wallet创建PKCS#7分离签名

时间:2016-05-03 17:42:23

标签: php ios ssl sign pkcs#7

这对我来说是一个全新的概念,所以我在黑暗中拍摄。

  

要创建签名文件,请创建一个PKCS#7分离签名   清单文件,使用与您的签名关联的私钥   证书。包括WWDR中间证书作为的一部分   签名。您可以从Apple的网站下载此证书。   将签名写入传递顶层的文件签名   包。包括使用的签名通行证的日期和时间   S / MIME签名时属性。

我的理解:

  

要创建签名文件,请创建清单文件的PKCS#7分离签名

我将使用标记PKCS7_DETACHED使用openssl_pkcs7_sign函数。

  

使用与您的签名证书关联的私钥。

我将使用我的ssl cert.pem文件的位置作为signcert参数,并将cert.key文件的位置用作privkey参数。< / p>

  

将WWDR中间证书作为签名的一部分包括在内。

我将在extracerts参数

中包含WWDR证书的路径
  

使用S / MIME签名时属性包括传递签名的日期和时间。

我将包含一个包含密钥signing-time的数组,并为2015-05-03 10:40:00参数添加类似headers的值。

我的代码:

private function createSignature($dir)
{
    $cert = '/etc/ssl/cert.pem';
    $key = '/etc/ssl/private/cert.key';
    $wwdr = '/location/of/apple/wwdr/cert.cer';
    $headers = [
        'signing-time' => (new DateTime())->format('o-m-d H:i:s'),
    ];

    return openssl_pkcs7_sign("$dir/manifest.json", "$dir/signature", $cert, $key, $headers, PKCS7_DETACHED, $wwdr);
}

其他问题:

我在openssl_pkcs7_sign函数的文档示例中注意到文件的某些位置的前缀为file://。这是为什么?

1 个答案:

答案 0 :(得分:4)

  1. https://developer.apple.com/account/ios/identifier/passTypeId
  2. 生成通行证类型ID
  3. https://developer.apple.com/account/ios/certificate/create/
  4. 处为该通行证类型ID创建证书
  5. 下载证书并将其放入钥匙串
  6. 在钥匙串中找到证书并将其导出为Certificates.p12,无需密码
  7. 打开终端,运行openssl pkcs12 -in Certificates.p12 -clcerts -nokeys -out pass_cert.pem -passin pass:以生成证书
  8. 在终端中,运行openssl pkcs12 -in Certificates.p12 -nocerts -out pass_key.pem -passin pass: -passout pass:YourPassword以生成密钥
  9. https://www.apple.com/certificateauthority/下载WWDR证书并将其放入钥匙串
  10. 将钥匙串中的WWDR证书导出为wwdr.pem
  11. 创建分离签名的功能:

    public function createSignature()
    {
        $cert = "file://location/of/pass_cert.pem";
        $key = "file://location/of/pass_key.pem";
        $wwdr = "/location/of/wwdr.pem";
    
        openssl_pkcs7_sign("/location/of/manifest.json", "/location/of/signature",
            $cert, [$key, 'YourPassword'], [], PKCS7_BINARY | PKCS7_DETACHED, $wwdr);
    
        // convert pem to der
        $signature = file_get_contents("/location/of/signature");
        $begin = 'filename="smime.p7s"';
        $end = '------';
        $signature = substr($signature, strpos($signature, $begin) + strlen($begin));
        $signature = substr($signature, 0, strpos($signature, $end));
        $signature = trim($signature);
        $signature = base64_decode($signature);
    
        file_put_contents("/location/of/signature", $signature);
    }
    

    参考文献: