【Java】Java1.6/SolarisのSSL通信バグ対応
SOAPで接続していた連携先のシステムに、ある日突然つながらなくなった。
SOAP連携の処理で接続しようとすると以下のようなJavaのStackTraceが出てくる。
…
Caused by: java.lang.RuntimeException: Could not parse key values
at sun.security.pkcs11.P11Key$P11ECPublicKey.fetchValues(P11Key.java:1000)
at sun.security.pkcs11.P11Key$P11ECPublicKey.getW(P11Key.java:1021)
at com.sun.net.ssl.internal.ssl.ECDHClientKeyExchange.<init>(ECDHClientKeyExchange.java:40)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:779)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:238)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:958)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1203)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1230)
... 89 more
Caused by: java.io.IOException: extra data given to DerValue constructor
at sun.security.util.DerValue.init(DerValue.java:368)
at sun.security.util.DerValue.<init>(DerValue.java:277)
at sun.security.pkcs11.P11Key$P11ECPublicKey.fetchValues(P11Key.java:991)
... 98 more
…
Java1.6/OS:Solaris。
ただ、なぜかJava1.6/OS:Windowsだと問題なく動く。(JavaのVerは同じでOSだけ違う)
Java1.6だと、TLSは1.1までしか対応していないので、
「接続先システムがある時期から突然TLS1.2しか許可しなくなったんじゃねーの?」とかいう疑惑が生まれたが、
接続先システムに確認した感じではどうやらそうではなかった。
(まあ「いくらなんでも何の通告もなくいきなり”TLS1.2のみ許可”なんてしねーよな普通」とは内心思っていた…)
ちなみに同じ状況下において、Java1.7/OS:Solarisだとうまくいく。
最悪、SOAP連携部分だけ別VerのJavaコマンド実行するように外だしするか…?とか思っていたが、
ちょっとググったら以下の記事が見つかった(英文)
https://bugs.openjdk.java.net/browse/JDK-8031441&prev=search
翻訳してみたらなんとなくわかったが、
要するにJavaの実行時オプションに以下のパラメータを付けろということらしい。
java -Dcom.sun.net.ssl.enableECC=false ・・・
実際、つけたらJava1.6/OS:Solarisでも動いた。
なんかよく見たらこれSolaris11のバグらしいな。
それまで同環境下でも問題なく接続できたものが
接続元環境を何も変更してないのにも関わらずなぜ突然発症したのかは謎であるが、
接続先システムの些細な変更に影響してこうなってしまうのかもしれない。
(実際、今回のケースでは、接続先システムで何らかの変更を加えた、ということまでは聞いてはいた)