EnderAlice

JARの署名手順

Jun 3rd, 2018
168
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. **********************
  2. Qiitaに投稿したのでそちらをご覧下さい。
  3. https://qiita.com/_alice/items/546ab6449ef14571e46c
  4. ここにある情報は修正前なので注意して下さい。
  5. **********************
  6.  
  7. ①環境変数を設定する
  8. JDK向けに変数を設定済みの場合は飛ばして下さい
  9.  
  10. >set JAVA_HOME=(JDKのインストールパスにあるbinフォルダーの場所)
  11. >set PATH=%PATH%;%JAVA_HOME%\bin
  12.  
  13. ②証明書を作成する
  14. 認証局からコードサイニング証明書を発行している、あるいはOpenSSL等で作成したPKCS12形式のファイルがある場合は飛ばして下さい
  15.  
  16. >keytool -genkeypair -keystore <作成する証明書のファイル名> -alias <名前> -keyalg ec -keysize 384 -validity 3650
  17.  
  18. aliasの名前は、Windowsの証明書のプロパティではフレンドリ名として表示されます。
  19.  
  20. keyalgとkeysizeは、ここでは楕円曲線暗号の384bitを指定していますが、Javaが対応していれば何でもかまいません。
  21. https://docs.oracle.com/javase/jp/9/docs/specs/security/standard-names.html
  22. ここのKeyPairGeneratorアルゴリズムの項目にあるものが使用できます。
  23.  
  24. validityは作成日からの有効期限で、ここでは10年(3650日)としています。
  25.  
  26. コマンドを実行すると、ここで作成する証明書を使用するときのパスワードを尋ねられます。
  27. 入力しても画面には表示されないので注意して下さい。
  28. パスワードの入力が終わると、次の順で項目を尋ねられます。
  29. ①姓名
  30.  ニックネームでもかまいません
  31. ②組織単位名
  32.  部門の名前ですが、部活動のクラブ名とかそのへんです
  33. ③組織名
  34.  個人の場合はとりあえずウェブサイトの名前でもいいでしょう
  35. ④都市名or地域名
  36.  住所を知られたくないならとりあえず何でも
  37. ⑤都道府県名
  38.  ④に同じく
  39. ⑥国
  40.  日本ならJPになります
  41. ここまで入力が終わると、最後に[いいえ]と訊かれますが、「y」とだけ入力して下さい。
  42. これで証明書が作成されました。
  43.  
  44. 作成した証明書をPKCS12形式にしたい場合は、次のコマンドを実行して下さい。
  45. >keytool -importkeystore -srckeystore <証明書のファイル名> -destkeystore <証明書のファイル名.p12> -deststoretype pkcs12
  46. この形式にした場合、Windowsで証明書を登録できるようになります。
  47.  
  48. ③JARファイルに署名する
  49.  
  50. 以前に作成したことがある等で、フィンガープリントの値が既に判っている場合は、③の前に次の⑤を実行してください。
  51.  
  52. >jarsigner -sigalg SHA256withECDSA -digestalg SHA256 -tsa http://timestamp.digicert.com -keystore <証明書のファイル名> <JARファイル名> <aliasの名前>
  53.  
  54. sigalgとdigestalgは、ここでは楕円曲線DSAとSHA256を指定していますが、Javaが対応していれば何でもかまいません。
  55. https://docs.oracle.com/javase/jp/9/docs/specs/security/standard-names.html
  56. sigalgはここのSignatureアルゴリズム、digestalgはここのMessageDigestアルゴリズムから選択できます。
  57.  
  58. tsaはタイムスタンプサーバーのURLです。無くても署名は出来ますが、証明書の有効期限が切れると署名が無効になってしまいます。
  59.  
  60. 証明書のファイル名は、keytoolで作成した物か、認証局またはOpenSSH等で作成したPKCS12形式の証明書を指定します。
  61.  
  62. パスワードを尋ねられますので、正しいパスワードを指定すれば署名が完了します。
  63.  
  64. ④フィンガープリントの値を調べる
  65. 検証自体はJava側で行われますが、MOD側でForgeのイベントを定義することで検証結果を受け取ることが出来ます。
  66. その際、必要となってくるのがフィンガープリントの値です。
  67.  
  68. フィンガープリントの値は、証明書をバイナリデータ(ASN-1)で表現したときのハッシュです。
  69. フィンガープリントの値は、ForgeではSHA-1ハッシュを使います。
  70. 同じ証明書はフィンガープリントも同じですので、一度フィンガープリントの値を調べた後は、証明書を作り直さない限り有効です。
  71.  
  72. ③で署名したJARファイルからフィンガープリントの値を確認できます。
  73.  
  74. >keytool -printcert -jarfile <JARファイル名>
  75.  
  76. これを実行すると長々と出力されますが、必要なのは最初の方にある署名です。
  77. 所有者と発行者が、②で入力した情報と同じであれば、そのすぐ下にあるフィンガープリントがそれです。
  78.  
  79. ForgeではSHA-1形式のフィンガープリントが必要なので、SHA1の後の16進表記を取っておいて下さい。
  80.  
  81. この16進表記は2桁ずつ「:」で区切られていますが、不要なので全て削ってつなげて下さい。
  82. 次に、大文字は小文字に書き換えて下さい。
  83.  
  84. これでMOD側に記述するフィンガープリントの値が出来ました。
  85.  
  86. ⑤MOD側で検証する
  87. ④で調べたフィンガープリントの値を@ModアノテーションのcertificateFingerprintに文字列として記述します。
  88.  
  89. @Mod(certificateFingerprint="フィンガープリントの値")
  90.  
  91. 次に、フィンガープリントの値が一致しなかった場合に警告を出すようにしたい場合は、FMLFingerprintViolationEventを記述する必要があります。
  92. このイベントはFMLPreInitializationEventやFMLInitializationEventと同じように@Mod.EventHandlerアノテーションを使い宣言します。
  93.  
  94. @Mod.EventHandler
  95. public void badSignature(FMLFingerprintViolationEvent event)
  96. {
  97. System.err.println("署名が一致しません!オリジナルの配布ファイルではありません!");
  98. }
  99.  
  100. ⑥動作確認
  101. debug.logに次の表記があるかどうか確認します。
  102.  
  103. [??:??:??] [main/DEBUG] [FML]: Found signing certificates for coremod <Mod名> (クラス名)
  104. [??:??:??] [main/DEBUG] [FML]: Found certificate <フィンガープリントの値>
  105.  
  106. さらに下の方に、Valid Signaturesの方にMOD名が出てくれば成功です。
  107. Mod signature data
  108. [??:??:??] [main/DEBUG] [FML]: Mod signature data
  109. [??:??:??] [main/DEBUG] [FML]: Valid Signatures:
  110. [??:??:??] [main/DEBUG] [FML]: (フィンガープリントの値) <Mod名> (Mod表示名) <JARファイル名>
  111.  
  112. Missing Signaturesの方に出てきた場合は署名に失敗しています。
  113.  
  114. [??:??:??] [main/DEBUG] [FML]: Missing Signatures:
  115. [??:??:??] [main/DEBUG] [FML]: <Mod名> (Mod表示名) <JARファイル名>
  116.  
  117. ⑦おわり
  118. お疲れ様でした。
RAW Paste Data