JavaFX 8 では WebView
を使用して Java アプリケーション上に WebKit ベースのブラウザ機能を配置することが出来ます。ただこれ自己署名証明書を使用した HTTPS サイトと通信しようとするとデフォルトでは真っ白になったまま何も表示されない状態になってしまいます。
プロダクション環境では信頼できる CA から発行された (高価で期限付きの) サーバ証明書を使用しても、ローカルやステージング環境では自己署名証明書で済ませていることがよくありますよね。
WebView
(WebEngine
) は根本の通信部分で HttpsURLConnection
を使用していますので、ステージング環境でのみ全てのサーバ証明書を検証しない TrustManager
を設定してやれば自己署名証明書を使用したサイトも WebView
で表示されるようになります (以下のコードは Scala ですが Java への読み替えは難しくないと思います)。
import java.security.SecureRandom
import java.security.cert.X509Certificate
import javax.net.ssl.{HttpsURLConnection, SSLContext, TrustManager, X509TrustManager}
val trustAll:Array[TrustManager] = Array(
new X509TrustManager {
override def getAcceptedIssuers:Array[X509Certificate] = null
override def checkClientTrusted(x509Certificates:Array[X509Certificate], s:String):Unit = None
override def checkServerTrusted(x509Certificates:Array[X509Certificate], s:String):Unit = None
}
)
val sc = SSLContext.getInstance("SSL")
sc.init(null, trustAll, new SecureRandom())
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory)
この方法は WebView
だけでなく URL
や URLConnection
クラスを使用して自己署名証明書を使用したサイトと通信する場合にも有効です。