[JAVA] Comment signer Minecraft MOD

introduction

Lorsqu'un MOD Minecraft est chargé, un message indiquant que le fichier JAR du MOD n'est pas signé peut être affiché dans le journal. Même s'il n'est pas signé, cela n'affecte pas le fonctionnement de MOD, mais pour ceux qui veulent supprimer le journal des messages, je décrirai la procédure de signature.

Les outils dont vous avez besoin

Faisons un certificat

Vous aurez besoin d'un certificat pour signer. Vous pouvez le générer avec OpenSSL ou Windows SDK makecert.exe, ou demander à une autorité de certification d'émettre un certificat de signature de code, mais le fichier au format PKCS12 obtenu de cette manière est Oui, si vous connaissez la valeur de l'empreinte digitale, passez à la description dans le code source MOD. Si vous n'êtes pas sûr, passez à Confirmer l'empreinte digitale.

Essayez de créer avec les outils JDK

Cette section décrit la procédure de création d'un certificat à l'aide des outils JDK. C'est un soi-disant «certificat Oreore» qui n'est pas émis par l'autorité de certification, mais il semble qu'il n'y ait pas de problème pour Minecraft Forge.

Exécutez l'outil de génération

python


$ keytool -genkeypair -storetype pkcs12 -keystore <FILENAME>.p12 -alias <FRIENDLYNAME> -keyalg ec -keysize 384 -validity 3650

-- -storetype est le format de fichier de certificat Spécifiez pkcs12 pour sortir dans PKCS12, qui est un format plus général. Si rien n'est spécifié, il sera au format JKS, mais un avertissement sera émis après la génération de la clé. Assurez-vous également de le définir ici sur pkcs12 car il devra être traité par OpenSSL plus tard. ---keystore spécifie le nom du fichier dans lequel le certificat créé sera enregistré ---alias est le nom de base du fichier de signature ajouté au fichier JAR Au format PKCS12, il est représenté sous la forme d'un nom convivial. ---keyalg est un algorithme de signature Vous pouvez spécifier rsa ou ʻec. ---keysize est la longueur de la clé La valeur qui peut être spécifiée dépend de l'algorithme. Dans le cas de "-keyalg rsa", ce sera un multiplicateur de 2 tel que "2048" ou "4096". Dans le cas de «-keyalg ec», ce sera soit «256», «384» ou «521». --validité` est le nombre de jours d'expiration calculé à partir de la date de création Pendant 10 ans, ce sera «3650».

Spécifier un mot de passe

Lorsque vous exécutez la commande, vous serez d'abord invité à entrer un mot de passe. Si vous souhaitez utiliser la tâche build.gradle pour signer, c'est une bonne idée d'utiliser une chaîne sur laquelle vous pouvez vous engager. Dans ce cas, le fichier de certificat ne doit jamais être publié.

Saisie de diverses informations

Ensuite, définissez le nom commun du certificat, qui se compose de plusieurs champs. J'expliquerai dans l'ordre dans lequel ils sont affichés.

  1. Prénom et nom Cela peut être un surnom ou un nom de compte Twitter.

Lorsque vous avez fini d'entrer le code du pays, il vous sera demandé «[Non]:». C'est une question qui n'a pas de sens, mais entrez simplement «y». Sinon, vous devrez recommencer.

Spécifier un mot de passe

On vous demandera le mot de passe à la fin, mais s'il est le même que le premier mot de passe, appuyez simplement sur la touche Entrée.

Vérifiez si le format PKCS12 contient un nom convivial

Lors de l'utilisation du «keytool» mentionné ci-dessus, le nom convivial est inclus comme chaîne de caractères spécifiée par «-alias», mais lorsqu'il est émis par l'autorité de certification ou généré par OpenSSL, le nom convivial n'est pas défini. Il y a. Cette procédure peut également être appliquée pour modifier les mots de passe au format PKCS12.

Vérifier le nom convivial

Exécutez la commande suivante et ce n'est pas grave si vous avez un friendlyName sous Attributs de sac.

python


$ openssl pkcs12 -in <FILENAME>.p12 -info -nokeys

Définir un nom convivial au format PKCS12

