Подпись для CloudFront Подписанный URL-адрес отличается при использовании openssl sha1 -sign и PHP openssl_sign - PullRequest
3 голосов
/ 22 апреля 2020

Я пытаюсь создать подписанный 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-адреса для доступа к ограниченному контенту.

1 Ответ

1 голос
/ 28 апреля 2020

Как указал Майк, фрагмент Bash и PHP вычисляет идентичные подписи для сопоставления ввода.

Расхождение в моем тестировании было результатом одного ввода, содержащего перевод строки в конце ввода JSON, тогда как одно - нет. Когда входные данные были по-настоящему байт-байтовыми, фрагменты создают совпадающие подписи.

...