いろいろな情報があったが、シンプルな下記のコードでいけた。teratailを使って良い人に尊い教えをもらいながら最終的に自己解決しました。
$accessKey = "access"; $secretKey = "secret"; $associateTag = "tag"; $endpoint = "webservices.amazon.co.jp"; $uri = "/onca/xml"; foreach ([ "Service" => "AWSECommerceService", "Operation" => "ItemSearch", "AWSAccessKeyId" => $accessKey, "AssociateTag" => $associateTag, "SearchIndex" => "Apparel", "ResponseGroup" => "Images,ItemAttributes,Offers", "Keywords" => "ブラジャー", "Timestamp" => gmdate('Y-m-d\TH:i:s\Z') ] as $key => $value) { $params[rawurlencode($key)] = rawurlencode($value); }; ksort($params); $queries = []; foreach ($params as $key => $value) { $queries[] = "$key=$value"; } $queryString = join("&", $queries); $signature = base64_encode(hash_hmac("sha256", join("\n", ["GET", $endpoint, $uri, $queryString]), $secretKey, true)); echo file_get_contents("https://$endpoint$uri?$queryString&Signature=" . rawurlencode($signature));
ちなみに、なんか昔はもうちょっと違うリクエストだったみたいなので、2018年と書いておきました。また仕様が変わるたびに、この記事に追記していきたいと思います。
それと、こういうのは外部ライブラリを使ったほうが良いとteratailで教えてもらいました。それでもいいのかもしれないですね。