我正在做一个https帖子,我得到ssl异常的例外不可信服务器证书.如果我做正常的http它工作得很好.我必须以某种方式接受服务器证书吗?
我正在编写一个需要SSL客户端身份验证的Android应用.我知道如何为桌面Java应用程序创建JKS密钥库,但Android仅支持BKS格式.我试图创建密钥库的每一种方式都会导致以下错误:
handling exception: javax.net.ssl.SSLHandshakeException: null cert chain
所以看起来客户端永远不会发送正确的证书链,可能是因为我没有正确创建密钥库.我无法在桌面上启用SSL调试,因此这使得它比应该更加困难.
作为参考,以下是IS用于创建BKS 信任库的命令:
keytool -importcert -v -trustcacerts -file "cacert.pem" -alias ca -keystore "mySrvTruststore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk16-145.jar" -storetype BKS -storepass testtest
这是我尝试过的命令,它无法创建BKS客户端密钥库:
cat clientkey.pem clientcert.pem cacert.pem > client.pem
keytool -import -v -file <(openssl x509 -in client.pem) -alias client -keystore "clientkeystore" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk16-145.jar" -storetype BKS -storepass testtest
Run Code Online (Sandbox Code Playgroud) 对于我的应用程序Transdroid,我通过HTTP连接到远程服务器,并可选择通过HTTPS安全地连接.对于与HttpClient的这些HTTPS连接,我使用自定义SSL套接字工厂实现来确保自签名证书正常工作.基本上,我接受一切,并忽略任何证书的每一次检查.
这已经有一段时间了,但它不再适用于Android 2.2 FroYo.尝试连接时,它将返回一个异常:
java.io.IOException: SSL handshake failure: I/O error during system call, Broken pipe
Run Code Online (Sandbox Code Playgroud)
以下是我初始化HttpClient的方法:
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", new PlainSocketFactory(), 80));
registry.register(new Scheme("https", (trustAll ? new FakeSocketFactory() : SSLSocketFactory.getSocketFactory()), 443));
client = new DefaultHttpClient(new ThreadSafeClientConnManager(httpParams, registry), httpParams);
Run Code Online (Sandbox Code Playgroud)
我使用了FakeSocketFactory和FakeTrustManager,其源代码可以在这里找到.
同样,我不明白为什么它突然停止工作,甚至错误'破管'的意思.我在Twitter上看到过Seesmic和Twidroid在FroYo上启用SSL时失败的消息,但我不确定它是否相关.
感谢您的任何指示/帮助!
使用HttpClient时,尝试通过HTTPS进行通信时收到以下错误:
线程"main"中的异常javax.net.ssl.SSLPeerUnverifiedException:peer未经过身份验证.
这是我的代码:
URI loginUri = new URI("https://myUrl.asp");
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet( loginUri );
HttpResponse response = httpclient.execute( httpget );
Run Code Online (Sandbox Code Playgroud)
如何抑制或删除此错误?
我已经查看了有关如何通过HTTPSAndroid从使用自签名证书的服务器检索内容的各种帖子.然而,他们似乎都没有工作 - 他们都没有删除
javax.net.ssl.SSLException:不受信任的服务器证书消息.
不能选择将服务器修改为具有可信证书,也不能使服务器证书与服务器的IP地址匹配.
请注意,服务器没有DNS名称,它只有一个IP地址.GET请求看起来像这样:
https://username:password@anyIPAddress/blabla/index.php?param=1¶m2=3
Run Code Online (Sandbox Code Playgroud)
我完全清楚这种解决方案很容易发生中间人攻击等.
因此,解决方案必须忽略对证书缺乏信任,并忽略主机名不匹配.
有没有人知道使用Java for Android的代码?
有很多尝试在stackoverflow.com上解释这个,以及大量的代码片段,但它们似乎不起作用,并且没有人提供一个解决这个问题的代码块,据我所见.知道某人是否真的解决了这个问题,或者Android是否只是阻止了不受信任的证书,这将会很有趣.
我在Android上使用HttpClient连接到https://someUrl.com/somePath.问题是网站的证书是针对*.someUrl.com而不是someUrl.com的,所以我得到了一个SSLException.网站上有跛脚,是的,但除非我能解决这个问题,否则我会陷入困境.有没有办法让HttpClient放松并接受证书?
我需要做的就是从具有自签名SSL证书的Web服务器下载一些基于文本的基本文件和图像文件.
我一直试图弄清楚如何使用HttpClient来做到这一点,但让SSL工作是一场噩梦,这对于这么简单的任务来说似乎太麻烦了.
有没有更好的方法来执行这些文件下载?也许通过WebView或浏览器功能?重新制作一个简单的HTTPS GET请求是一个很大的痛苦,并且显着地阻碍了我的开发计划.
我正在尝试从我的Android应用程序连接到基于node.js的TLS服务器.当然它失败了因为我使用的是自签名证书.
无论如何我可以将证书添加到我的应用程序并让Android以某种方式信任它吗?注意,我没有使用HTTPS,这是一个TLS over TCP连接.
问候,
我正在开发一个Android应用程序,需要通过https打开一个url(带有POST参数)并获得响应.
我有一个自签名证书的复杂性增加了.我还需要接受cookies.
任何人都有关于从哪里开始的任何想法?
提前谢谢了,
我目前正在重写X509TrustManager以允许所有证书作为临时"解决方案"(此时不安全).我试图找出我将如何添加,所以它只接受我遇到问题的特定证书,直到可以进行适当的修复(目前不在我的手中).这是当前的代码.
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
}
}};
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (GeneralSecurityException e) {
System.out.println(e.getStackTrace());
}
Run Code Online (Sandbox Code Playgroud)