CentOS Server セットアップ備忘録 (6) - なぜか Tomcat の JVM が OpenJDK に変わってしまったので治す

今日 Tomcat を再起動して、ふと気がつくと、ウェブアプリが GmailSMTP にアクセスできず例外メッセージを吐いている。


致命的: Can't send command to SMTP host
javax.mail.MessagingException: Can't send command to SMTP host;
nested exception is:
javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1564)
at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1551)
at com.sun.mail.smtp.SMTPTransport.ehlo(SMTPTransport.java:935)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:426)
at javax.mail.Service.connect(Service.java:288)
at javax.mail.Service.connect(Service.java:169)
at javax.mail.Service.connect(Service.java:189)
at com.ballpark_jp.GMailSender$Sender.run(GMailSender.java:198)
at java.lang.Thread.run(Thread.java:636)
Caused by: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1611)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1574)
at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1557)
at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1483)
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:83)
at com.sun.mail.util.TraceOutputStream.write(TraceOutputStream.java:114)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1562)
... 8 more
Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at sun.security.validator.PKIXValidator.(PKIXValidator.java:75)
at sun.security.validator.Validator.getInstance(Validator.java:178)
at sun.security.ssl.X509TrustManagerImpl.getValidator(X509TrustManagerImpl.java:129)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:225)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:270)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:973)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:142)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:533)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:471)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:904)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1116)
at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:643)
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:78)
... 12 more
Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:200)
at java.security.cert.PKIXParameters.(PKIXParameters.java:120)
at java.security.cert.PKIXBuilderParameters.(PKIXBuilderParameters.java:104)
at sun.security.validator.PKIXValidator.(PKIXValidator.java:73)
... 24 more

え〜? 嘘〜ん。。。昨日までちゃんと動いていたトコなのにぃ。。。

仕方なく、情報を求めて散々ネットを徘徊したところ、どうもこれ(↓)と似た症状っぽい。
http://forums.sun.com/thread.jspa?threadID=580496&tstart=120
紹介されてる解決法に習って /etc/tomcat5/tomcat5.conf に(↓)を追記してみる。


JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.trustStore=$JAVA_HOME/jre/lib/security/cacerts -Djavax.net.ssl.trustStorePassword=changeit"
が、解決しない。うげぇ。

その後、なんやかやと(ほとんど1日中)あれこれ試したのち、ふと実行環境内で System.getProperty("java.home") をデバッグ出力して、よーく見てみると・・・
げげっ! OpenJDK のディレクトリになってるやん! なんっでやねん!

とにかくコレが原因であろう事は間違いないので、tomcat5.conf を修正。


#JAVA_HOME="/usr/lib/jvm/java" ← 元の記述をコメントアウト
JAVA_HOME="/usr/java/jdk1.6.0_06/" ← Sun JDK のパスを直打ち

結果は・・・正解。 やっと元通り動くようになった。。。(ぐったり。)
ちなみに、上で追記した -Djavax.net.ssl.trustStore は、元通り消すとまたエラーが出てしまうので、これも必要になっちゃった様子。なんでだ?

ともかく、トリガーが不明ですが TomcatJVM が Sun JDK から勝手に OpenJDK に切り変わって、いつぞやと同じ状態に後退していた、と。

まったく、なんだかなぁ。。。