提供: Minecraft Modding Wiki
移動先: 案内検索

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 編集中の文章
6行目: 6行目:
 
MinecraftのMODはjar形式で提供されますが、このjarが読み込まれる際に署名が付いていない旨の警告がログに出力される場合があります。<br/>
 
MinecraftのMODはjar形式で提供されますが、このjarが読み込まれる際に署名が付いていない旨の警告がログに出力される場合があります。<br/>
 
本記事はその警告を出なくするため、jarファイルに署名を加える方法を解説します。<br/>
 
本記事はその警告を出なくするため、jarファイルに署名を加える方法を解説します。<br/>
 
==前提条件==
 
対象となるMODの、build.gradleでのビルドが正常に完了し、本番環境で問題無く動作する状態であること。
 
  
 
==署名に必要なツール==
 
==署名に必要なツール==
14行目: 11行目:
 
*OpenSSL (証明書の作成時のみ)
 
*OpenSSL (証明書の作成時のみ)
  
=証明書の作成=
+
==証明書の作成==
 
署名に必要な証明書は、認証局に申請して入手するかOpenSSLやWindows Serverの証明書機関で生成してもかまいません。<br/>
 
署名に必要な証明書は、認証局に申請して入手するかOpenSSLやWindows Serverの証明書機関で生成してもかまいません。<br/>
 
その場合はこの手順はスキップして、フレンドリ名の確認まで飛ばして下さい。<br/>
 
その場合はこの手順はスキップして、フレンドリ名の確認まで飛ばして下さい。<br/>
22行目: 19行目:
 
上記のコマンドを実行すると、楕円曲線暗号の384bitを鍵とした証明書を作成します。<br/>
 
上記のコマンドを実行すると、楕円曲線暗号の384bitを鍵とした証明書を作成します。<br/>
  
==パスワードについて==
+
===パスワードについて===
 
この際、証明書を使用する際のパスワードを尋ねられます。<br/>
 
この際、証明書を使用する際のパスワードを尋ねられます。<br/>
 
Gradleでビルドと同時に署名を行いたいのであれば、コミットしても問題無いような文字列をパスワードにすると良いでしょう。<br/>
 
Gradleでビルドと同時に署名を行いたいのであれば、コミットしても問題無いような文字列をパスワードにすると良いでしょう。<br/>
 
ただし、この場合は'''絶対に証明書をリポジトリにコミットしたりしてはいけません'''。<br/>
 
ただし、この場合は'''絶対に証明書をリポジトリにコミットしたりしてはいけません'''。<br/>
  
==入力項目について==
+
===入力項目について===
 
次に、いくつか入力項目が現れますので、順に追って説明します。
 
次に、いくつか入力項目が現れますので、順に追って説明します。
 
#姓名<br/>ニックネームとかツイッターアカウントの名前とかでかまいません。
 
#姓名<br/>ニックネームとかツイッターアカウントの名前とかでかまいません。
38行目: 35行目:
 
そうしないと最初からやり直しとなってしまいます。<br/>
 
そうしないと最初からやり直しとなってしまいます。<br/>
  
==2度目のパスワードについて==
+
===2度目のパスワードについて===
 
これはそのまま何も入力せずにEnterキーを押して次に進んだ方が混乱が無くて良いと思います。<br/>
 
これはそのまま何も入力せずにEnterキーを押して次に進んだ方が混乱が無くて良いと思います。<br/>
 
<br/>
 
<br/>
 
これで証明書は作成されました。<br/>
 
これで証明書は作成されました。<br/>
  
=フレンドリ名の確認と設定=
+
==フレンドリ名の確認と設定==
 
jarファイルへの署名には、証明書の他にフレンドリ名の設定が行われている必要があります。<br/>
 
jarファイルへの署名には、証明書の他にフレンドリ名の設定が行われている必要があります。<br/>
 
<code>keytool</code>で生成した証明書であれば、<code>-alias</code>で指定した名称がフレンドリ名としてファイルに記録されています。<br/>
 
<code>keytool</code>で生成した証明書であれば、<code>-alias</code>で指定した名称がフレンドリ名としてファイルに記録されています。<br/>
 
しかし、それ以外の方法で生成した場合はフレンドリ名の設定が行われていない場合があります。<br/>
 
しかし、それ以外の方法で生成した場合はフレンドリ名の設定が行われていない場合があります。<br/>
  
==フレンドリ名の確認==
+
===フレンドリ名の確認===
 