Si le nom convivial n'est pas défini, ajoutez-le.

① Sauvegarde

python


$ mv <FILENAME>.p12 <FILENAME>.p12.bak

② Retirez le certificat et la clé de PKCS12

python


$ openssl pkcs12 -in <FILENAME>.p12.bak -info -nodes -out <FILENAME>.txt

③ Générez PKCS12 tout en définissant un nom convivial à partir du certificat et de la clé extraits

python


$ openssl pkcs12 -export -in <FILENAME>.txt -name <FRIENDLYNAME> -out <FILENAME>.p12

Veuillez noter que le mot de passe doit comporter au moins 6 caractères. Ceci est une spécification de jarsigner, et un mot de passe qui ne répond pas à cela entraînera une erreur.

④ Nettoyer

python


$ rm <FILENAME>.txt

Examiner la valeur de l'empreinte digitale

Si vous souhaitez publier un fichier JAR signé d'un MOD Minecraft, vous aurez besoin de la valeur de l'empreinte digitale. Une empreinte digitale est une valeur obtenue en traitant un certificat en données binaires (format ASN-1) avec une fonction de hachage. Étant donné que la même valeur d'empreinte digitale peut être obtenue à partir du même certificat, la valeur examinée ici peut être utilisée tant qu'elle n'est pas recréée en raison de l'expiration. Minecraft Forge nécessite des valeurs d'empreintes digitales dans l'algorithme de hachage SHA-1.

Utiliser OpenSSL

python


$ openssl pkcs12 -in <FILENAME>.p12 -info -nokeys|openssl x509 -fingerprint -noout

Lors de l'exécution, après avoir entré le mot de passe, la valeur de l'empreinte digitale sera sortie en notation hexadécimale séparée par ":".

Faire de la valeur d'empreinte digitale une chaîne décrite par MOD

Après avoir supprimé le ":" de cette notation et l'avoir connecté, réécrivez les majuscules en minuscules. C'est la valeur de l'empreinte digitale décrite dans le MOD.

Écrivons le code source de MOD

Ajoutez certificateFingerprint à l'annotation @ Mod, puis écrivez la valeur de l'empreinte digitale sous forme de chaîne.

HogeMod.java


@Mod(modid = "hogemod",
    /*... Omis ...*/
    certificateFingerprint = "Valeur d'empreinte digitale")
public class HogeMod {
/*... Omis ...*/
}

Que faire lorsque les signatures ne correspondent pas

Certains ne sont pas obligatoires, mais sont appelés lorsque les gestionnaires d'événements de Forge ne correspondent pas à leurs signatures. Comme pour FMLPreInitializationEvent et FMLInitializationEvent, déclarez une méthode avec un argument de FMLFingerprintViolationEvent à l'aide de l'annotation @ Mod.EventHandler.

HogeMod.java


@Mod.EventHandler
public void badSignature(FMLFingerprintViolationEvent event)
{
    System.err.println("Les signatures ne correspondent pas!Pas le fichier de distribution d'origine!");
}

Une fois la description terminée, générez un fichier JAR avec gradle.

Signez le fichier JAR

Il y a deux façons de faire le processus de signature, l'une consiste à exécuter la commande et l'autre à le faire avec gradle.

Signer avec commande

python


$ jarsigner -sigalg SHA256withECDSA -digestalg SHA-256 -tsa http://timestamp.digicert.com -keystore <FILENAME>.p12 <JARFILE> <FRIENDLYNAME>

---sigalg est un algorithme de signature Lorsque vous utilisez le DSA à courbe elliptique, utilisez SHA256withECDSA. ---digestalg est un algorithme de hachage Spécifiez le même hachage que -sigalg. Dans ce cas, ce sera «SHA-256». ---tsa est l'URL du serveur d'horodatage Vous pouvez signer sans lui, mais la signature sera invalide lorsque le certificat expirera. Il existe différents types de serveurs d'horodatage. C'est le serveur qui renvoie la signature d'horodatage avec SHA-256. http://sha256timestamp.ws.symantec.com/sha256/timestamp

