Subresource Integrity in Spring Boot

SRI-Hashes für Scripts und Stylesheets generieren -- mit Thymeleaf-Integration, automatischer Hash-Generierung und CDN-Absicherung.

Spring Boot · Schritt für Schritt

Subresource Integrity in Spring Boot

Subresource Integrity (SRI) schuetzt gegen manipulierte externe Ressourcen. Der Browser prüft den Hash einer Datei bevor er sie ausfuehrt -- stimmt der Hash nicht, wird die Ressource blockiert. SRI ist mit 15 von 166 Punkten im Wolf-Agents Web Security Check bewertet.

Spring Boot bietet keine eingebaute SRI-Unterstuetzung. Sie müssen integrity- und crossorigin-Attribute manuell in Thymeleaf-Templates setzen. Für automatische Hash-Generierung integrieren Sie einen Service, der Hashes beim Build oder zur Laufzeit berechnet.

1Schritt 1 von 3

SRI-Hashes generieren

Generieren Sie SHA-384-Hashes für alle externen Scripts und Stylesheets. Verwenden Sie openssl auf der Kommandozeile oder integrieren Sie die Generierung in Ihren Build-Prozess. Der Hash muss bei jeder Datei-Aenderung aktualisiert werden.

TerminalHash-Generierung
# SRI-Hash mit OpenSSL generieren
cat app.js | openssl dgst -sha384 -binary | openssl base64 -A

# Oder mit shasum:
shasum -b -a 384 app.js | awk '{print $1}' | \
  xxd -r -p | base64

# Erwartete Ausgabe:
sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC
SHA-384 empfohlen

Verwenden Sie sha384 als Hash-Algorithmus. SHA-256 ist das Minimum, SHA-384 bietet den besten Kompromiss aus Sicherheit und Performance. SHA-512 ist ebenfalls möglich.

2Schritt 2 von 3

Thymeleaf-Templates anpassen

Fuegen Sie integrity- und crossorigin-Attribute zu allen <script>- und <link>-Tags hinzu. Das crossorigin="anonymous"-Attribut ist bei CDN-Ressourcen zwingend erforderlich, damit der Browser den Hash prüfen kann.

Thymeleaf-TemplateProduktiv
<!-- Thymeleaf-Template: SRI-Attribute -->
<script th:src="@{/js/app.js}"
        integrity="sha384-oqVuAfXRKap7fdgcCY..."
        crossorigin="anonymous"></script>

<!-- CDN-Ressource mit SRI -->
<link rel="stylesheet"
      href="https://cdn.example.com/styles.css"
      integrity="sha384-abc123..."
      crossorigin="anonymous" />

<!-- Dynamische Hashes aus Properties -->
<script th:src="@{/js/vendor.js}"
        th:integrity="${@sriProperties.vendorHash}"
        crossorigin="anonymous"></script>
Der Wolf-Agents Web Security Check prüft SRI-Attribute automatisch und bewertet sie mit bis zu 15 Punkten.
3Schritt 3 von 3

Build-Integration einrichten

Automatisieren Sie die Hash-Generierung, damit SRI-Hashes nach jedem Build aktuell sind. Erstellen Sie einen @Service, der Hashes zur Laufzeit berechnet, oder verwenden Sie statische Hashes in application.yml. Bei Maven können Sie ein Plugin verwenden, das Hashes während mvn package generiert.

SriHashService.java + application.ymlProduktiv
// SriHashService.java -- Hash-Generierung zur Laufzeit
@Service
public class SriHashService {

    public String generateHash(String resourcePath)
            throws Exception {
        Resource resource = new ClassPathResource(
            "static/" + resourcePath);
        byte[] content = resource
            .getInputStream().readAllBytes();

        MessageDigest digest = MessageDigest
            .getInstance("SHA-384");
        byte[] hash = digest.digest(content);

        return "sha384-"
            + Base64.getEncoder().encodeToString(hash);
    }
}

// application.yml -- Statische Hashes
sri:
  hashes:
    app-js: "sha384-oqVuAfXRKap7fdgcCY..."
    vendor-js: "sha384-xyz789..."
4Verifizierung

SRI-Attribute verifizieren

Prüfen Sie die HTML-Ausgabe Ihrer Anwendung auf korrekte integrity- und crossorigin-Attribute.

TerminalVerifizierung
# HTML-Ausgabe auf SRI-Attribute pruefen
curl -s http://localhost:8080 | grep -i integrity

# Erwartete Ausgabe:
<script src="/js/app.js" integrity="sha384-oqVuAfXRKap7fdgcCY..." crossorigin="anonymous">

Häufige Fehler bei SRI in Spring Boot

Hash-Mismatch nach Rebuild

Wenn sich der Inhalt einer Datei aendert, aendert sich der Hash. Statisch hinterlegte Hashes müssen nach jedem Build aktualisiert werden. Verwenden Sie den SriHashService für automatische Hash-Berechnung.

crossorigin-Attribut fehlt bei CDN-Ressourcen

Ohne crossorigin="anonymous" kann der Browser den Inhalt von Cross-Origin-Ressourcen nicht lesen und den Hash nicht prüfen. Das integrity-Attribut wird dann ignoriert.

Thymeleaf-Fragmente ohne Integrity-Attribute

Thymeleaf-Layouts und -Fragmente können Script-Tags enthalten, die beim Zusammensetzen der Seite keine SRI-Attribute haben. Prüfen Sie alle Fragmente -- nicht nur die Haupttemplates.

Webpack/Vite-Assets mit Content-Hash im Dateinamen

Build-Tools wie Webpack oder Vite generieren Dateinamen mit Content-Hashes (app.a1b2c3.js). Der SRI-Hash muss trotzdem separat berechnet und im Template aktualisiert werden.

Compliance-Relevanz

SRI schuetzt die Integritaet externer Ressourcen und ist für Anwendungen mit CDN-Nutzung besonders wichtig.

PCI DSS 4.0 -- Requirement 6.4.3 fordert Integritaetsprüfungen für Scripts auf Zahlungsseiten.
NIS2 -- Art. 21(d) fordert Sicherheit der Lieferkette -- SRI schuetzt gegen kompromittierte CDN-Ressourcen.
OWASP ASVS -- V14.2.3 fordert SRI für alle von Dritten gehosteten Ressourcen.

Wie steht Ihre Domain bei Subresource Integrity?

Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.