<pre>$ openssl pkcs12 -in 証明書ファイル.p12 -info -nokeys</pre>
 
<pre>$ openssl pkcs12 -in 証明書ファイル.p12 -info -nokeys</pre>
 
これを実行後パスワードを入力して、得られた出力の中に<code>Bag Attributes</code>があるはずです。<br/>
 
これを実行後パスワードを入力して、得られた出力の中に<code>Bag Attributes</code>があるはずです。<br/>
 
そのすぐ下に<code>friendlyName</code>の項目があれば、フレンドリ名が記録されているのでOKです。<br/>
 
そのすぐ下に<code>friendlyName</code>の項目があれば、フレンドリ名が記録されているのでOKです。<br/>
  
==フレンドリ名の設定==
+
===フレンドリ名の設定===
 
フレンドリ名が設定されていない場合は追加します。<br/>
 
フレンドリ名が設定されていない場合は追加します。<br/>
 
#バックアップ<pre>$ mv 証明書ファイル.p12 証明書ファイル.p12.bak</pre>
 
#バックアップ<pre>$ mv 証明書ファイル.p12 証明書ファイル.p12.bak</pre>
60行目: 57行目:
 
#後始末<pre>$ rm temp.txt</pre>
 
#後始末<pre>$ rm temp.txt</pre>
  
=フィンガープリントの確認=
+
==フィンガープリントの確認==
 
MinecraftのMODのJARファイルを署名付きで公開する場合、必要となってくるのがフィンガープリントの値です。<br/>
 
MinecraftのMODのJARファイルを署名付きで公開する場合、必要となってくるのがフィンガープリントの値です。<br/>
 
フィンガープリントとは、証明書をバイナリデータ(ASN-1形式)で表現したときにそのデータをハッシュ関数で処理した値のことです。<br/>
 
フィンガープリントとは、証明書をバイナリデータ(ASN-1形式)で表現したときにそのデータをハッシュ関数で処理した値のことです。<br/>
66行目: 63行目:
 
Minecraft ForgeではSHA-1ハッシュアルゴリズムでのフィンガープリントの値が要求されます。<br/>
 
Minecraft ForgeではSHA-1ハッシュアルゴリズムでのフィンガープリントの値が要求されます。<br/>
  
==OpenSSLを使用してフィンガープリントを取得==
+
===OpenSSLを使用してフィンガープリントを取得===
 
<pre>$ openssl pkcs12 -in 証明書ファイル.p12 -info -nokeys|openssl x509 -fingerprint -noout</pre>
 
<pre>$ openssl pkcs12 -in 証明書ファイル.p12 -info -nokeys|openssl x509 -fingerprint -noout</pre>
 
実行するとパスワードを入力後、フィンガープリントの値が「:」で区切られた16進数表記で出力されます。<br/>
 
実行するとパスワードを入力後、フィンガープリントの値が「:」で区切られた16進数表記で出力されます。<br/>
  
==フィンガープリントの値をMODで記述する文字列にする==
+
===フィンガープリントの値をMODで記述する文字列にする===
 
この表記から「:」を削ってつなげた後、大文字を小文字に書き直します。<br/>
 
この表記から「:」を削ってつなげた後、大文字を小文字に書き直します。<br/>
 
これがMOD内に記述するフィンガープリントの値となります。<br/>
 
これがMOD内に記述するフィンガープリントの値となります。<br/>
  
=MODのソースコードに記述する=
+
==MODのソースコードに記述する==
 
<code>@Mod</code>アノテーションに<code>certificateFingerprint</code>を書き加え、その後にフィンガープリントの値を文字列として記述します。<br/>
 
<code>@Mod</code>アノテーションに<code>certificateFingerprint</code>を書き加え、その後にフィンガープリントの値を文字列として記述します。<br/>
 
<pre>@Mod(modid = "hogemod",
 
<pre>@Mod(modid = "hogemod",
83行目: 80行目:
 
}</pre>
 
}</pre>
  
==DummyModContainerを継承したcoremodの場合==
+
===署名が一致しないときの処理===
<code>DummyModContainer</code>を継承する場合は<code>@Mod</code>アノテーションを使用できないため、継承クラス内で<code>getSigningCertificate()</code>メソッドをオーバーライドし、クラスの証明書(<code>Certificate</code>)を返します。<br/>
 
