いしぐめも

プログラミングとかしたことを書きます。

JDKアップデートしたらsecureValidationでテストがコケたので暫定対処をしました

JDK17へ移行しようとテストコードを流していたらRSA-SHA1を使用している部分で以下のエラー。

It is forbidden to use algorithm http://www.w3.org/2000/09/xmldsig#rsa-sha1 when secure validation is enabled

どうもsecureValidationが有効な状態だと、特定のアルゴリズムの仕様が許可されないセキュリティエンハンスのせいらしい。

以下は、Sean Mullan氏の記事。

JDK 17 Security Enhancements

--

本来であれば、正しいアルゴリズムを採用するようにコード側を変更すべきですが、いかんせん影響範囲が大きい部分だったりするといったんはこのアルゴリズムを許可してテストを通るようにして、アルゴリズム変更はまた別で行うべきかなと考え、暫定で許可することとしました。

以下は許可の方法です。

secureValidationで禁止するアルゴリズムを変更する

securyValidationの際に禁止されるアルゴリズムは、java.security に列挙されています。

Eclipse-Terumin JDK17 のコンテナイメージでは、以下の場所にありました。

/opt/java/openjdk/conf/security/java.security

これを覗くと確かに jdk.xml.dsig.secureValidationPolicy というポリシーがあり、それを見るとSHA-1とかもあります。

直接編集してしまってもいいんですが、さすがにシステム全体のポリシーを変えてしまうのもアレなので、テストを流したり実行したりする場合にのみこの変更を適用するようにします。

まずは適当な場所に java.security ファイルを作成します。(今回、自分の場合はプロジェクト直下においてしまいました)

そして、テスト実行する際に以下のオプションを指定するようにします。VSCodeでテストする際のvmArgsに書いたり、pom.xmlsurefireのargsに書いたりしてみました。

-Djava.security.properties=./java.security

java.securityを作成した位置に応じて適宜読み替えてください。そして、java.sourceの内容をもともとのjava.sourceからコピペし、必要なアルゴリズムをリストから削除して以下のようにしました。

jdk.xml.dsig.secureValidationPolicy=\
    disallowAlg http://www.w3.org/TR/1999/REC-xslt-19991116,\
    disallowAlg http://www.w3.org/2001/04/xmldsig-more#rsa-md5,\
    disallowAlg http://www.w3.org/2001/04/xmldsig-more#hmac-md5,\
    disallowAlg http://www.w3.org/2001/04/xmldsig-more#md5,\
    disallowAlg http://www.w3.org/2007/05/xmldsig-more#sha1-rsa-MGF1,\
    disallowAlg http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha1,\
    maxTransforms 5,\
    maxReferences 30,\
    disallowReferenceUriSchemes file http https,\
    minKeySize RSA 1024,\
    minKeySize DSA 1024,\
    minKeySize EC 224,\
    noDuplicateIds,\
    noRetrievalMethodLoops

削除したのは以下の3行です。

disallowAlg http://www.w3.org/2000/09/xmldsig#sha1,\
disallowAlg http://www.w3.org/2000/09/xmldsig#dsa-sha1,\
disallowAlg http://www.w3.org/2000/09/xmldsig#rsa-sha1,\

(ここは必要なアルゴリズムに応じて読み換えてください。)

動作確認

ここまでできたら、テストを流してみます。流れればOK。

おわりに

unmarshalXMLSignature 実行する系テストの以上系でエラーが出て、JDKのバージョンアップで javax.xml.crypto.dsig.XMLSignatureException の内容が変わってしまったのか~~~?!なんて思ってたらもっと根深いところに原因があったみたいです。

どなたかのご参考になれば幸いです。