如何创建签名文件以在来自nodejs服务器的safari中发送Web推送通知

时间:2015-12-09 20:25:42

标签: node.js safari apple-push-notifications pkcs#7

现在我有一个服务器可以向chrome发送推送通知,我也希望扩展到safari,在apple doc(https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/NotificationProgrammingGuideForWebsites/PushNotifications/PushNotifications.html)但是我不知道如何在nodeJS中创建签名文件

  

签名

     

签名是PKCS#7分离的签名   清单文件。使用关联的私钥对清单文件进行签名   使用您在注册时获得的Web推送证书   与Apple。在PHP中,您可以使用openssl_pkcs7_sign执行此操作   功能。附加的create_signature函数   createPushPackage.php伴侣文件(该链接靠近顶部   页面)显示了如何做到这一点。

     

如果推送包的内容发生变化,您需要   重新计算你的签名。

在同一页面中,苹果在php中举了一个例子:

// Creates a signature of the manifest using the push notification certificate.
function create_signature($package_dir, $cert_path, $cert_password) {
    // Load the push notification certificate
    $pkcs12 = file_get_contents($cert_path);
    $certs = array();
    if(!openssl_pkcs12_read($pkcs12, $certs, $cert_password)) {
        return;
    }

    $signature_path = "$package_dir/signature";

    // Sign the manifest.json file with the private key from the certificate
    $cert_data = openssl_x509_read($certs['cert']);
    $private_key = openssl_pkey_get_private($certs['pkey'], $cert_password);
    openssl_pkcs7_sign("$package_dir/manifest.json", $signature_path, $cert_data, $private_key, array(), PKCS7_BINARY | PKCS7_DETACHED);

    // Convert the signature from PEM to DER
    $signature_pem = file_get_contents($signature_path);
    $matches = array();
    if (!preg_match('~Content-Disposition:[^\n]+\s*?([A-Za-z0-9+=/\r\n]+)\s*?-----~', $signature_pem, $matches)) {
        return;
    }
    $signature_der = base64_decode($matches[1]);
    file_put_contents($signature_path, $signature_der);
}

有人知道如何在nodeJS中使用相同的功能吗?

1 个答案:

答案 0 :(得分:2)

好的我终于找到了如何做到这一点,你必须先将证书和密钥转换为PEM格式

$ openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem
$ openssl pkcs12 -in key.p12 -out key.pem -nodes

之后,您可以使用smime模块签署您的清单(我使用https://github.com/hipush/smime)我们准备好了,我们有签名:) :) :)