<pre>public class SampleCoreMod extends DummyModContainer {
 
 
 
private Certificate certificate;
 
 
 
public SampleCoreMod() {
 
super(new ModMetadata());
 
                /*---中略---*/
 
 
 
                // ClassからCertificatesを取得
 
Certificate[] certificates = getClass().getProtectionDomain().getCodeSource().getCertificates();
 
certificate = certificates != null ? certificates[0] : null;
 
}
 
 
 
@Override
 
@Nullable
 
public Certificate getSigningCertificate() {
 
// certificateを返す
 
return certificate;
 
}
 
}</pre>
 
 
 
==署名が一致しないときの処理==
 
 
必須ではありませんが、Forgeのイベントハンドラに署名が一致しなかった場合に呼ばれるものがあります。<br/>
 
必須ではありませんが、Forgeのイベントハンドラに署名が一致しなかった場合に呼ばれるものがあります。<br/>
 
<code>FMLPreInitializationEvent</code>や<code>FMLInitializationEvent</code>と同じように、<code>FMLFingerprintViolationEvent</code>の引数をもつメソッドを<code>@Mod.EventHandler</code>アノテーションを使い宣言します。
 
<code>FMLPreInitializationEvent</code>や<code>FMLInitializationEvent</code>と同じように、<code>FMLFingerprintViolationEvent</code>の引数をもつメソッドを<code>@Mod.EventHandler</code>アノテーションを使い宣言します。
115行目: 89行目:
 
}</pre>
 
}</pre>
  
=JARファイルに署名する=
+
==JARファイルに署名する==
 
署名処理を行いますが、これにはコマンドを実行するのとgradleで行わせるの二つの方法があります。<br/>
 
署名処理を行いますが、これにはコマンドを実行するのとgradleで行わせるの二つの方法があります。<br/>
  
==コマンドで署名する==
+
===コマンドで署名する===
 
<pre>$ jarsigner -sigalg SHA256withECDSA -digestalg SHA-256 -tsa http://timestamp.digicert.com -keystore 証明書ファイル.p12 署名したいjarファイル フレンドリ名</pre>
 
<pre>$ jarsigner -sigalg SHA256withECDSA -digestalg SHA-256 -tsa http://timestamp.digicert.com -keystore 証明書ファイル.p12 署名したいjarファイル フレンドリ名</pre>
 
<code>jarsigner</code>の引数の解説は[https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jarsigner.html jarsignerのオプション(英語)]または[https://qiita.com/_alice/items/546ab6449ef14571e46c Qiitaの記事]をご覧下さい。<br/>
 
<code>jarsigner</code>の引数の解説は[https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jarsigner.html jarsignerのオプション(英語)]または[https://qiita.com/_alice/items/546ab6449ef14571e46c Qiitaの記事]をご覧下さい。<br/>
 
上記のコマンドを実行すると、証明書のパスワードを尋ねられた後、jar内の各ファイルについてSHA-256ハッシュを計算して、それに証明書の鍵(ECDSA)で署名を行います。<br/>
 
上記のコマンドを実行すると、証明書のパスワードを尋ねられた後、jar内の各ファイルについてSHA-256ハッシュを計算して、それに証明書の鍵(ECDSA)で署名を行います。<br/>
  
==Gradleで署名する==
+
===Gradleで署名する===
 
<var>build.gradle</var>の最後に次のコードを追加します。<br/>
 
<var>build.gradle</var>の最後に次のコードを追加します。<br/>
 
<code>ant.signjar</code>に渡す各引数は前項の<code>jarsigner</code>と同じです。<br/>
 
<code>ant.signjar</code>に渡す各引数は前項の<code>jarsigner</code>と同じです。<br/>
142行目: 116行目:
 
この<var>build.gradle</var>を使いビルドを実行すると署名済みJARファイルが生成されます。<br/>
 
この<var>build.gradle</var>を使いビルドを実行すると署名済みJARファイルが生成されます。<br/>
  
=動作確認=
+
==動作確認==
 
生成された署名済みjarファイルを<var>mods</var>フォルダーに配置して、ForgeがインストールされたMinecraftを起動します。<br/>
 
生成された署名済みjarファイルを<var>mods</var>フォルダーに配置して、ForgeがインストールされたMinecraftを起動します。<br/>
 
タイトル画面に進んだら、<var>options.txt</var>と同じ階層にある<var>logs\debug.log</var>を開きます。<br/>
 
タイトル画面に進んだら、<var>options.txt</var>と同じ階層にある<var>logs\debug.log</var>を開きます。<br/>

Minecraft Modding Wikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMinecraft Modding Wiki:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)