One IT Thing

IT業界を楽しむ為の学習系雑記

プチハマリ解決日記

java.security.InvalidKeyException: IOException : DerInputStream.getLength(): lengthTag=111, too big.

投稿日:2019年6月22日 更新日:

事象

OpenSSLで作成した秘密鍵をJava(Eclipse + Maven環境)で読み込み、公開鍵で暗号化されたデータを復号しようとした際に記事名の例外が発生しました。

秘密鍵ファイルは以下のように作成しています。

// 秘密鍵作成
$ openssl genrsa -out rsa_2048_priv.pem 2048

// 秘密鍵をPEMからPKCS#8のDERフォーマットに変換
$ openssl pkcs8 -in rsa_2048_priv.pem -topk8 -nocrypt -outform DER -out rsa_2048_priv.der

クラスパス直下(Maven的にはsrc/main/resources)に秘密鍵ファイル(rsa_2048_priv.der)を置いておき、ClassLoader.getResourceAsStream()で読み込んでPrivateKeyインスタンスを作ります。

    // 鍵ファイル内容のバイト配列を作成
    InputStream in = 
        this.getClass().getClassLoader().getResourceAsStream("rsa_2048_priv.der");
    byte[] buff = new byte[in.available()];
    in.read(buff);

    // 秘密鍵インスタンス生成
    KeySpec keyspec = new PKCS8EncodedKeySpec(buff);  <-- 以下のエラーが発生する

    KeyFactory keyfactory = KeyFactory.getInstance( "RSA");
    Key privateKey = keyfactory.generatePrivate(keyspec);
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
    cipher.init(Cipher.DECRYPT_MODE, privateKey);

すると例外が発生。

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : DerInputStream.getLength(): lengthTag=111, too big.
    at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:217)
    at java.security.KeyFactory.generatePrivate(KeyFactory.java:372)

    (snip)

原因

原因究明の為、試しにsrc/main/resourcesに置いた鍵ファイルを実行ディレクトリ直下に置いてクラスパスではなくファイルパスで読み込むとエラー無く成功します。

原因は環境別ビルドの為に行っているMavenのリソースフィルタリングの際、resources配下の全ファイルにUTF-8変換が走る設定をしていた為でした。

src/main/resources内のファイルをclassesにコピーする際、propertiesはUTF-8にして貰っていいですが、バイナリまで対象になっていて結果鍵ファイルが壊れ、KeySpecクラスインスタンスの生成に失敗していました。

対処

pom.xmlでバイナリファイルはリソースフィルタリングの対象から外し、単純にclassesにコピーだけして貰います。

Maven Resources Pluginのドキュメントに方法が載っています。

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <!-- .derファイルはフィルタリングしない設定を追加 -->
                    <nonFilteredFileExtensions>
                        <nonFilteredFileExtension>der</nonFilteredFileExtension>
                    </nonFilteredFileExtensions>
                </configuration>
            </plugin>

これでUTF-8変換が走らず、OpenSSLで作られたままのバイナリファイルとしてclassesにコピーされ、インスタンス化に成功しました。

得た教訓

Mavenリソースフィルタリングしている場合、/src/main/resourcesにバイナリを置く時は要注意。

-プチハマリ解決日記
-,

執筆者:

関連記事

Metabaseの登録データベース削除時に入力を求められて消せない

分析対象として登録したデータベースを一覧から削除する際に入力値を求められ、何を入れていいか分からずプチはまりました。 結論から述べると入力する文字は「delete」でした。 事象 Metabase(v …

ローカルネットワーク内のHTTP通信が2回に1回交互にタイムアウトするようになった原因

目次1 事象2 調査3 解決4 その後 事象 ある日突然、オフィスのローカル開発環境でHTTP通信が異常なほど遅くなり、タイムアウトするようになりました。 その後F5でリロードすると普通にレスポンスが …

git push時に「error: RPC failed; result=22, HTTP code = 501」エラー

目次1 事象2 原因3 対処4 まとめ 事象 オンプレGitLabへのgit push時に掲題のエラーが発生してpushに失敗します。 原因 git push時の1ファイル最大サイズは1Mbyteの為 …

Typescript3.0以下の環境で発生する「Cannot find name ‘unknown’」に対処する

目次1 事象2 原因3 対処4 まとめ 事象 Typescript2.3.4を使っている息の長いWebシステムでnpm installをし直し、tscビルドし直したらトランスパイルエラーが発生。「un …

nvm-windows1.1.6でNode.jsを入れようとするとnpmコマンドのインストールがエラーになる

目次1 事象2 原因3 対処4 まとめ 事象 Win10、nvm-windows 1.1.6環境下でNode.js 10.16.0を入れようとした際に以下のエラーが発生。 C:\src\js\angu …


shingo nakanishi。東京で消耗中の職歴20年越え中年ITエンジニアです。「生涯現役プログラマを楽しむ」ことができる働き方探しをライフワークにしています。

19歳(1996年)から書き始めた個人日記が5,000日を超え、残りの人生は発信をして行きたいと思い、令和元日からこのサイトを開始しました。勉強と試行錯誤をしながら、自分が経験したIT関連情報を投稿しています。