前提・実現したいこと
androidで、httpsサーバサイドプログラムを作成しています。
http実装はできたのですが、httpsにすると、うまく動作せず、以下のエラーメッセージが表示されます。
発生している問題・エラーメッセージ
java.security.KeyStoreException: JKS not found at java.security.KeyStore.getInstance(KeyStore.java:890) at org.eclipse.jetty.util.security.CertificateUtils.getKeyStore(CertificateUtils.java:52) at org.eclipse.jetty.util.ssl.SslContextFactory.getKeyStore(SslContextFactory.java:1052) at org.eclipse.jetty.util.ssl.SslContextFactory.loadKeyStore(SslContextFactory.java:1012) at org.eclipse.jetty.util.ssl.SslContextFactory.doStart(SslContextFactory.java:264) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) at org.eclipse.jetty.server.ssl.SslSelectChannelConnector.doStart(SslSelectChannelConnector.java:612) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) at org.eclipse.jetty.server.Server.doStart(Server.java:293) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
Caused by: java.security.NoSuchAlgorithmException: JKS KeyStore not available at sun.security.jca.GetInstance.getInstance(GetInstance.java:159) at java.security.Security.getImpl(Security.java:590) at java.security.KeyStore.getInstance(KeyStore.java:887) at org.eclipse.jetty.util.security.CertificateUtils.getKeyStore(CertificateUtils.java:52) at org.eclipse.jetty.util.ssl.SslContextFactory.getKeyStore(SslContextFactory.java:1052) at org.eclipse.jetty.util.ssl.SslContextFactory.loadKeyStore(SslContextFactory.java:1012) at org.eclipse.jetty.util.ssl.SslContextFactory.doStart(SslContextFactory.java:264) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) at org.eclipse.jetty.server.ssl.SslSelectChannelConnector.doStart(SslSelectChannelConnector.java:612) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) at org.eclipse.jetty.server.Server.doStart(Server.java:293) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) at jp.tama.rtc.domain.usecase.ServerUseCase.setServer(ServerUseCase.kt:85) at jp.tama.rtc.domain.usecase.ServerUseCase.start(ServerUseCase.kt:31) at jp.tama.rtc.ui.MainActivity$onCreate$2.invokeSuspend(MainActivity.kt:33) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:241) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594) at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:740)
該当のソースコード
class ServerUseCase(private val port:Int) { private val server: Server = Server(80) private val sslContextFactory: SslContextFactory = SslContextFactory() fun start(){ if(server.isStarted){ Timber.d("already server start") return } this.setServer() } private fun checkSslKey(sslKey:String){ val readFile = File(MainApplication.instance.filesDir, sslKey) Timber.d(readFile.absolutePath) if(!readFile.exists()){ MainApplication.instance.openFileOutput(sslKey, Context.MODE_PRIVATE).use { it.write(MainApplication.instance.assets.open(sslKey).readBytes()) } } } private fun setServer(){ val sslKey:String = "test.jks" val sslPassword: String = "test" checkSslKey(sslKey) // ssl設定 sslContextFactory.isTrustAll = true sslContextFactory.keyStoreType = "JKS" sslContextFactory.keyStorePath = "${MainApplication.instance.filesDir}/$sslKey" sslContextFactory.setKeyManagerPassword(sslPassword) sslContextFactory.setKeyStorePassword(sslPassword) sslContextFactory.isAllowRenegotiate = true // connector作成 val httpsConnector = SslSelectChannelConnector(sslContextFactory) httpsConnector.port = 443 server.addConnector(httpsConnector) val servletHandler = ServletContextHandler(ServletContextHandler.SESSIONS) servletHandler.addServlet(ServletHolder(WebserverServletUseCase()), "/server") val connector: MutableList<Connector> = mutableListOf() connector.add(httpsConnector) server.connectors =connector.toTypedArray() // サーバにハンドラー設定 val handlerList = HandlerList() handlerList.addHandler(servletHandler) server.handler = handlerList server.start() server.join() } }
試したこと
jksファイルは以下の方法で作成
C:\Program Files\Android\Android Studio\jre\bin\keytool.exe\keytool -genkey -dname "cn=localhost, ou=Example div., o=Example Inc., l=Minato-ku, st=Tokyo, c=JP" -alias jetty -keystore mykeystore.jks -storepass test -keypass test -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -validity 3650 -ext SAN=dns:localhost
「KeyStore Explore」などでキーが正常に作成しているように見えており、file not foundではないので、ファイル自体が見つかっていないようにみえますので、何が問題なのか不明となっています。
補足情報(FW/ツールのバージョンなど)
android studio : 3.6.2
jetty : implementation group: 'org.eclipse.jetty.aggregate', name: 'jetty-all', version: '8.2'
※jetty9はoreo(8.0)以上必須のため、jetty8にしています。
android端末: 8.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/15 23:55