[JAVA] Wie unterschreibe ich Minecraft MOD?

Einführung

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.

Werkzeuge, die Sie brauchen

Lassen Sie uns ein Zertifikat machen

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.

Versuchen Sie, mit JDK-Tools zu erstellen

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.

Führen Sie das Generierungswerkzeug aus

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".

Passwort angeben

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.

Eingabe verschiedener Informationen

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.

  1. Vor- und Nachname Dies kann ein Spitzname oder ein Twitter-Kontoname sein.

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.

Passwort angeben

Am Ende werden Sie nach dem Passwort gefragt. Wenn es jedoch mit dem ersten Passwort übereinstimmt, drücken Sie einfach die Eingabetaste.

Überprüfen Sie, ob das PKCS12-Format einen Anzeigenamen enthält

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.

Überprüfen Sie den freundlichen Namen

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

Legen Sie einen Anzeigenamen im PKCS12-Format fest

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

Untersuchen Sie den Fingerabdruckwert

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.

Verwenden Sie OpenSSL

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 ":".

Machen Sie den Fingerabdruckwert zu einer von MOD beschriebenen Zeichenfolge

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.

Schreiben wir in den Quellcode von MOD

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 ...*/
}

Was tun, wenn die Signaturen nicht übereinstimmen?

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.

Signieren Sie die JAR-Datei

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.

Mit Befehl unterschreiben

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.

Unterschreiben Sie mit Gradle

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.

Lassen Sie uns die Operation überprüfen

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

Wie unterschreibe ich Minecraft MOD?
Wie schreibe ich einen Core Mod in Minecraft Forge 1.15.2
Wie hinterlasse ich einen Kommentar?
So fügen Sie ein Video ein
So erstellen Sie eine Methode
Wie erstelle ich einen MOD für Slay the Spire?
So erstellen Sie einen Java-Container
So erstellen Sie einen JDBC-Treiber
[Swift] So senden Sie eine Benachrichtigung
So erstellen Sie einen Begrüßungsbildschirm
So erstellen Sie ein Jenkins-Plug-In
Wie erstelle ich ein Maven-Projekt?
Minecraft Modding [1.12] So fügen Sie einen speziellen Render für Item hinzu
So erstellen Sie ein Java-Array
So führen Sie einen Vertrag mit web3j aus
So sortieren Sie eine Liste mit Comparator
So erstellen Sie eine Java-Kalenderzusammenfassung
Ein Memorandum zur Verwendung von Eclipse
[Basic] So schreiben Sie ein Dockerfile Selbstlernend ②
So fügen Sie einen neuen Hash / Array hinzu
[Einführung in Java] So schreiben Sie ein Java-Programm
So erstellen Sie ein Maven-Repository für 2020
Wie erstelle ich einen Discord Bot (Java)
[Swift5] So erstellen Sie einen Begrüßungsbildschirm
[Rails] So erstellen Sie eine Teilvorlage
So veröffentlichen Sie eine Bibliothek in jCenter
[SpringBoot] So schreiben Sie einen Controller-Test
Schienen: Wie man eine Rechenaufgabe schön schreibt
So erstellen Sie überall eine H2-Datenbank
[Rails] Wie schreibe ich, wenn ich eine Unterabfrage mache?
[Rails] So erstellen Sie ein Diagramm mit lazy_high_charts
[Android] So konvertieren Sie eine Zeichenfolge in resourceId
So erhalten Sie einen Heapdump aus einem Docker-Container
So zeigen Sie eine Webseite in Java an
So löschen Sie einen Controller usw. mit einem Befehl
[Ethereum] So führen Sie einen Vertrag mit web3j-Teil 2 aus
So erstellen Sie Pagenationen für das "Kaminari" -Array
So erstellen Sie eine Klasse, die Klasseninformationen erbt
So konvertieren Sie einen Soliditätsvertrag in eine Java-Vertragsklasse
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [Einführung]
So führen Sie eine djUnit-Aufgabe in Ant aus
So fügen Sie in Spring Boot einen Klassenpfad hinzu
So erstellen Sie ein Thema in Liferay 7 / DXP
So erstellen Sie eine leichte JRE für den Vertrieb
[Java] Erstellen wir einen Minecraft Mod 1.16.1 [Einführung]
[1.] So erstellen Sie ein Spring-MVC-Framework-Projekt
So implementieren Sie eine ähnliche Funktion in Rails
So erstellen Sie einfach ein Pulldown mit Rails
So generieren Sie einen Primärschlüssel mit @GeneratedValue
[Rails] So erstellen Sie eine Twitter-Freigabeschaltfläche
[Ruby] So generieren Sie eine zufällige Alphabet-Zeichenfolge
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [99. Mod-Ausgabe]