Wenn ein Minecraft-MOD geladen wird, wird möglicherweise eine Meldung ausgegeben, dass die JAR-Datei des MOD nicht signiert ist. Selbst wenn es nicht signiert ist, hat es keine Auswirkungen auf den Betrieb von MOD. Für diejenigen, die das Nachrichtenprotokoll unterdrücken möchten, werde ich den Signaturvorgang beschreiben.
Zum Unterschreiben benötigen Sie ein Zertifikat. Sie können es mit OpenSSL oder Windows SDK "makecert.exe" generieren oder bei einer Zertifizierungsstelle beantragen, ein Codesignaturzertifikat auszustellen. Die auf diese Weise erhaltene Datei im PKCS12-Format ist jedoch Ja, wenn Sie den Fingerabdruckwert kennen, fahren Sie mit der Beschreibung im MOD-Quellcode fort. Wenn Sie sich nicht sicher sind, fahren Sie mit Bestätigen des Fingerabdrucks fort.
In diesem Abschnitt wird das Verfahren zum Erstellen eines Zertifikats mit den JDK-Tools beschrieben. Es handelt sich um ein sogenanntes "Oreore-Zertifikat", das nicht von der Zertifizierungsstelle ausgestellt wurde, aber es scheint, dass es für Minecraft Forge kein Problem gibt.
python
$ keytool -genkeypair -storetype pkcs12 -keystore <FILENAME>.p12 -alias <FRIENDLYNAME> -keyalg ec -keysize 384 -validity 3650
-- -storetype
ist das Zertifikatdateiformat
Geben Sie "pkcs12" für die Ausgabe in PKCS12 an, einem allgemeineren Format.
Wenn nichts angegeben ist, liegt es im JKS-Format vor, es wird jedoch eine Warnung ausgegeben, nachdem der Schlüssel generiert wurde.
Stellen Sie außerdem sicher, dass es hier auf "pkcs12" gesetzt ist, da es später von OpenSSL verarbeitet werden muss.
---keystore
gibt den Namen der Datei an, in der das erstellte Zertifikat gespeichert wird
---alias
ist der Basisname der Signaturdatei, die der JAR-Datei hinzugefügt wurde
Im PKCS12-Format wird es als Anzeigename dargestellt.
---keyalg
ist ein Signaturalgorithmus
Sie können "rsa" oder "ec" angeben.
---keysize
ist die Schlüssellänge
Der Wert, der angegeben werden kann, hängt vom Algorithmus ab.
Im Fall von "-keyalg rsa" ist es ein Multiplikator von 2 wie "2048" oder "4096".
Im Fall von "-keyalg ec" ist es entweder "256", "384" oder "521".
Wenn Sie den Befehl ausführen, werden Sie zunächst zur Eingabe eines Kennworts aufgefordert. Wenn Sie die sign.g-Task zum Signieren verwenden möchten, empfiehlt es sich, eine Zeichenfolge zu verwenden, für die Sie eine Festschreibung vornehmen können. In diesem Fall sollte die Zertifikatdatei niemals veröffentlicht werden.
Legen Sie als Nächstes den allgemeinen Namen des Zertifikats fest, das aus mehreren Feldern besteht. Ich werde in der Reihenfolge erklären, in der sie angezeigt werden.
Wenn Sie die Landesvorwahl eingegeben haben, werden Sie gefragt: "[Nein]:". Dies ist eine Frage, die keinen Sinn ergibt, sondern nur "y" eingibt. Andernfalls müssen Sie von vorne beginnen.
Am Ende werden Sie nach dem Passwort gefragt. Wenn es jedoch mit dem ersten Passwort übereinstimmt, drücken Sie einfach die Eingabetaste.
Bei Verwendung des oben genannten "Keytools" wird der Anzeigename als durch "-alias" angegebene Zeichenfolge eingefügt. Wenn er jedoch von der Zertifizierungsstelle ausgegeben oder von OpenSSL generiert wird, wird der Anzeigename nicht festgelegt. Es gibt. Dieses Verfahren kann auch angewendet werden, um Kennwörter im PKCS12-Format zu ändern.
Führen Sie den folgenden Befehl aus und es ist in Ordnung, wenn Sie unter Bag Attributes einen FriendlyName haben.
python
$ openssl pkcs12 -in <FILENAME>.p12 -info -nokeys
Wenn der Anzeigename nicht festgelegt ist, fügen Sie ihn hinzu.
① Sicherung
python
$ mv <FILENAME>.p12 <FILENAME>.p12.bak
② Nehmen Sie das Zertifikat und den Schlüssel aus PKCS12 heraus
python
$ openssl pkcs12 -in <FILENAME>.p12.bak -info -nodes -out <FILENAME>.txt
③ Generieren Sie PKCS12, während Sie aus dem extrahierten Zertifikat und Schlüssel einen Anzeigenamen festlegen
python
$ openssl pkcs12 -export -in <FILENAME>.txt -name <FRIENDLYNAME> -out <FILENAME>.p12
Bitte beachten Sie, dass das Passwort mindestens 6 Zeichen lang sein muss. Dies ist eine Spezifikation von "jarsigner", und ein Passwort, das dies nicht erfüllt, führt zu einem Fehler.
④ Aufräumen
python
$ rm <FILENAME>.txt
Wenn Sie eine signierte JAR-Datei eines Minecraft MOD veröffentlichen möchten, benötigen Sie den Fingerabdruckwert. Ein Fingerabdruck ist ein Wert, der durch Verarbeiten eines Zertifikats in Binärdaten (ASN-1-Format) mit einer Hash-Funktion erhalten wird. Da derselbe Fingerabdruckwert aus demselben Zertifikat abgerufen werden kann, kann der hier untersuchte Wert verwendet werden, solange er aufgrund des Ablaufs nicht neu erstellt wird. Minecraft Forge erfordert Fingerabdruckwerte im SHA-1-Hash-Algorithmus.
python
$ openssl pkcs12 -in <FILENAME>.p12 -info -nokeys|openssl x509 -fingerprint -noout
Bei der Ausführung wird nach Eingabe des Kennworts der Fingerabdruckwert in hexadezimaler Schreibweise ausgegeben, getrennt durch ":".
Nachdem Sie das ":" aus dieser Notation entfernt und verbunden haben, schreiben Sie die Groß- und Kleinschreibung neu. Dies ist der Wert des im MOD beschriebenen Fingerabdrucks.
Fügen Sie der Annotation "@ Mod" "certificateFingerprint" hinzu und schreiben Sie den Fingerabdruckwert als Zeichenfolge.
HogeMod.java
@Mod(modid = "hogemod",
/*... weggelassen ...*/
certificateFingerprint = "Fingerabdruckwert")
public class HogeMod {
/*... weggelassen ...*/
}
Einige sind nicht erforderlich, werden jedoch aufgerufen, wenn die Ereignishandler von Forge nicht mit ihren Signaturen übereinstimmen. Deklarieren Sie wie bei "FMLPreInitializationEvent" und "FMLInitializationEvent" eine Methode mit dem Argument "FMLFingerprintViolationEvent" unter Verwendung der Annotation "@ Mod.EventHandler".
HogeMod.java
@Mod.EventHandler
public void badSignature(FMLFingerprintViolationEvent event)
{
System.err.println("Signaturen stimmen nicht überein!Nicht die ursprüngliche Verteilungsdatei!");
}
Generieren Sie nach Abschluss der Beschreibung eine JAR-Datei mit gradle.
Es gibt zwei Möglichkeiten, den Signiervorgang durchzuführen: Die eine besteht darin, den Befehl auszuführen, und die andere darin, ihn mit gradle ausführen zu lassen.
python
$ jarsigner -sigalg SHA256withECDSA -digestalg SHA-256 -tsa http://timestamp.digicert.com -keystore <FILENAME>.p12 <JARFILE> <FRIENDLYNAME>
---sigalg
ist ein Signaturalgorithmus
Verwenden Sie bei Verwendung der elliptischen Kurve DSA "SHA256withECDSA".
---Digestalg
ist ein Hashing-Algorithmus
Geben Sie den gleichen Hash wie "-sigalg" an. In diesem Fall ist es "SHA-256".
---tsa
ist die URL des Zeitstempelservers
Sie können ohne signieren, aber wenn das Zertifikat abläuft, ist die Signatur ungültig.
Es gibt verschiedene Arten von Zeitstempelservern.
Dies ist der Server, der die Zeitstempelsignatur mit SHA-256 zurückgibt.
http://sha256timestamp.ws.symantec.com/sha256/timestamp
Der Algorithmus, der zum Signieren und Hashing verwendet wird, kann jedoch alles sein, was Java unterstützt. https://docs.oracle.com/javase/jp/9/docs/specs/security/standard-names.html Sie können hier "-sigalg" aus dem Signaturalgorithmus und "-digestalg" aus dem Message Digest-Algorithmus hier auswählen.
Sie werden nach einem Passwort gefragt. Geben Sie daher das richtige Passwort an, um die Signatur abzuschließen.
Fügen Sie den folgenden Code am Ende von "build.gradle" hinzu.
Jedes an ant.signjar
übergebene Argument ist dasselbe wie jarsigner
im vorherigen Abschnitt.
build.gradle
task signJar<<{
ant.signjar(
jar:jar.archivePath,
alias:"<FRIENDLYNAME>",
keystore:"<FILENAME>.p12",
storepass:"<PASSWORD>",
sigalg:"SHA256withECDSA",
digestalg:"SHA-256",
tsaurl:"http://timestamp.digicert.com"
)
}
signJar.dependsOn reobfJar
assemble.dependsOn signJar
Wenn Sie einen Build mit diesem build.gradle
ausführen, wird eine signierte JAR-Datei generiert.
Lege die generierte signierte JAR-Datei in den Mods-Ordner und starte Minecraft mit installiertem Forge.
Wenn Sie den Titelbildschirm erreichen, öffnen Sie logs \ debug.log
in derselben Hierarchie wie options.txt
.
Wenn die Signatur erfolgreich erkannt wurde, wird ein solcher Wortlaut angezeigt.
debug.log
[HH:MM:SS] [main/DEBUG] [FML]: Mod signature data
[HH:MM:SS] [main/DEBUG] [FML]: Valid Signatures:
... weggelassen ...
[HH:MM:SS] [main/DEBUG] [FML]: (Fingerabdruckwert) <MOD ID> (<MOD-Name> <MOD-Version>) <JAR-Dateiname>
... weggelassen ...
Recommended Posts