Richten Sie signierte Cookies (für CloudFront) mit benutzerdefinierten Richtlinien mithilfe des AWS SDK für Java ein

Beim Einschränken des Zugriffs auf Inhalte unter CloudFront

Kann verwendet werden.

[Referenz: Link zu Dokumenten in AWS] ** Signierte URL verwenden ** ** · [Erstellen Sie eine signierte URL mit der Standardrichtlinie](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-canned- policy.html) ** ** · [Erstellen einer signierten URL mithilfe einer benutzerdefinierten Richtlinie](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom- policy.html) ** ** Signierte Cookies verwenden ** ** · Festlegen signierter Cookies mithilfe der Standardrichtlinie. html) ** ** · Festlegen signierter Cookies mithilfe benutzerdefinierter Richtlinien. html) **

Aber,

Damit

In diesem Fall ist die Standardrichtlinie oder die signierte URL in Ordnung.

In diesem Fall ist es nicht realistisch, die Links zu den CSS-, Bild- und Videodateien zu signieren, die mit der signierten URL gelesen werden. Diesmal ** Signiertes Cookie mit benutzerdefinierten Richtlinien * Ich habe mit * experimentiert.

0. Inhalt dieses Experiments

1. CloudFront + S3-Seiteneinstellungen

Stellen Sie gemäß dem folgenden Fluss ein.

1-1 Erstellen Sie ein CloudFront-Schlüsselpaar in der AWS Management Console

Im Folgenden können IAM-Benutzer es nicht erstellen. Verwenden Sie daher ** einen Benutzer mit Root-Anmeldeinformationen **, um den Vorgang auszuführen.

01_sec_auth.jpg ① Wählen Sie ** "Sicherheitsanmeldeinformationen" ** aus dem Benutzermenü oben rechts. ② Erweitern Sie ** "Cloud Front Key Pair" ** ③ Klicken Sie auf ** [Neues Schlüsselpaar erstellen] ** ④ Klicken Sie auf ** [Private Schlüsseldatei herunterladen] **, um die private Schlüsseldatei herunterzuladen ⑤ Bestätigen Sie die Schlüsselpaar-ID und zeichnen Sie sie bei geschlossenem Popup auf dem Bildschirm auf.

Befehl openssl


openssl pkcs8 -topk8 -nocrypt -in [Dateiname des privaten Schlüssels].pem -inform PEM -out [Name der Ausgabedatei].der -outform DER

1-2. Erstellen Sie eine CloudFront-Distribution

02_cf_create_dist_01.jpg ① Klicken Sie in der Konsole unter Cloud Front → Distribution auf ** [Distribution erstellen] **.

02_cf_create_dist_02.jpg ② Klicken Sie im Web auf ** [Erste Schritte] **

02_cf_create_dist_03.jpg ③ Legen Sie Elemente fest, die sich auf den Ursprungs-S3-Bucket beziehen ④ Wählen Sie ** "Ja" ** in ** "Bucket Access einschränken" ** ⑤ Wählen Sie ** "Neue Identität erstellen" ** in ** "Ursprungszugriffsidentität" ** ⑥ Wählen Sie ** "Ja, ..." ** in ** "Leseberechtigungen für Bucket erteilen" **

02_cf_create_dist_04.jpg ⑦ Wählen Sie ** "Ja" ** in ** "Viewer-Zugriff einschränken" ** ⑧ Aktivieren Sie ** "Self" ** in ** "Trusted Signers" ** ⑨ Geben Sie den Domainnamen (FQDN, der der CloudFront-Distribution zugewiesen ist) in ** "Alternative Domainnamen" ** an

02_cf_create_dist_05.jpg ⑩ Festlegen von SSL / TLS-bezogenen Elementen (Wählen Sie nach Auswahl von ** "Benutzerdefiniertes SSL-Zertifikat" ** das zu verwendende Zertifikat aus oder fordern Sie ein neues SNI-SSL-Zertifikat an.)

02_cf_create_dist_06.jpg ⑪ ** Klicken Sie auf "Distribution erstellen" **

02_cf_oai.jpg ⑫ Klicken Sie auf ** "Origin Access Identity" ** ⑬ ** Bestätigen Sie "Amazon S3 Canonical User ID" ** ⑭ Warten Sie, bis die Distribution erstellt wurde

1-3 Legen Sie die Zugriffsberechtigung für den S3-Bucket fest

① Wählen Sie auf S3 der Konsole den zu veröffentlichenden S3-Bucket aus → ** Registerkarte "Zugriffsberechtigung" **

