java.security.InvalidKeyException: Not an EC key: ECDH

2017/09/29   #java 
このエントリーをはてなブックマークに追加

原因

fat JAR で起動するタイプのアプリで、fat JAR 内に暗号化ライブラリが含まれる形だと発生する

sun jdk support · Issue #5 · web-push-libs/webpush-java

BouncyCastle JAR は署名されているが、fat JAR に入るときに署名を壊して抽出されて fat JAR に入れられるため、らしい。

対応方法

  • 暗号化ライブラリを $JAVA_HOME/jre/lib/ext に入れて fat JAR を起動する
    • dependencies から除外する必要があるかは未検証
    • web-push-libs/webpush-java: Web Push library for Java
      • “This library depends on BouncyCastle, which acts as a Java Cryptography Extension (JCE) provider. BouncyCastle’s JARs are signed, and depending on how you package your application, you may need to include BouncyCastle yourself as well.”
      • “このライブラリはJava暗号化拡張(JCE)プロバイダとして機能するBouncyCastleに依存します。 BouncyCastleのJARが署名されています。アプリケーションのパッケージ方法によっては、BouncyCastleも一緒に組み込む必要があります。”
    • https://stackoverflow.com/a/17400821
      • $JAVA_HOME/jre/lib/security/java.security で優先順位っぽいものも更新する?

要は、fat JAR 外に jar を配置して、クラスパスに含ませて、アプリケーションを実行する形になればよさげ。

課題

  • 開発環境構築に特別な手順をふませたくない
    • dependencies は provided にしておく
      • コンパイル通る
    • sbt の lib に jar をいれておく
      • 普通に起動した場合はクラスパスに含まれるので問題なし
    • fat JAR 作成では lib 内の jar は含まれない、ハズ
      • ざっと確認したところ含まれなかった、skinny の package:standalone の場合
    • fat JAR 起動の場合は、起動前に lib 内の jar を $JAVA_HOME/jre/lib/ext にコピーしてから起動させる

上記の感じでうまくいったっぽい。