In dieser Anleitung wird beschrieben, wie Sie einen Cloud HSM-Schlüssel für die Microsoft Authenticode-Signierung über PKCS#11 und Jsign erstellen.
Anwendungsfälle
Der in diesem Dokument beschriebene Workflow hilft, die folgenden Sicherheitsanforderungen von Unternehmen zu erfüllen:
- Firmware mit einem privaten Schlüssel signieren, der durch ein FIPS140-2 Level 3-HSM geschützt ist.
- Windows-Artefakte signieren, ohne signtool verwenden zu müssen
Hinweis
Für diese Anleitung benötigen Sie Folgendes:
- Ein Windows-Computer mit den Artefakten, die Sie signieren möchten. Prüfen Sie, ob Java auf diesem Computer installiert ist.
Cloud Shell oder Ihr eigener Linux-Computer, um eine Anfrage zur Signierung des Zertifikats oder ein Zertifikat zu generieren. Führen Sie auf diesem Computer die in OpenSSL-Einrichtung dokumentierte Konfiguration aus.
Denken Sie daran, gcloud auth application-default login auszuführen, falls Sie das noch nicht getan haben.
Laden Sie auf Ihrem Windows-Computer die JAR-Datei des neuesten Jsign-Release mit dem folgenden PowerShell-Befehl herunter:
wget https://github.com/ebourg/jsign/releases/download/JSIGN.VERSION/jsign-JSIGN.VERSION.jar -O jsign.jar
Konfiguration
Von Cloud KMS gehosteten Signaturschlüssel erstellen
Erstellen Sie mit Cloud Shell oder Ihrem eigenen Computer einen Cloud KMS-Schlüsselbund in Ihrem Google Cloud -Projekt mit dem folgenden Befehl:
gcloud kms keyrings create "KEY_RING" --location "LOCATION"
Erstellen Sie dann in IhremGoogle Cloud -Projekt einen Cloud KMS-Hardwaresignaturschlüssel EC-P256-SHA256 im Schlüsselbund, den Sie gerade erstellt haben:
gcloud kms keys create "KEY_NAME" --keyring "KEY_RING" \
--project "PROJECT_ID" --location "LOCATION" \
--purpose "asymmetric-signing" --default-algorithm "ec-sign-p256-sha256" \
--protection-level "hsm"
HSM-Attestierung herunterladen
Eine HSM-Attestierung ist ein Nachweis dafür, dass sich Ihr Schlüssel in einem HSM befindet. Dieser Nachweis ist möglicherweise erforderlich, damit Ihre Zertifizierungsstelle ein EV-Zertifikat ausstellen kann.
So laden Sie die HSM-Attestierung für Ihren Cloud KMS-Schlüssel herunter:
Rufen Sie in der Google Cloud Console die Seite Schlüsselverwaltung auf.
Wählen Sie den Schlüsselbund mit dem Schlüssel aus, den Sie attestieren möchten. Wählen Sie dann den Schlüssel aus.
Klicken Sie für die zu attestierende Schlüsselversion auf das Dreipunkt-Menü more_vert und dann auf Attestierung bestätigen.
Klicken Sie im Dialogfeld Bestätigung überprüfen auf Bestätigungsbundle herunterladen. Dadurch wird eine ZIP-Datei mit den Attestierungs- und Zertifikatsketten heruntergeladen.
Eine vollständige Anleitung zum Überprüfen der heruntergeladenen Attestierung finden Sie unter Attestierung parsen.
Selbst signiertes Zertifikat mit OpenSSL erstellen
Dieser Schritt ist optional, hilft Ihnen aber, sich mit den nachfolgenden Schritten vertraut zu machen, bevor Sie ein von einer Zertifizierungsstelle signiertes Zertifikat kaufen.
Generieren Sie mit Cloud Shell oder Ihrem eigenen Computer ein selbst signiertes Zertifikat mit dem von Cloud KMS gehosteten Signaturschlüssel. Sie können OpenSSL verwenden, um einen PKCS #11-URI anstelle eines Dateipfads zu verwenden und den Schlüssel anhand seines Labels zu identifizieren. In der Cloud KMS PKCS #11-Bibliothek entspricht das Schlüssellabel dem CryptoKey-Namen.
openssl req -new -x509 -days 3650 -subj '/CN=test/' -sha256 -engine pkcs11 \
-keyform engine -key pkcs11:object=KEY_NAME > ca.cert
Wenn dieser Befehl fehlschlägt, wurde PKCS11_MODULE_PATH möglicherweise falsch festgelegt oder Sie haben nicht die erforderlichen Berechtigungen zur Verwendung des Cloud KMS-Signaturschlüssels.
Sie sollten jetzt ein Zertifikat haben, das so aussieht:
-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----
Kopieren Sie das Zertifikat auf Ihren Windows-Computer, damit Sie es mit Jsign zum Signieren Ihrer Artefakte verwenden können.
Neue Zertifikatsignierungsanfrage erstellen
Sie können eine Anfrage zum Signieren eines Zertifikats (Certificate Signing Request, CSR) für einen Cloud HSM-Signierschlüssel generieren. Führen Sie diese Schritte aus, wenn Ihre Zertifizierungsstelle eine CSR benötigt, um ein neues Zertifikat für die Codesignierung zu generieren.
Führen Sie den folgenden Befehl mit Cloud Shell oder auf Ihrem eigenen Computer aus:
openssl req -new -subj '/CN=CERTIFICATE_NAME/' DIGEST_FLAG \
-engine pkcs11 -keyform engine \
-key pkcs11:id=KEY_ID > REQUEST_NAME.csr
Ersetzen Sie Folgendes:
CERTIFICATE_NAME: ein Name für das Zertifikat, das Sie generieren möchten.DIGEST_FLAG: Ein Flag, das den Typ des Digests angibt. Verwenden Sie-sha256,-sha384oder-sha512, je nach Algorithmus des Schlüssels.KEY_ID: die voll qualifizierte Ressourcen-ID einer asymmetrischen Signaturschlüsselversion, z. B.projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1.REQUEST_NAME: ein Name für die Zertifikatsignierungsanfrage.
Achten Sie darauf, dass Sie die richtigen -sigopt-Optionen für den verwendeten Schlüsseltyp verwenden.
Nachdem Sie den CSR haben, können Sie ihn Ihrer Zertifizierungsstelle (CA) zur Verfügung stellen, um das Signaturzertifikat zu erhalten. Verwenden Sie das Zertifikat, das von Ihrer Zertifizierungsstelle bereitgestellt wurde, im nächsten Abschnitt.
Artefakt mit Jsign signieren
Nachdem Sie ein Zertifikat (entweder selbst signiert oder von der Zertifizierungsstelle bezogen) erstellt und auf Ihren Windows-Computer kopiert haben, können Sie es zum Signieren eines Windows-Artefakts verwenden.
Führen Sie den Befehl jsign --help aus, um eine Liste der unterstützten Dateiformate aufzurufen.
Signieren Sie die Artefakte mit Jsign, indem Sie Ihren Cloud KMS-Schlüssel und Ihr Zertifikat verwenden.
java -jar PATH_TO_JSIGN.JAR --storetype GOOGLECLOUD \
--storepass $(gcloud auth application-default print-access-token) \
--keystore projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING \
--alias KEY_NAME \
--certfile PATH_TO_CA.CERT
PATH_TO_ARTIFACT_TO_SIGN
Ersetzen Sie Folgendes:
PATH_TO_JSIGN.JAR: der Pfad zujsign.jar.PATH_TO_CA.CERT: der Pfad zu Ihrem Zertifikatca.cert.PATH_TO_ARTIFACT_TO_SIGN: Der Pfad zum Artefakt, das Sie signieren möchten.
Eine detaillierte Erläuterung der einzelnen Befehlsoptionen finden Sie in der offiziellen Jsign-Dokumentation.