03_s3_acl.jpg ② Klicken Sie auf ** [Zugriffssteuerungsliste] ** ③ Klicken Sie auf ** [Benutzer hinzufügen] ** ④ Geben Sie die in ⑬ der CloudFront-Einstellungen bestätigte Zeichenfolge ein ⑤ Aktivieren Sie ** "Lesen" ** in ** "Objektzugriff" ** ⑥ Klicken Sie auf ** [Speichern] **

03_s3_policy.jpg ⑦ Klicken Sie auf ** [Bucket-Richtlinie] ** und überprüfen Sie, ob die Richtlinie festgelegt ist (wie beim Erstellen der CloudFront-Distribution angegeben).

2. Implementieren Sie Code, der ein signiertes Cookie in Ihrer Anwendung setzt

Dieses Mal wurde es in der Spring Boot-Umgebung für Experimente in der lokalen Entwicklungsumgebung implementiert. Im Folgenden wird nur die Controller-Klasse ** für ** "/ set-cookie" beschrieben.

Erstellen Sie einen ** "files" ** Ordner unter ** "src / main / resources" ** und erstellen Sie einen ** "private-" Ordner in der privaten Schlüsseldatei, die zuvor in das .der-Format konvertiert wurde. Speichern Sie es als "key.der" **. Dieses Mal wurde die Datei gemäß der Umgebung von Spring Boot an diesem Speicherort gespeichert. Daher ist es etwas mühsam, den Inhalt der privaten Schlüsseldatei abzurufen, die Datei jedoch in WEB-INF in der normalen Servlet-Umgebung zu speichern. Wenn Sie es behalten, sollten Sie es einfacher herausnehmen können.

Darüber hinaus empfiehlt Amazon, das Schlüsselpaar (privater Schlüssel und öffentlicher Schlüssel) alle 90 Tage zu aktualisieren. Wenn die Aktualisierung in einem so kurzen Zyklus erfolgt, werden die Schlüsselpaar-ID und die private Schlüsseldatei fest codiert. Es ist besser, es in einem Formular aufzubewahren, das separat von der Anwendung aktualisiert werden kann, als es fest im Anwendungspaket zu haben.

SetCookieController.java


package site.hmatsu47.springboot;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.RequestMapping;

import com.amazonaws.services.cloudfront.CloudFrontCookieSigner;
import com.amazonaws.services.cloudfront.CloudFrontCookieSigner.CookiesForCustomPolicy;
import com.amazonaws.util.DateUtils;

import java.io.File;
import java.nio.file.Files;
import java.security.KeyFactory;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Controller;

@Controller
public class SetCookieController {

	@Autowired
    ResourceLoader resourceLoader;
	
	@RequestMapping("/set-cookie")
	public void setCookie(HttpServletResponse res) throws Exception{
		String url = "https://www.hmatsu47.site/";		// URL
		String filepath = "files/private-key.der";		//Privat Schlüssel
		Resource resource = resourceLoader.getResource("classpath:" + filepath);
		File file = resource.getFile();
		byte[] privateKeyByteArray = Files.readAllBytes(file.toPath());
		PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyByteArray);
		KeyFactory kf = KeyFactory.getInstance("RSA");
		RSAPrivateKey privateKey = (RSAPrivateKey) kf.generatePrivate(keySpec);
		String resourcePath = "*";						//Zugriffsbereich
		String keyPairId = "[Schlüsselpaar-ID]";					//Schlüsselpaar-ID
		Date activeFrom = null;							//Gültigkeitsdauer: Start (null = sofort)
		Date expiresOn = DateUtils.parseISO8601Date("2020-12-31T23:59:59.999Z"); //Gültigkeitsdauer: Ende (in UTC)
		String ipRange = "0.0.0.0/0";					//Zugriff auf den IP-Adressbereich der Quelle
		//Generieren von Schlüsseln / Werten für Cookies
		CookiesForCustomPolicy cookies = CloudFrontCookieSigner.getCookiesForCustomPolicy(
				url + resourcePath, privateKey, keyPairId, expiresOn, activeFrom, ipRange);
		//Cookie-Einstellungen
		Cookie cookiePolicy = new Cookie(
				cookies.getPolicy().getKey(), cookies.getPolicy().getValue());
		cookiePolicy.setDomain("hmatsu47.site");
		cookiePolicy.setHttpOnly(true);
		cookiePolicy.setSecure(true);
		res.addCookie(cookiePolicy);

		Cookie cookieSignature = new Cookie(
				cookies.getSignature().getKey(), cookies.getSignature().getValue());
		cookieSignature.setDomain("hmatsu47.site");
		cookieSignature.setHttpOnly(true);
		cookieSignature.setSecure(true);
		res.addCookie(cookieSignature);

