Carrierwave 上传到 S3 失败,但 curl 有效

Carrierwave upload to S3 fails, but curl works

我正在尝试使用 Carrierwave(Rails 4.2 上的 1.0.0)将图像上传到 S3。我得到 403 访问被拒绝。但是,当我使用 curl 执行手动 PUT 请求时,它工作得很好。我已确认 Rails 正在正确阅读我的机密。所有这些对我来说意味着 Excon 不知何故没有发送我的证书。

我能做什么?

有效的 curl 命令:

$ file=airplane.jpg
$ bucket=mybucket
$ resource="/${bucket}/${file}"
$ contentType="image/jpeg"
$ dateValue=`date -R`
$ stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}"
$ s3Key=redacted:)
$ s3Secret=redacted:)
$ signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret} -binary | base64`
$ curl -X PUT -T "${file}" \
> -H "Host: ${bucket}.s3.amazonaws.com" \
> -H "Date: ${dateValue}" \
> -H "Content-Type: ${contentType}" \
> -H "Authorization: AWS ${s3Key}:${signature}" \
> https://${bucket}.s3.amazonaws.com/${file}

载波配置:

config.fog_credentials = {
  provider:              'AWS',
  aws_access_key_id:     secrets[:aws_access_key_id],
  aws_secret_access_key: secrets[:aws_secret_access_key],
  region:                'eu-west-1',
  host:                  's3-eu-west-1.amazonaws.com'
}
config.fog_provider = 'fog/aws'
config.storage :fog
config.fog_directory = 'mybucket'
config.fog_public = true
config.fog_attributes = { 'Cache-Control' => 'max-age=315576000' }

编辑:更新 - 我不知道我更改了什么,但在使用 curl 命令时突然出现以下错误:

<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message></Error>

这最终归结为 S3 配置错误。我已经不记得具体细节了。