Я пытаюсь создать подписанный URL для корзины S3, обслуживаемой CloudFront, и следую этому примеру , чтобы сделать это с 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, который идентично соответствует содержимому файла policy.json
, использованного в примере bash.
В примере PHP вычисляется действительная подпись, которую я могу подтвердить, можно использовать для создания действительного подписанного URL-адреса для доступа к ограниченному контенту.