Magnolia Tech

いつもコードのことばかり考えている人のために。

`sbt new`が`invalid privatekey`というエラーになって実行できない

タイトルそのままなのだけど、sbt newというテンプレートからsbtのプロジェクトディレクトリを作るコマンドがinvalid privatekeyを出して実行できなくなっていた。

$ sbt new scala/scala3.g8
...
ssh://git@github.com/scala/scala3.g8.git: invalid privatekey: xxxxxx

(xxxxxxの箇所には、sshのキーらしきものが表示されている)

sbt newを実行する機会は意外と少なくて、せいぜい何かのライブラリのサンプルコードを動かす時くらいなので、最近環境をアップグレードするまで気づかなかった。

issueは簡単に見つかった。

No support for open ssh keys? · Issue #5589 · sbt/sbt · GitHub

JSch / Bugs / #129 "JSchException: invalid privatekey" on OpenSSH 7.8 and above

原因は、openSSHが生成するキーの形式がOpenSSH 7.8から変更になっているそう。

dev.classmethod.jp

sbtは、sbt newをgiter8経由で実行するが、このgiter8が、jschに依存している giter8/Dependencies.scala at develop · foundweekends/giter8 · GitHub

  val jgitJsch             = "org.eclipse.jgit" % "org.eclipse.jgit.ssh.jsch" % "5.13.1.202206130422-r"
  val jsch                 = "com.jcraft" % "jsch.agentproxy.jsch" % "0.0.9"
  val jschSshAgent         = "com.jcraft" % "jsch.agentproxy.sshagent" % "0.0.9"
  val jschConnectorFactory = "com.jcraft" % "jsch.agentproxy.connector-factory" % "0.0.9"

jschは2018年以来、リリースが止まっているので、上記の変更が取り込めていない模様。

http://www.jcraft.com/jsch/ChangeLog

一応forkも有って、そちらは活発にリリースが続いている模様。

github.com

JGit自体も、Apache MINAをサポートしたアドオンをリリースしているので、Giter8がこちらに載せ替えれば良さそうな気がする。

https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit.ssh.apache


というわけで、sshのキー形式をOpenSSH形式からPEM形式に変えてもいいのだけど、めったに実行しないsbt newのためにそんな変更を入れるのも嫌なので、sbtのプロジェクトは既存のものを参考に手作成しました。