如何以编程方式将证书添加到信任库并将其用于验证服务器身份验证
在我的应用程序中,我想使用 https 连接到用户指定的服务器,该服务器使用自签名证书。我现在收集到的是,
- 自签名证书被拒绝(如预期),
- android密钥库/信任库不用于应用程序,因此应用程序必须构建和使用自己的信任库,
- JDK中有一个“keytool”来构建一个可以作为资源提供给应用程序的信任库,但这不是解决方案,因为我事先不知道服务器(及其证书),
因为 https 服务器是用户指定的,所以我事先不知道服务器的证书,因此想要以编程方式将服务器证书添加到应用程序的信任库(通过向用户显示证书并让他接受它)。添加到信任库后,应用程序应使用该信任库对服务器进行身份验证。
我不想简单地接受每个自签名证书,而不需要用户检查指纹,正如网络上的一些示例所建议的那样。
现在的问题是我对 Java 和 Android 完全陌生,并且正在努力理解 AndroidHttpClient 或 DefaultHttpClient 的内部工作原理。我的应用程序中有基本的 HTTP 工作,但没有找到任何关于如何根据用户的需求将证书实际添加到应用程序内的信任库的示例。
有人知道如何实现这一目标,或者知道我可以看的工作示例吗?
任何提示表示赞赏。谢谢。
编辑:在 K9 Mail 的 TrustManagerFactory.java 类。如果您有同样的问题,我建议您看一下。
I my app I want to use a https connection to a user-specified server which uses a self-signed certificate. What I gathered by now is, that
- self signed certificates are rejected (as expected)
- the android keystore/truststore is not used for apps, so apps have to build and use their own truststore,
- there's a "keytool" in the JDK to build a truststore that can be supplied to the app as a resource, which however is not a solution since I do not know the server (and its certificate beforehand)
Since the https server is user specified, I do not know the server's certificate beforehand and thus want to add the server certificate programmatically to the app's truststore (by showing the certificate to the user and have him accept it). Once added to the truststore, the app shall use that truststore to authenticate the server.
I do NOT want to simply accept every self-signed certificate without the user checking the fingerprint as some examples on the web suggest.
Now the problem is that I'm completely new to Java and Android and am struggling to understand the inner workings of the AndroidHttpClient or DefaultHttpClient. I have basic HTTP working in my app, but haven't found any example on how to actually ADD certificates to a truststore inside the app on demand of the user.
Does anybody know how to achieve that or knows a working example that I can look at?
Any hints are appreciated. Thanks.
EDIT: Found the Solution in the TrustManagerFactory.java class of K9 Mail. I suggest to have a look at it if you're having the same question.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
解决方案是不久前找到的,但还没有人创建答案来帮助指导其他人,所以今天早上我将成为点皮条客(ette)并发布作为解决方案添加的 URL,并从公共源复制代码。希望这有助于指导其他人找到解决方案。 :)
这是 URL 下面的代码。
Solution was found a while ago but no one has created the Answer yet to help guide others, so I'll be the Point Pimp(ette) this morning and post the URL added as the solution, plus copy in the code from the public source. Hope this helps guide others to the solution. :)
Here's the URL for the code below.
您可以使用自签名证书。要使用自签名证书,您可以将其转换为 Android 支持的充气城堡格式密钥库,然后将其作为原始资源存储在 Android 应用程序项目中。如何转换和使用它,所有详细信息可以在Bob的博客上找到。这是相同的链接 - http://blog.crazybob .org/2010/02/android-trusting-ssl-certificates.html。这非常有效。希望这有帮助
You can use self-signed certificates. To use a self-signed certificate, you can convert it into bouncy castle format keystore which is supported by Android and then store it as a raw resource in your Android app project. How to convert and use it, all details can be found on Bob's blog. Here is the link for the same - http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html. This worked quite well. Hope this helps