L'algorithme utilisé pour la signature et le hachage, mais peut être tout ce que Java prend en charge. https://docs.oracle.com/javase/jp/9/docs/specs/security/standard-names.html Vous pouvez sélectionner -sigalg dans l'algorithme Signature ici et -digestalg dans l'algorithme Message Digest ici.

Il vous sera demandé un mot de passe, alors spécifiez le mot de passe correct pour terminer la signature.

Signer avec Gradle

Ajoutez le code suivant à la fin de build.gradle. Chaque argument passé à ʻant.signjarest le même quejarsigner` dans la section précédente.

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

Lorsque vous exécutez une compilation en utilisant ce build.gradle, un fichier JAR signé sera généré.

Vérifions le fonctionnement

Placez le fichier JAR signé généré dans le dossier mods et lancez Minecraft avec Forge installé. Lorsque vous atteignez l'écran titre, ouvrez logs \ debug.log, qui se trouve dans la même hiérarchie que ʻoptions.txt`.

Si la signature est reconnue avec succès, une telle formulation apparaîtra.

debug.log


[HH:MM:SS] [main/DEBUG] [FML]: Mod signature data
[HH:MM:SS] [main/DEBUG] [FML]:  	Valid Signatures:
... Omis ...
[HH:MM:SS] [main/DEBUG] [FML]: 		(Valeur d'empreinte digitale) <MOD ID>	(<Nom du MOD>	<Version MOD>)	<Nom de fichier JAR>
... Omis ...

Recommended Posts

Comment signer Minecraft MOD
Comment écrire un mod de base dans Minecraft Forge 1.15.2
Comment laisser un commentaire
Comment insérer une vidéo
Comment créer une méthode
Comment faire un MOD pour Slay the Spire
Comment créer un conteneur Java
Comment créer un pilote JDBC
[Swift] Comment envoyer une notification
Comment créer un écran de démarrage
Comment créer un plug-in Jenkins
Comment faire un projet Maven
Minecraft Modding [1.12] Comment attacher un rendu spécial pour Item
Comment créer un tableau Java
Comment exécuter un contrat avec web3j
Comment trier une liste à l'aide du comparateur
Comment créer un résumé de calendrier Java
Un mémorandum sur l'utilisation d'Eclipse
[Basique] Comment écrire un auto-apprentissage Dockerfile ②
Comment ajouter un nouveau hachage / tableau
[Introduction à Java] Comment écrire un programme Java
Comment créer un référentiel Maven pour 2020
Comment créer un robot Discord (Java)
[Swift5] Comment créer un écran de démarrage
[rails] Comment créer un modèle partiel
Comment publier une bibliothèque dans jCenter
[SpringBoot] Comment écrire un test de contrôleur
Rails: comment bien écrire une tâche de râteau
Comment créer une base de données H2 n'importe où
[Rails] Comment écrire lors de la création d'une sous-requête
[Rails] Comment créer un graphique à l'aide de lazy_high_charts
[Android] Comment convertir une chaîne de caractères en resourceId
Comment obtenir un heapdump à partir d'un conteneur Docker
Comment afficher une page Web en Java
Comment supprimer un contrôleur, etc. à l'aide d'une commande
[Ethereum] Comment exécuter un contrat en utilisant web3j-Part 2-
Comment créer des pages pour le tableau "kaminari"
Comment créer une classe qui hérite des informations de classe
Comment convertir un contrat de solidité en une classe de contrat Java
[Java] Créons un Minecraft Mod 1.14.4 [Introduction]
Comment exécuter une tâche djUnit dans Ant
Comment ajouter un chemin de classe dans Spring Boot
Comment créer un thème dans Liferay 7 / DXP
Comment créer un JRE léger pour la distribution
[Java] Créons un Minecraft Mod 1.16.1 [Introduction]
[1st] Comment créer un projet de framework Spring-MVC
Comment implémenter une fonctionnalité similaire dans Rails
Comment créer facilement un pull-down avec des rails
Comment générer une clé primaire à l'aide de @GeneratedValue
[Rails] Comment créer un bouton de partage Twitter
[Ruby] Comment générer une chaîne de caractères d'alphabet aléatoire
[Java] Créons un Minecraft Mod 1.14.4 [99. Mod output]