Oracle JRE/JDK が Let’s Encrypt に対応してない件

Let's Encrypt が Beta 期間を無事終了し正式公開となったようですが、Oracle の JRE/JDK が Trusted root CA として Let's Encrypt で使われているものを含んでいません。

先週 LINE の BOT API が公開されて多くの方がこぞって試されていたようですが Let's Encrypt の証明書を使った場合には Callback へのアクセスがないと報告されています。私も試しましたが、ダメでした。

これもおそらく Oracle の Java が Let's Encrypt で使われている DST Root CA X3ISRG Root X1 も含んでいないからではないかと勝手に推測してます。

Community にもいくつか thread が立ってます
Will the cross root cover trust by the default list in the JDK/JRE?

私は Java のコードを書けませんが、簡単なテストコードが公開されていたのでこれを試してみました。
http://alvinalexander.com/blog/post/java/simple-https-example

$ mkdir foo
$ vi foo/JavaHttpsExample.java
$ javac foo/JavaHttpsExample.java
$ java foo/JavaHttpsExample

Oracle の JRE/JDK では次のようなエラーとなります。

Exception in thread "main" javax.net.ssl.SSLHandshakeException:
sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to
find valid certification path to requested target

OpenJDK ではアクセスできました。

$ java -version
openjdk version "1.8.0_77"
OpenJDK Runtime Environment (build 1.8.0_77-b03)
OpenJDK 64-Bit Server VM (build 25.77-b03, mixed mode)

クライアント側が keystore に登録すればアクセスできるわけですが、Let's Encrypt を使おうとされているサーバーに Java のクライアントがいる場合は要注意です。

LINE Bot でもうちょい遊びたいから RapidSSL 更新しなきゃ。

Tomcat のアクセスログを LTSV で出力する

Tomcat はたしか 7 から AccessLog Valve がデフォルトで有効になっていますがそのフォーマットは Apache httpd の common に近いものです。これを今時の LTSV にする方法をメモ。

これがデフォルト設定

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

pattern を書き換えれば良いわけですが、server.xml は XML なので TAB は &#9; とします。普通に TAB のコードを入れてもスペースになってしまいますし、\t も使えません。Apache や nginx の用に改行を入れて見やすくすることもできなっぽい。

pattern="host:%h&#9;time:%{yyyy-MM-dd hh:mm:ss}t&#9;ident:%l&#9;user:%u&#9;method:%m&#9;uri:%U%q&#9;protocol:%H&#9;status:%s&#9;size:%B&#9;referer:%{referer}i&#9;ua:%{user-agent}i&#9;msec:%D&#9;thread:%I"

で次のように出力されます

host:127.0.0.1	time:2016-03-08 11:57:33	ident:-	user:-	method:GET	uri:/favicon.ico	protocol:HTTP/1.1	status:200	size:21630	referer:http://localhost:8080/	ua:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36	msec:3	thread:http-bio-8080-exec-9

TAB を改行にして見やすくするとこんな内容

host:127.0.0.1
time:2016-03-08 11:57:33
ident:-
user:-
method:GET
uri:/favicon.ico
protocol:HTTP/1.1
status:200
size:21630
referer:http://localhost:8080/
ua:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36
msec:3
thread:http-bio-8080-exec-9

リクエスト時刻は %{xxx}t で指定します。xxx 部分は SimpleDateFormat になります。time:%{yyyy-MM-dd'T'HH:mm:ss.SSSZ}t と指定すれば time:2016-03-09T00:13:25.991+0900 のように出力されます。

http://tomcat.apache.org/tomcat-7.0-doc/config/valve.html#Access_Log_Valve

Ubuntu への Java のインストール方法はこちらを参照
How To Manually Install Oracle Java on a Debian or Ubuntu VPS

Java がんばれ

GC まわりのチューニングが難しいということで JVM Operation Casual Talks などでも運用担当者からの評判がよろしくない Java ですが、遠い昔のように遅くない、むしろ速い実行環境ですよね。 Java のコードが書ける運用担当は数が少ない(私もまったく書けない)というのも理由かなとは思いますが、最近のトレンドである構成管理とかイミュータブル、Blue Green Deployment などの面では Java ってとても良いと思うのですよね。

war にしてしまえば、単にそれを置き換えれば deploy できるし、サーバーまで組み込んであれば jar を直接実行するだけかもしれません。JDK も入れ替えて再起動するだけだし、はぁ、Java ってこういうところ楽だわぁと複雑な構成のくそめんどくさい Ansible Playbook を書いた後に思ったのでした。

Java 8 でさらに便利になったみたいだし Java がんばれ!!

でも Applet はイカンですよ。PRIMERGY の管理ツール何とかしてください F 社さん。

あ、あとコマンドラインツールが Java ってのもいただけない。昔々の AWS のツールとか OpenDJ (おや?サイトデザイン変わってる。新しいバージョン試さなきゃ) のコマンドとか、毎度起動に時間がかかりすぎます。

p.s.
maven わけわかんないし、XML もキライです