Erstellen unterzeichnet Urls für Cloudfront mit Rubin
-
26-09-2019 - |
Frage
Geschichte:
- Ich habe einen Schlüssel und pem-Datei auf Amazon.
- habe ich einen privaten Eimer
- habe ich eine öffentliche Verteilung und gebrauchte Herkunft id an den privaten Eimer verbinden: Arbeiten
- habe ich eine private Verteilung und verband es die gleiche wie # 3 - jetzt habe ich Zugriff verweigert erhalten: erwartet
Ich habe eine wirklich harte Zeit eine URL zu erzeugen, die funktionieren. Ich habe versucht, die Anweisungen zu folgen hier beschrieben: http: / /docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/index.html?PrivateContent.html
Das ist, was ich so weit gekommen ... nicht funktioniert aber - noch immer Zugriff verweigert:
def url_safe(s)
s.gsub('+','-').gsub('=','_').gsub('/','~').gsub(/\n/,'').gsub(' ','')
end
def policy_for_resource(resource, expires = Time.now + 1.hour)
%({"Statement":[{"Resource":"#{resource}","Condition":{"DateLessThan":{"AWS:EpochTime":#{expires.to_i}}}}]})
end
def signature_for_resource(resource, key_id, private_key_file_name, expires = Time.now + 1.hour)
policy = url_safe(policy_for_resource(resource, expires))
key = OpenSSL::PKey::RSA.new(File.readlines(private_key_file_name).join(""))
url_safe(Base64.encode64(key.sign(OpenSSL::Digest::SHA1.new, (policy))))
end
def expiring_url_for_private_resource(resource, key_id, private_key_file_name, expires = Time.now + 1.hour)
sig = signature_for_resource(resource, key_id, private_key_file_name, expires)
"#{resource}?Expires=#{expires.to_i}&Signature=#{sig}&Key-Pair-Id=#{key_id}"
end
resource = "http://d27ss180g8tp83.cloudfront.net/iwantu.jpeg"
key_id = "APKAIS6OBYQ253QOURZA"
pk_file = "doc/pk-APKAIS6OBYQ253QOURZA.pem"
puts expiring_url_for_private_resource(resource, key_id, pk_file)
Kann mir jemand sagen, was ich falsch mache hier?
Lösung
Alle,
Ich habe gerade ein kleines Juwel, das verwendet werden kann, CF URLs mit Ruby unterzeichnet von dieser Frage eines Teil des Codes mit:
https://github.com/stlondemand/aws_cf_signer
Ich werde wahrscheinlich erhebliche Änderungen es in den kommenden Wochen wird zu machen, wie ich tatsächlich versuchen, es zu benutzen in meiner Anwendung aber wollten Sie alle wissen, wie Sie im Abschnitt Zuordnung aufgeführt sind. :)
Danke!
Andere Tipps
Entfernen url_safe, bevor Sie setzen Politik: Politik = policy_for_resource (Ressource, läuft)
nach docs nur Base64 sollte sicher URL-Safe (m) sein = CharReplace (Base64 (m), "+ = /", "-_ ~")
.. und stellen Sie sicher, dass Cloudfront richtig konfiguriert ist, wie: http://blog.cloudberrylab.com/ 2010/03 / how-to-configure-private-content-for.html
Yep, so dass Politik als policy = policy_for_resource(resource, expires)
für mich gearbeitet.
ich gegabelt right_aws (sie haben meine Pull-Anforderung nicht reagiert) ... stelle ich Cloudfront Private-Streaming und Downloads in ihrer ACF Bibliothek auf: http://github.com/wiseleyb/right_aws
Ich bin mit Dylan. Er hat gute Arbeit mit der Unterzeichnung Urls. Ich hatte das gleiche Problem. Ich ging durch die docs. Es ist eine Sache, die ich nicht dort gefunden habe. Wenn Sie eine private Verteilung erstellen, dann geben Sie in der Regel Zugang zu Dateien, Eimer, etc ...
Ich habe Zugriff Fehler verweigert, bis ich Bucket-Richtlinie zugewiesen.
Sie können Richtlinien wie zuweisen:
{
"Version":"2008-10-17",
"Id":"PolicyForCloudFrontPrivateContent",
"Statement":[{
"Sid":" Grant a CloudFront Origin Identity access to support private content",
"Effect":"Allow",
"Principal":{
"CanonicalUser":"here-goes-your-canonical-name-you-attached-to-cloudfront79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be"
},
"Action":"s3:GetObject",
"Resource":"arn:aws:s3:::change-me-to-your-bucketname/*"
}
]
}