Slide 1

Slide 1 text

Copyright © Yoshikazu Nojima 2024 Maven パッケージの署名検証 ~ライブラリの署名、検証してますか?~ 2024-12-04 CNSJ LT祭り 能島 良和 (@shiroica)

Slide 2

Slide 2 text

Copyright © Yoshikazu Nojima 2024 自己紹介 • 能島良和 • WebAuthn4Jというライブラリの開発者 https://github.com/webauthn4j/webauthn4j パスキー認証のサーバー側の実装のJava製ライブラリ Keycloak、Spring Security、Vert.x Auth等で使用されています • Twitter:@shiroica • GitHub:ynojima 1

Slide 3

Slide 3 text

Copyright © Yoshikazu Nojima 2024 Maven Centralでライブラリ公開時のルール 2 https://central.sonatype.org/publish/requirements /#provide-files-checksums ルール:各ファイルにPGPによる電子署名を付与すること

Slide 4

Slide 4 text

Copyright © Yoshikazu Nojima 2024 Maven Centralレポジトリで公開される署名ファイル 3 Maven Centralレポジトリでは、各ファイルにPGP署名を付与し(拡張子:.asc)、 元ファイルと同一ディレクトリで公開するルール 実は署名検証したことないけどどうやれば良いんだろう??

Slide 5

Slide 5 text

Copyright © Yoshikazu Nojima 2024 検証者 署名者 電子署名による改竄からの保護 4 鍵ペア 秘密鍵 公開鍵 署名処理 検証処理 電子署名 元ファイル 検証結果 公開鍵 元ファイル 電子署名

Slide 6

Slide 6 text

Copyright © Yoshikazu Nojima 2024 検証者 署名者 鍵ペア Mavenライブラリの場合 5 秘密鍵 公開鍵 署名処理 検証処理 .jar.asc .jar 検証結果 公開鍵 .jar .jar.asc キーサーバー Maven Central レポジトリ

Slide 7

Slide 7 text

Copyright © Yoshikazu Nojima 2024 署名準備:鍵ペアの作成、登録 ■ GnuPGでのキーペアの生成(持っていない場合のみ) 6 # キーペアの生成 $ gpg --gen-key # 対話式で名前やメールアドレスを入力 # キーIDの確認 $ gpg --list-keys # キーサーバーに公開鍵を登録 $ gpg --keyserver keys.openpgp.org --send-keys

Slide 8

Slide 8 text

Copyright © Yoshikazu Nojima 2024 署名方法 ■ GnuPGでの署名コマンド ■ Mavenでの署名設定 7 # ファイルへの署名 gpg –ab <.jarファイル名> org.apache.maven.plugins maven-gpg-plugin 1.5 sign-artifacts verify sign

Slide 9

Slide 9 text

Copyright © Yoshikazu Nojima 2024 検証方法(GnuPG) 実行例: 8 $ gpg --verify webauthn4j-core-0.28.3-SNAPSHOT.jar.asc webauthn4j-core-0.28.3- SNAPSHOT.jar gpg: Signature made Wed Nov 27 21:34:43 2024 JST gpg: using EDDSA key B7E7C33CBCE33568168C31A435FB1F5681B8990F gpg: Good signature from "Yoshikazu Nojima " [ultimate] $ gpg --verify <署名ファイル> <署名対象ファイル>

Slide 10

Slide 10 text

Copyright © Yoshikazu Nojima 2024 検証方法(Maven simplify4u Verify PGP signatures plugin) ■ pom.xmlへの追加 ■keysmap.list 信頼する公開鍵のFingerprintを対象のgroupやartifactを指定しkeysmapファイルに列挙 9 org.simplify4u.plugins pgpverify-maven-plugin 1.18.2 https://keyserver.ubuntu.com ${project.basedir}/keysmap.list check com.webauthn4j = 0xD6419D202DFA86A9210F5F04A6D79C503F80535D

Slide 11

Slide 11 text

Copyright © Yoshikazu Nojima 2024 検証方法(Maven simplify4u Verify PGP signatures plugin) ■ 実行結果 10 [INFO] --- pgpverify:1.18.2:check (default-cli) @ quarkus-security-passkeys-poc --- [INFO] Key server(s) - {https://keys.openpgp.org} [INFO] Resolved 410 artifact(s) in PT0.2980288S [INFO] Resolved 410 signature(s) in PT0.4914689S (略) [INFO] com.webauthn4j:webauthn4j-core:jar:0.28.2.RELEASE PGP Signature OK KeyId: 0xD6419D202DFA86A9210F5F04A6D79C503F80535D UserIds: [WebAuthn4J Project ] (略) [INFO] Finished 410 artifact(s) validation in PT2.9281044S [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 6.674 s [INFO] Finished at: 2024-12-03T09:05:09+09:00 [INFO] ------------------------------------------------------------------------

Slide 12

Slide 12 text

Copyright © Yoshikazu Nojima 2024 Javaライブラリの署名検証を実施して気づいた点 • Maven Centralレポジトリ、署名必須の筈が署名されていないライブラリも存在 • Gradle Plugin Portalレポジトリ、署名されてないPlugin多数 • ちょっとしたデモアプリでもQuarkus/Springといったフレームワークを使うと 信頼しなければならない公開鍵多数。推移的依存関係多数の為 11

Slide 13

Slide 13 text

Copyright © Yoshikazu Nojima 2024 追補:Maven Centralのsigstore対応について • コンテナや、ソースコードの署名においては、sigstoreを使ったキーレス署名が最近の流行 • sigstore-java 1.0が2024年8月にリリースされ、 mavenでもsigstoreでキーレス署名したパッケージがMaven Centralで公開できるように 12

Slide 14

Slide 14 text

Copyright © Yoshikazu Nojima 2024 まとめ • Mavenライブラリの署名は単なるPGP署名 • Maven Centralレポジトリ上のライブラリは基本的に署名されている • 署名されていない一部例外もある • 信頼する相手の公開鍵で、対象ファイルと署名ファイルを検証すれば ライブラリの改竄を検知可能 • Maven等のビルドツールのプラグインを使えば、プロジェクトの依存関係のライブ ラリもビルド時に一括検証可能 • Sigstoreによるキーレス署名も最近Maven Centralで利用可能に 13