Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
In CloudTrail Lake gespeicherte Abfrageergebnisse validieren
Um festzustellen, ob die Abfrageergebnisse nach CloudTrail der Übermittlung der Abfrageergebnisse geändert, gelöscht oder unverändert wurden, können Sie die Integritätsprüfung der CloudTrail Abfrageergebnisse verwenden. Diese Funktion basiert auf Industriestandardalgorithmen: SHA -256 für Hashing und SHA -256 RSA für digitale Signaturen. Dadurch ist es rechnerisch unmöglich, Abfrageergebnisdateien unbemerkt zu ändern, zu löschen oder zu fälschen CloudTrail . Sie können die Befehlszeilenschnittstelle zur Validierung von Abfrageergebnisdateien verwenden.
Warum sollten Sie diese Funktion nutzen?
Validierte Abfrageergebnisdateien sind bei Sicherheits- und kriminaltechnischen Ermittlungen unersetzlich. Mit einer validierten Abfrageergebnisdatei können Sie beispielsweise bestätigen, dass sich die Abfrageergebnisdatei selbst nicht geändert hat. Bei der Integritätsprüfung der CloudTrail Abfrageergebnisdatei erfahren Sie auch, ob eine Abfrageergebnisdatei gelöscht oder geändert wurde.
Themen
Überprüfen Sie gespeicherte Abfrageergebnisse mit dem AWS CLI
Sie können die Integrität der Abfrageergebnisdateien und der Sign-Datei mit dem Befehl aws cloudtrail verify-query-results
Voraussetzungen
Zum Überpfüfen der Integrität von Abfrageergebnissen mit der Befehlszeile müssen die folgenden Bedingungen erfüllt sein:
-
Sie müssen über eine Online-Verbindung zu verfügen AWS.
-
Sie müssen AWS CLI Version 2 verwenden.
-
Um Abfrageergebnisdateien zu validieren und die Datei lokal zu signieren, gelten die folgenden Bedingungen:
-
Sie müssen die Abfrageergebnisdateien und die Sign-Datei im angegebenen Dateipfad ablegen. Geben Sie den Dateipfad als Wert für den --local-export-path-Parameter an.
-
Sie dürfen die Abfrageergebnisdateien und die Sign-Datei nicht umbenennen.
-
-
Um die Abfrageergebnisdateien zu validieren und die Datei im S3-Bucket zu signieren, gelten die folgenden Bedingungen:
-
Sie dürfen die Abfrageergebnisdateien und die Sign-Datei nicht umbenennen.
-
Sie müssen über Lesezugriff auf den Amazon-S3-Bucket verfügen, der die Abfrageergebnisdateien und die Sign-Datei enthält.
-
Das angegebene S3-Präfix muss die Abfrageergebnisdateien und die Sign-Datei enthalten. Geben Sie das S3-Präfix als Wert für den --s3-prefix-Parameter an.
-
verify-query-results
Der Befehl verify-query-results überprüft den Hashwert jeder Abfrageergebnisdatei, indem er den Wert mit dem fileHashValue
in der Sign-Datei vergleicht und validiert dann den Wert hashSignature
in der Sign-Datei.
Wenn Sie Abfrageergebnisse überprüfen, können Sie entweder die Befehlszeilenoptionen --s3-bucket und --s3-prefix verwenden, um die Abfrageergebnisdateien zu validieren und die in einem S3-Bucket gespeicherte Datei zu signieren, oder Sie verwenden die Befehlszeilenoption --local-export-path, um eine lokale Überprüfung der heruntergeladenen Abfrageergebnisdateien und der Sign-Datei durchzuführen.
Anmerkung
Der Befehl verify-query-results ist regionsspezifisch. Sie müssen die --region globale Option angeben, um die Abfrageergebnisse für einen bestimmten Bereich zu überprüfen AWS-Region.
Im Folgenden werden die Optionen für den Befehl verify-query-results aufgeführt.
- --s3-bucket
<string>
-
Gibt den S3-Bucket-Namen an, der die Abfrageergebnisdateien und die Sign-Datei speichert. Sie können diesen Parameter nicht mit --local-export-path verwenden.
- --s3-prefix
<string>
-
Gibt den S3-Pfad des S3-Ordners an, der die Abfrageergebnisdateien und die Sign-Datei enthält (z. B.
s3/path/
). Sie können diesen Parameter nicht mit --local-export-path verwenden. Sie müssen diesen Parameter nicht angeben, wenn sich die Dateien im Stammverzeichnis des S3-Buckets befinden.
- --local-export-path
<string>
-
Gibt das lokale Verzeichnis an, das die Abfrageergebnisdateien und die Sign-Datei enthält (z. B.
/local/path/to/export/file/
). Sie können diesen Parameter nicht mit --s3-bucket oder --s3-prefix verwenden.
Beispiele
Im folgenden Beispiel werden Abfrageergebnisse mithilfe der Befehlszeilenoptionen --s3-bucket und --s3-prefix überprüft, um den Namen und das Präfix des S3-Buckets anzugeben, der die Abfrageergebnisdateien und die Sign-Datei enthält.
aws cloudtrail verify-query-results --s3-bucket
amzn-s3-demo-bucket
--s3-prefixprefix
--regionregion
Im folgenden Beispiel werden heruntergeladene Abfrageergebnisse mithilfe der --local-export-path-Befehlszeilenoption überprüft, um den lokalen Pfad für die Abfrageergebnisdateien und die Sign-Datei anzugeben. Weitere Informationen zum Herunterladen von Abfrageergebnisdateien finden Sie unter Laden Sie Ihre in CloudTrail Lake gespeicherten Abfrageergebnisse herunter.
aws cloudtrail verify-query-results --local-export-path
local_file_path
--regionregion
Validierungsergebnisse
Die folgende Tabelle beschreibt die möglichen Validierungsmeldungen für Abfrageergebnisdateien und der Sign-Datei.
Dateityp | Validierungsmeldung | Beschreibung |
---|---|---|
Sign file |
Successfully validated sign and query result files |
Die Signatur der Sign-Datei ist gültig. Die Abfrageergebnisdateien, auf die sie verweist, können überprüft werden. |
Query result file |
|
Die Überprüfung ist fehlgeschlagen, weil der Hashwert für die Abfrageergebnisdatei nicht mit dem fileHashValue in der Sign-Datei übereinstimmt. |
Sign file |
|
Die Überprüfung der Sign-Datei ist fehlgeschlagen, da die Signatur nicht gültig ist. |
CloudTrail Dateistruktur signieren
Die Sign-Datei enthält den Namen von allen Abfrageergebnissen, die an Ihren Amazon-S3-Bucket übermittelt wurden, als Sie die Abfrageergebnisse gespeichert haben, den Hash-Wert für jede Abfrageergebnisdatei und die digitale Signatur der Datei. Die digitale Signatur und Hash-Werte werden zur Validierung der Integrität der Abfrageergebnisdateien und der Sign-Datei selbst verwendet.
Speicherort von Sign-Dateien
Die Sign-Datei wird an einen Amazon-S3-Bucket-Speicherort übermittelt, der dieser Syntax folgt.
s3://
amzn-s3-demo-bucket
/optional-prefix/
AWSLogs/aws-account-ID
/CloudTrail-Lake/Query/year
/month
/date
/query-ID
/result_sign.json
Beispiel von Sign-Dateiinhalten
Die folgende Beispielsigndatei enthält Informationen für CloudTrail Lake-Abfrageergebnisse.
{ "version": "1.0", "region": "us-east-1", "files": [ { "fileHashValue" : "de85a48b8a363033c891abd723181243620a3af3b6505f0a44db77e147e9c188", "fileName" : "result_1.csv.gz" } ], "hashAlgorithm" : "SHA-256", "signatureAlgorithm" : "SHA256withRSA", "queryCompleteTime": "2022-05-10T22:06:30Z", "hashSignature" : "7664652aaf1d5a17a12ba50abe6aca77c0ec76264bdf7dce71ac6d1c7781117c2a412e5820bccf473b1361306dff648feae20083ad3a27c6118172a81635829bdc7f7b795ebfabeb5259423b2fb2daa7d1d02f55791efa403dac553171e7ce5f9307d13e92eeec505da41685b4102c71ec5f1089168dacde702c8d39fed2f25e9216be5c49769b9db51037cb70a84b5712e1dffb005a74580c7fdcbb89a16b9b7674e327de4f5414701a772773a4c98eb008cca34228e294169901c735221e34cc643ead34628aabf1ba2c32e0cdf28ef403e8fe3772499ac61e21b70802dfddded9bea0ddfc3a021bf2a0b209f312ccee5a43f2b06aa35cac34638f7611e5d7", "publicKeyFingerprint" : "67b9fa73676d86966b449dd677850753" }
Beschreibungen der Felder in Sign-Dateien
Im Folgenden sind Beschreibungen für die einzelnen Felder in der Sign-Datei aufgeführt:
version
-
Die Version der Sign-Datei.
region
-
Die Region für das AWS Konto, das zum Speichern der Abfrageergebnisse verwendet wurde.
files.fileHashValue
-
Der im Hexadezimalformat verschlüsselte Hash-Wert des komprimierten Inhalts der Abfrageergebnisdatei.
files.fileName
-
Der Name der Abfrageergebnisdatei.
hashAlgorithm
-
Der für das Hashing der Abfrageergebnisdatei verwendete Hash-Algorithmus.
signatureAlgorithm
-
Der zum Signieren der Datei verwendete Algorithmus.
queryCompleteTime
-
Gibt an, wann die Abfrageergebnisse an den S3-Bucket CloudTrail übermittelt wurden. Sie können diesen Wert verwenden, um den öffentlichen Schlüssel zu finden.
hashSignature
-
Die Hash-Signatur für die Datei.
publicKeyFingerprint
-
Der im Hexadezimalformat verschlüsselte Fingerabdruck des öffentlichen Schlüssels, der zum Signieren der Datei verwendet wurde.
Benutzerdefinierte Implementierungen der Integritätsprüfung von CloudTrail Abfrageergebnisdateien
Da branchenübliche, offen verfügbare kryptografische Algorithmen und Hashfunktionen CloudTrail verwendet werden, können Sie Ihre eigenen Tools erstellen, um die Integrität der CloudTrail Abfrageergebnisdateien zu überprüfen. Wenn Sie Abfrageergebnisse in einem Amazon S3 S3-Bucket speichern, wird CloudTrail eine Signierdatei an Ihren S3-Bucket gesendet. Sie können Ihre eigene Validierungslösung implementieren, um die Signatur- und Abfrageergebnisdateien zu überprüfen. Weitere Informationen zur Sign-Datei finden Sie unte CloudTrail Dateistruktur signieren.
In diesem Thema wird das Signieren von Sign-Dateien beschrieben. Zudem werden detailliert die Schritte dargelegt, die zur Implementierung einer Lösung für die Validierung von Sign-Dateien sowie den von der Sign-Datei referenzierten Abfrageergebnisdateien ausgeführt werden müssen.
Verstehen, wie CloudTrail Signdateien signiert werden
CloudTrail Signierdateien werden mit RSA digitalen Signaturen signiert. CloudTrailFührt für jede Signierdatei Folgendes aus:
-
Erstellt eine Hashliste, die den Hashwert für jede Abfrageergebnisdatei enthält.
-
Ein privater Schlüssel, der für die Region eindeutig ist, wird abgerufen.
-
Übergibt den SHA -256-Hash der Zeichenfolge und den privaten Schlüssel an den RSA Signaturalgorithmus, der eine digitale Signatur erzeugt.
-
Der Byte-Signaturcode wird im Hexadezimalformat verschlüsselt.
-
Fügt die digitale Signatur in die Sign-Datei ein.
Inhalt der Datensignatur-Zeichenfolge
Die Datensignierungszeichenfolge besteht aus dem Hashwert für jede Abfrageergebnisdatei, getrennt durch ein Leerzeichen. Die Sign-Datei listet den fileHashValue
für jede Abfrageergebnisdatei auf.
Schritte der benutzerdefinierten Validierungsimplementierung
Bei der Implementierung einer benutzerdefinierten Validierungslösung müssen Sie zunächst die Sign-Datei und anschließend die von ihr referenzierten Abfrageergebnisdateien validieren.
Validieren der Sign-Datei
Zur Validierung einer Sign-Datei benötigen Sie die Signatur, den öffentlichen Schlüssel, dessen privater Schlüssel zum Signieren verwendet wurde und eine berechnete Datensignatur-Zeichenfolge.
-
Rufen Sie die Sign-Datei ab.
-
Überprüfen Sie, ob die Sign-Datei vom ursprünglichen Speicherort abgerufen wurde.
-
Rufen Sie die im Hexadezimalformat verschlüsselte Signatur der Sign-Datei ab.
-
Rufen Sie den im Hexadezimalformat verschlüsselten Fingerabdruck des öffentlichen Schlüssels ab, dessen privater Schlüssel zum Signieren der Sign-Datei verwendet wurde.
-
Rufen Sie den öffentlichen Schlüssel für den
queryCompleteTime
entsprechenden Zeitraum der Sign-Datei ab. Wählen Sie für den Zeitraum eine frühereStartTime
als diequeryCompleteTime
und eine spätereEndTime
als diequeryCompleteTime
. -
Wählen Sie aus den abgerufenen öffentlichen Schlüsseln denjenigen aus, dessen Fingerabdruck mit dem
publicKeyFingerprint
-Wert in der Sign-Datei übereinstimmt. -
Erstellen Sie mithilfe einer Hashliste, die den Hashwert für jede Abfrageergebnisdatei durch ein Leerzeichen getrennt enthält, die Datensignaturzeichenfolge neu, die zur Überprüfung der Signatur der Sign-Datei verwendet wird. Die Sign-Datei listet den
fileHashValue
für jede Abfrageergebnisdatei auf.Wenn das
files
-Array Ihrer Sign-Datei beispielsweise die folgenden drei Abfrageergebnisdateien enthält, lautet Ihre Hashliste „aaa bbb ccc“.“files": [ { "fileHashValue" : “aaa”, "fileName" : "result_1.csv.gz" }, { "fileHashValue" : “bbb”, "fileName" : "result_2.csv.gz" }, { "fileHashValue" : “ccc”, "fileName" : "result_3.csv.gz" } ],
-
Überprüfen Sie die Signatur, indem Sie den SHA -256-Hash der Zeichenfolge, den öffentlichen Schlüssel und die Signatur als Parameter an den RSA Signaturüberprüfungsalgorithmus übergeben. Wenn das Ergebnis "True" lautet, ist die Sign-Datei gültig.
Validieren der Abfrageergebnissdateien
Überprüfen Sie die Abfrageergebnisdateien, auf die die Sign-Datei verweist, wenn die Sign-Datei gültig ist. Um die Integrität einer Abfrageergebnisdatei zu überprüfen, berechnen Sie ihren Hashwert SHA -256 für ihren komprimierten Inhalt und vergleichen Sie die Ergebnisse mit den Ergebnissen fileHashValue
für die Abfrageergebnisdatei, die in der Signdatei aufgezeichnet sind. Stimmen die Hashwerte überein, ist die Abfrageergebnisdatei gültig.
In den folgenden Abschnitten wird dieser Validierungsprozess ausführlich beschrieben.
A. Abrufen der Sign-Datei
Die ersten Schritte bestehen darin, die Sign-Datei und den Fingerabdruck des öffentlichen Schlüssels abzurufen.
-
Rufen Sie die Sign-Datei aus Ihrem Amazon S3-Bucket für die Abfrageergebnisse ab, die Sie validieren möchten.
-
Rufen Sie als Nächstes den
hashSignature
-Wert aus der Sign-Datei ab. -
Rufen Sie in der Sign-Datei den Fingerabdruck des öffentlichen Schlüssels, dessen privater Schlüssel zum Signieren der Datei verwendet wurde, aus dem Feld
publicKeyFingerprint
ab.
B. Abrufen des öffentlichen Schlüssels zur Validierung der Sign-Datei
Um den öffentlichen Schlüssel zur Validierung der Signdatei abzurufen, können Sie entweder die AWS CLI oder die CloudTrail API verwenden. In beiden Fällen geben Sie einen Zeitraum (Start- und Endzeitpunkt) für die zu validierende Sign-Datei an. Verwenden Sie einen Zeitraum, der der queryCompleteTime
in der Sign-Datei entspricht. Für den angegebenen Zeitraum können ein oder mehrere öffentliche Schlüssel zurückgegeben werden. Möglicherweise überschneiden sich die Gültigkeitszeiträume der zurückgegebenen Schlüssel.
Anmerkung
Da pro Region unterschiedliche private/öffentliche Schlüsselpaare CloudTrail verwendet werden, ist jede Signierdatei mit einem privaten Schlüssel signiert, der für ihre Region einzigartig ist. Wenn Sie also die Sign-Datei einer bestimmten Region validieren, müssen Sie den öffentlichen Schlüssel dieser Region abrufen.
Verwenden Sie die, um öffentliche Schlüssel AWS CLI abzurufen
Um mit dem einen öffentlichen Schlüssel für eine Signdatei abzurufen AWS CLI, verwenden Sie den cloudtrail list-public-keys
Befehl. Der Befehl hat das folgende Format:
aws cloudtrail list-public-keys [--start-time <start-time>] [--end-time <end-time>]
Die Parameter Startzeit und Endzeit sind UTC Zeitstempel und optional. Wenn diese Parameter nicht angegeben werden, wird die aktuelle Uhrzeit verwendet und der aktuell aktive öffentliche Schlüssel (oder mehrere) wird zurückgegeben.
Beispielantwort
Die Antwort wird eine Liste von JSON Objekten sein, die den zurückgegebenen Schlüssel (oder die Schlüssel) darstellen:
Verwenden der CloudTrail API für den Abruf der öffentlichen Schlüssel
Um mithilfe von einen öffentlichen Schlüssel für eine Zeichendatei abzurufen CloudTrail API, übergeben Sie die Werte für die Startzeit und die Endzeit an ListPublicKeys
API. Das ListPublicKeys
API gibt die öffentlichen Schlüssel zurück, deren private Schlüssel verwendet wurden, um die Datei innerhalb des angegebenen Zeitraums zu signieren. Für jeden öffentlichen Schlüssel gibt der API auch den entsprechenden Fingerabdruck zurück.
ListPublicKeys
In diesem Abschnitt werden die Anforderungsparameter und Antwortelemente für die beschrieben ListPublicKeys
API.
Anmerkung
Hinsichtlich der Codierung der binären Felder von ListPublicKeys
sind Änderungen vorbehalten.
Anfrageparameter
Name | Beschreibung |
---|---|
StartTime
|
Gibt optional den Beginn des Zeitbereichs anUTC, in dem der öffentliche Schlüssel für die CloudTrail Signdatei nachgeschlagen werden soll. Wenn StartTime nicht angegeben, wird die aktuelle Uhrzeit verwendet und der aktuelle öffentliche Schlüssel zurückgegeben. Typ: DateTime |
EndTime
|
Gibt optional das Ende des Zeitraums anUTC, in dem nach öffentlichen Schlüsseln für Signaturdateien gesucht CloudTrail werden soll. Wenn nicht angegeben, EndTime wird die aktuelle Uhrzeit verwendet. Typ: DateTime |
Antwortelemente
PublicKeyList
ist ein Array aus PublicKey
-Objekten und enthält folgende Elemente:
Name | Beschreibung |
Value
|
Der DER codierte Wert des öffentlichen Schlüssels im Format PKCS #1. Typ: Blob |
ValidityStartTime
|
Dies gibt den Beginn des Gültigkeitszeitraums für den öffentlichen Schlüssel an. Typ: DateTime |
ValidityEndTime
|
Dies gibt das Ende des Gültigkeitszeitraums für den öffentlichen Schlüssel an. Typ: DateTime |
Fingerprint
|
Die Fingerabdruck des öffentlichen Schlüssels. Mit dem Fingerabdruck kann der öffentliche Schlüssel identifiziert werden, der zur Validierung der Sign-Datei verwendet werden muss. Typ: Zeichenfolge |
C. Auswählen des öffentlichen Schlüssels für die Validierung
Wählen Sie aus den von list-public-keys
oder ListPublicKeys
abgerufenen öffentlichen Schlüsseln denjenigen aus, dessen Fingerabdruck mit dem im Feld publicKeyFingerprint
der Sign-Datei aufgezeichneten Fingerabdruck übereinstimmt. Diesen öffentlichen Schlüssel verwenden Sie für die Validierung der Sign-Datei.
D. Neues Erstellen der Datensignatur-Zeichenfolge
Nachdem Sie über die Signatur der Sign-Datei und dem entsprechenden öffentlichen Schlüssel verfügen, berechnen Sie die Datensignatur-Zeichenfolge. Wenn Sie die Datensignatur-Zeichenfolge berechnet haben, stehen Ihnen alle für die Signaturvalidierung benötigten Daten zur Verfügung.
Die Datensignierungszeichenfolge besteht aus dem Hashwert für jede Abfrageergebnisdatei, getrennt durch ein Leerzeichen. Wenn Sie diese Zeichenfolge neu erstellt haben, können Sie die Sign-Datei validieren.
E. Validieren der Sign-Datei
Übergeben Sie die neu erstellte Datensignaturzeichenfolge, die digitale Signatur und den öffentlichen Schlüssel an den RSA Signaturüberprüfungsalgorithmus. Wenn das Ergebnis "True" lautet, wurde die Signatur der Sign-Datei überprüft und die Sign-Datei ist gültig.
F. Validieren der Abfrageergebnisdateien
Nachdem Sie die Sign-Dateien validiert haben, können Sie die referenzierten Abfrageergebnisdateien überprüfen. Die Zeichendatei enthält die SHA -256 Hashes der Abfrageergebnisdateien. Wenn eine der Abfrageergebnisdateien nach der CloudTrail Lieferung geändert wurde, ändern sich die SHA -256-Hashes und die Signatur der Signierdatei stimmt nicht überein.
Verwenden Sie das folgende Verfahren, um die im files
-Array der Sign-Datei aufgelisteten Abfrageergebnisdateien zu validieren.
-
Rufen Sie den ursprünglichen Hash der Datei aus dem Feld
files.fileHashValue
der Sign-Datei ab. -
Führen Sie für den komprimierten Inhalt der Abfrageergebnisdatei einen Hash mit dem Hash-Algorithmus in
hashAlgorithm
aus. -
Vergleichen Sie den Hashwert, den Sie für jede Abfrageergebnisdatei generiert haben, mit dem
files.fileHashValue
in der Sign-Datei. Wenn die Hashes übereinstimmen, sind die Abfrageergebnisdateien gültig.
Überprüfen von Signatur- und Abfrageergebnisdateien offline
Wenn Sie Sign- und Abfrageergebnisdateien offline validieren möchten, können Sie dazu die in den vorherigen Abschnitten beschriebenen Verfahren nutzen. Sie müssen jedoch die folgenden Informationen zu öffentlichen Schlüsseln berücksichtigen.
Öffentliche Schlüssel
Bei einer Offline-Validierung muss der öffentliche Schlüssel, der für die Validierung der Abfrageergebnisdateien in einem bestimmten Zeitraum erforderlich ist, zuvor online abgerufen (z. B. über den Aufruf von ListPublicKeys
) und dann offline gespeichert werden. Dieser Schritt muss stets wiederholt werden, wenn Sie weitere Dateien außerhalb des ursprünglich angegebenen Zeitraums validieren möchten.
Snippet mit Beispielvalidierung
Der folgende Beispielausschnitt enthält einen Grundcode für die Überprüfung von CloudTrail Zeichen- und Abfrageergebnisdateien. Das Code-Skelett basiert nicht auf einer Online- oder Offline-Validierung, sodass Sie entscheiden können, ob es mit oder ohne Online-Verbindung zu AWS implementiert werden soll. Die vorgeschlagene Implementierung verwendet die Java Cryptography Extension (JCE)
Das Beispiel-Snippet zeigt die folgenden Schritte:
-
So erstellen Sie die Datensignatur-Zeichenfolge für die Validierung der Sign-Dateisignatur.
-
So überprüfen Sie die Sign-Dateisignatur.
-
So berechnen Sie den Hashwert für die Abfrageergebnisdatei und vergleichen ihn mit dem in der Sign-Datei aufgeführten Wert
fileHashValue
, um die Authentizität der Abfrageergebnisdatei zu überprüfen.
import org.apache.commons.codec.binary.Hex; import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; import org.bouncycastle.asn1.pkcs.RSAPublicKey; import org.bouncycastle.asn1.x509.AlgorithmIdentifier; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.json.JSONArray; import org.json.JSONObject; import java.security.KeyFactory; import java.security.MessageDigest; import java.security.PublicKey; import java.security.Security; import java.security.Signature; import java.security.spec.X509EncodedKeySpec; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class SignFileValidationSampleCode { public void validateSignFile(String s3Bucket, String s3PrefixPath) throws Exception { MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); // Load the sign file from S3 (using Amazon S3 Client) or from your local copy JSONObject signFile = loadSignFileToMemory(s3Bucket, String.format("%s/%s", s3PrefixPath, "result_sign.json")); // Using the Bouncy Castle provider as a JCE security provider - http://www.bouncycastle.org/ Security.addProvider(new BouncyCastleProvider()); List<String> hashList = new ArrayList<>(); JSONArray jsonArray = signFile.getJSONArray("files"); for (int i = 0; i < jsonArray.length(); i++) { JSONObject file = jsonArray.getJSONObject(i); String fileS3ObjectKey = String.format("%s/%s", s3PrefixPath, file.getString("fileName")); // Load the export file from S3 (using Amazon S3 Client) or from your local copy byte[] exportFileContent = loadCompressedExportFileInMemory(s3Bucket, fileS3ObjectKey); messageDigest.update(exportFileContent); byte[] exportFileHash = messageDigest.digest(); messageDigest.reset(); byte[] expectedHash = Hex.decodeHex(file.getString("fileHashValue")); boolean signaturesMatch = Arrays.equals(expectedHash, exportFileHash); if (!signaturesMatch) { System.err.println(String.format("Export file: %s/%s hash doesn't match.\tExpected: %s Actual: %s", s3Bucket, fileS3ObjectKey, Hex.encodeHexString(expectedHash), Hex.encodeHexString(exportFileHash))); } else { System.out.println(String.format("Export file: %s/%s hash match", s3Bucket, fileS3ObjectKey)); } hashList.add(file.getString("fileHashValue")); } String hashListString = hashList.stream().collect(Collectors.joining(" ")); /* NOTE: To find the right public key to verify the signature, call CloudTrail ListPublicKey API to get a list of public keys, then match by the publicKeyFingerprint in the sign file. Also, the public key bytes returned from ListPublicKey API are DER encoded in PKCS#1 format: PublicKeyInfo ::= SEQUENCE { algorithm AlgorithmIdentifier, PublicKey BIT STRING } AlgorithmIdentifier ::= SEQUENCE { algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL } */ byte[] pkcs1PublicKeyBytes = getPublicKey(signFile.getString("queryCompleteTime"), signFile.getString("publicKeyFingerprint")); byte[] signatureContent = Hex.decodeHex(signFile.getString("hashSignature")); // Transform the PKCS#1 formatted public key to x.509 format. RSAPublicKey rsaPublicKey = RSAPublicKey.getInstance(pkcs1PublicKeyBytes); AlgorithmIdentifier rsaEncryption = new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, null); SubjectPublicKeyInfo publicKeyInfo = new SubjectPublicKeyInfo(rsaEncryption, rsaPublicKey); // Create the PublicKey object needed for the signature validation PublicKey publicKey = KeyFactory.getInstance("RSA", "BC") .generatePublic(new X509EncodedKeySpec(publicKeyInfo.getEncoded())); // Verify signature Signature signature = Signature.getInstance("SHA256withRSA", "BC"); signature.initVerify(publicKey); signature.update(hashListString.getBytes("UTF-8")); if (signature.verify(signatureContent)) { System.out.println("Sign file signature is valid."); } else { System.err.println("Sign file signature failed validation."); } System.out.println("Sign file validation completed."); } }