		Cookie cookieKeyPairId = new Cookie(
				cookies.getKeyPairId().getKey(), cookies.getKeyPairId().getValue());
		cookieKeyPairId.setDomain("hmatsu47.site");
		cookieKeyPairId.setHttpOnly(true);
		cookieKeyPairId.setSecure(true);
		res.addCookie(cookieKeyPairId);
		//Übergang durch Umleitung
		res.sendRedirect(url + "index.html");
	}
}

3. Ausführen

Speichern Sie im zu veröffentlichenden S3-Bucket index.html mit den entsprechenden Inhalten und Bildern, die durch Angabe von index.html geladen wurden.

Starten Sie zuerst den Browser und öffnen Sie ** "https://www.hmatsu47.site/index.html" **. Da Sie dann keine Zugriffsberechtigung haben, wird die Zielseite nicht geöffnet und es tritt ein Fehler auf.

Öffnen Sie als Nächstes die in 2 implementierte ** "https://hmatsu47.site/set-cookie" **. Nachdem das signierte Cookie für die Domain ** "hmatsu47.site" ** und ihren Subdomain-Bereich gesetzt wurde, wird es umgeleitet und diesmal wird die Seite korrekt geöffnet.

Wenn Sie den Browser schließen, verschwindet das signierte Cookie. Wenn Sie den Browser erneut starten, wird ** "https://www.hmatsu47.site/index.html" ** nicht geöffnet und es tritt ein Fehler auf.

Hosts-Datei (zusätzlicher Hinweis)


127.0.0.1	hmatsu47.site

Dies funktionierte in der diesmal vorbereiteten Entwicklungsumgebung (STS 3.8.4.RELEASE unter Windows 8.1) einwandfrei, es gibt jedoch keine Garantie dafür, dass es in anderen Umgebungen (lokale Umgebung) funktioniert. Wenn es also nicht funktioniert, handelt es sich um eine normale öffentliche Serverumgebung. Es scheint besser, es mit zu versuchen.

4. Für die Videowiedergabe verwenden

Siehe den Artikel unten. ** Videos mit eingeschränktem Zugriff (HLS-Format) unter CloudFront mit Video.js mit signierten Cookies abspielen **

Recommended Posts

Richten Sie signierte Cookies (für CloudFront) mit benutzerdefinierten Richtlinien mithilfe des AWS SDK für Java ein
[AWS SDK für Java] Legen Sie die Wiederholungsrichtlinie für den S3-Client fest
Holen Sie sich eine Liste der S3-Dateien mit ListObjectsV2Request (AWS SDK für Java)
Anmeldeinformationen, auf die das AWS SDK für Java standardmäßig verweist
Versuchen Sie Spark Submit to EMR mit AWS SDK für Java
AWS SDK für Java 1.11.x und 2.x.
Verschlüsseln Sie Daten, die mit AWS SDK für Java / SSE-KMS in S3 hochgeladen wurden
Hochladen / Herunterladen / Löschen von Daten in S3 mithilfe von Amazon S3 Client Builder mit AWS SDK für Java
AWS Elastic Beanstalk # 1 mit Java von Grund auf neu Erstellen einer Java-Webanwendungsumgebung mit EB CLI-
Verwenden von Java mit AWS Lambda-Eclipse-Vorbereitung
Verwenden von Java mit AWS Lambda-Implementation-Check CloudWatch-Argumenten
Verwenden von Java mit AWS Lambda-Implementierung-Stop / Launch EC2
Versuchen Sie es mit der Wii-Fernbedienung in Java
Überprüfen Sie das ID-Token eines von AWS Cognito in Java authentifizierten Benutzers
ChatWork4j für die Verwendung der ChatWork-API in Java
[Java] Stellen Sie die Zeit im Browser mit jsoup ein
[Java] (für MacOS) Methode zur Einstellung des Klassenpfads
Ich habe einen Testcode (Junit & mockit) für den Code geschrieben, der die AWS-API (Java) aufruft.
Senden Sie einen Job an AWS Batch mit Java (Eclipse)
Ich habe versucht, SQS mit AWS Java SDK zu betreiben
[Java-Grundlagen] Lassen Sie uns ein Dreieck mit einer for-Anweisung erstellen
Ein Hinweis zum Initialisieren von Feldern im Java-Lernprogramm
Verwenden der Datenbank (SQL Server 2014) aus einem Java-Programm 2018/01/04
Bereiten Sie die Umgebung für Java11 und JavaFx mit Ubuntu 18.4 vor
Holen Sie sich die S3-Objektgröße mit AWS SDK for Ruby
Die Geschichte des Erstellens einer Java-Version des Minecraft-Servers mit GCP (und dem Festlegen einer weißen Liste)