CloudFront Signed URL 的签名在使用 openssl sha1 -sign 和 PHP 的 openssl_sign 时有所不同
Signature for CloudFront Signed URL differs when using openssl sha1 -sign and PHP's openssl_sign
我正在尝试为 CloudFront 服务的 S3 存储桶创建一个签名 URL,并且正在按照 this example 使用 linux OpenSSL 来完成。以下内容几乎直接来自示例:
local -r signature=$(
openssl sha1 -sign "files/pk-${key_pair_id}.pem" policy.json \
| openssl base64 -A \
| tr -- '+=/' '-_~'
)
此计算的签名与 PHP example code 计算的签名不匹配,后者应该是相同的。
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 输入的末尾包含一个换行符,而另一个则没有。当输入真正逐字节相同时,片段会产生匹配的签名。
我正在尝试为 CloudFront 服务的 S3 存储桶创建一个签名 URL,并且正在按照 this example 使用 linux OpenSSL 来完成。以下内容几乎直接来自示例:
local -r signature=$(
openssl sha1 -sign "files/pk-${key_pair_id}.pem" policy.json \
| openssl base64 -A \
| tr -- '+=/' '-_~'
)
此计算的签名与 PHP example code 计算的签名不匹配,后者应该是相同的。
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 输入的末尾包含一个换行符,而另一个则没有。当输入真正逐字节相同时,片段会产生匹配的签名。