【问题标题】:java.security.NoSuchAlgorithmException: TrustManagerFactory SunX509 implementation not foundjava.security.NoSuchAlgorithmException:未找到 TrustManagerFactory SunX509 实现
【发布时间】:2012-08-24 22:12:21
【问题描述】:

我刚刚从之前的 rc5 更新为 restlet rc6。 android 应用程序对外部 url 进行简单的 https 调用。

在 rc5 中一切正常,在 rc6 中我现在收到以下错误:

08-30 10:03:39.185: WARN/System.err(15077): Error while handling an HTTP client call
08-30 10:03:39.185: WARN/System.err(15077): [ 08-30 10:03:39.185 15077:0x3aff W/System.err ]
        java.lang.RuntimeException: Unable to create SSLContext.
08-30 10:03:39.185: WARN/System.err(15077): at org.restlet.ext.net.internal.HttpUrlConnectionCall.<init>(HttpUrlConnectionCall.java:130)
08-30 10:03:39.185: WARN/System.err(15077): at org.restlet.ext.net.HttpClientHelper.create(HttpClientHelper.java:156)
08-30 10:03:39.185: WARN/System.err(15077): at org.restlet.engine.adapter.ClientAdapter.toSpecific(ClientAdapter.java:160)
08-30 10:03:39.185: WARN/System.err(15077): at org.restlet.engine.adapter.HttpClientHelper.handle(HttpClientHelper.java:111)
08-30 10:03:39.185: WARN/System.err(15077): at org.restlet.Client.handle(Client.java:180)
08-30 10:03:39.185: WARN/System.err(15077): at org.restlet.routing.Filter.doHandle(Filter.java:159)
08-30 10:03:39.185: WARN/System.err(15077): at org.restlet.routing.Filter.handle(Filter.java:206)
08-30 10:03:39.185: WARN/System.err(15077): at org.restlet.resource.ClientResource.handle(ClientResource.java:1137)
08-30 10:03:39.185: WARN/System.err(15077): at org.restlet.resource.ClientResource.handleOutbound(ClientResource.java:1226)
08-30 10:03:39.185: WARN/System.err(15077): at org.restlet.resource.ClientResource.handle(ClientResource.java:1069)
08-30 10:03:39.185: WARN/System.err(15077): at org.restlet.resource.ClientResource.handle(ClientResource.java:1045)
08-30 10:03:39.185: WARN/System.err(15077): at org.restlet.resource.ClientResource.handle(ClientResource.java:951)
08-30 10:03:39.185: WARN/System.err(15077): at org.restlet.resource.ClientResource.get(ClientResource.java:658)
08-30 10:03:39.185: WARN/System.err(15077): at de.ewe.tk.apps.android.css.services.DocstoreService.getDocumentInfos(DocstoreService.java:86)
08-30 10:03:39.195: WARN/System.err(15077): at de.ewe.tk.apps.android.css.activity.DocstoreListActivity$GetDocumentInfosTask.doInBackground(DocstoreListActivity.java:66)
08-30 10:03:39.195: WARN/System.err(15077): at de.ewe.tk.apps.android.css.activity.DocstoreListActivity$GetDocumentInfosTask.doInBackground(DocstoreListActivity.java:46)
08-30 10:03:39.195: WARN/System.err(15077): at android.os.AsyncTask$2.call(AsyncTask.java:185)
08-30 10:03:39.195: WARN/System.err(15077): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
08-30 10:03:39.195: WARN/System.err(15077): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
08-30 10:03:39.195: WARN/System.err(15077): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
08-30 10:03:39.195: WARN/System.err(15077): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
08-30 10:03:39.195: WARN/System.err(15077): at java.lang.Thread.run(Thread.java:1102)
08-30 10:03:39.195: WARN/System.err(15077): Caused by: java.security.NoSuchAlgorithmException: TrustManagerFactory SunX509 implementation not found
08-30 10:03:39.195: WARN/System.err(15077): at org.apache.harmony.security.fortress.Engine.getInstance(Engine.java:105)
08-30 10:03:39.195: WARN/System.err(15077): at javax.net.ssl.TrustManagerFactory.getInstance(TrustManagerFactory.java:80)
08-30 10:03:39.195: WARN/System.err(15077): at org.restlet.ext.ssl.DefaultSslContextFactory.createSslContext(DefaultSslContextFactory.java:357)
08-30 10:03:39.195: WARN/System.err(15077): at org.restlet.ext.net.internal.HttpUrlConnectionCall.<init>(HttpUrlConnectionCall.java:126)
08-30 10:03:39.195: WARN/System.err(15077): ... 21 more

谁能告诉我 rc6 中发生了什么变化使其不再工作?

rc6 的发行说明说:

The support for HTTPS has been significantly completed and fixed in all connectors for :

cipher suites restriction
SSL/TLS protocol version restriction
client certificate request & requirement setting

不幸的是,我在官方文档中没有找到任何提示,我的代码需要更改哪些内容才能使其再次运行。

谢谢, 提洛

【问题讨论】:

    标签: android restlet restlet-2.0


    【解决方案1】:

    愚蠢的兔子显然在 rc6 的 DefaultSslContextFactory.createSslContext(..) 方法中包含以下内容:

    setKeyManagerAlgorithm(helperParameters.getFirstValue(
                "keyManagerAlgorithm", true, System.getProperty(
                        "ssl.KeyManagerFactory.algorithm", "SunX509")));
    

    即他们对 Sun JDK 专有的 SunX509 进行了硬编码——总体而言,这是一个非常糟糕的主意。这已在 17 天前的提交 025d356d9fc3620ba9ed613fed32f1a5668f4f70 中修复。

    如果您需要它现在工作,您当然可以尝试自己下载和构建库。

    【讨论】:

    • 那么在 Android 上配置这个的正确方法是什么?
    • “最新”源应该可以工作,他们至少删除了对 SunX509 的直接引用。
    • 嗯,我刚刚更新到 2.1.0 版,它于 2012 年 9 月 20 日发布。异常还是一样: 原因:java.security.NoSuchAlgorithmException: TrustManagerFactory SunX509 implementation not found
    • 解决方法是设置以下属性:System.setProperty( "ssl.TrustManagerFactory.algorithm", javax.net.ssl.KeyManagerFactory.getDefaultAlgorithm()) 这对我有用。
    猜你喜欢
    • 2012-04-13
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2020-03-20
    • 2016-04-01
    • 2018-09-30
    • 1970-01-01
    相关资源
    最近更新 更多