繁体   English   中英

使用 openssl sha1 -sign 和 PHP 的 openssl_sign 时,CloudFront 签名 URL 的签名不同

[英]Signature for CloudFront Signed URL differs when using openssl sha1 -sign and PHP's openssl_sign

我正在尝试为 CloudFront 提供的 S3 存储桶创建一个签名的 URL,并按照此示例使用 linux OpenSSL 来执行此操作。 以下内容几乎直接来自示例:

  local -r signature=$(
    openssl sha1 -sign "files/pk-${key_pair_id}.pem" policy.json \
    | openssl base64 -A \
    | tr -- '+=/' '-_~'
  )

此计算的签名与PHP 示例代码计算的签名不匹配,这应该是相同的。

function rsa_sha1_sign($policy, $private_key_filename) {
    $signature = "";

    // load the private key
    $fp = fopen($private_key_filename, "r");
    $priv_key = fread($fp, 8192);
    fclose($fp);
    $pkeyid = openssl_get_privatekey($priv_key);

    // compute signature
    openssl_sign($policy, $signature, $pkeyid);

    // free the key from memory
    openssl_free_key($pkeyid);

    return $signature;
}

function url_safe_base64_encode($value) {
    $encoded = base64_encode($value);
    // replace unsafe characters +, = and / with 
    // the safe characters -, _ and ~
    return str_replace(
        array('+', '=', '/'),
        array('-', '_', '~'),
        $encoded);
}

$key_pair_id = "A...X";
$private_key_filename = "files/A...X.pem"
$signature = rsa_sha1_sign($policy, $private_key_filename);
$signature = url_safe_base64_encode($signature);

假设$policy包含有效的 JSON,它与 bash 示例中使用的policy.json文件的内容相同。

PHP 示例计算一个有效的签名,我可以确认它可用于创建一个有效的签名 URL 以访问受限内容。

正如 Mike 指出的,Bash 和 PHP 的代码片段计算相同的签名以匹配输入。

我的测试中的差异是由于一个输入在 JSON 输入的末尾包含换行符,而一个输入没有。 当输入真正逐字节相同时,片段会产生匹配的签名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM