我正试图用我的应用程序点击https网址.我已经按照本教程.我创建的商店有正确的CA. 但是,当我尝试建立连接时,我收到以下错误:
ERROR/IOException(1843): webPost: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
Run Code Online (Sandbox Code Playgroud)
我已经完成了一些有关此错误的阅读,人们决定允许他们的应用程序接受所有证书.我认为这不是真的可以接受.我应该检查一下,看看问题是什么?
我的应用程序是一种“网络爬虫”形式,它使用Java Jsoup 库从所需的输入页面加载 HTML 。我最近将我的应用程序平台从 Java 8 升级到了 Java 11。通过这次升级,我收到了一些客户的报告,说他们在尝试加载某些网页的 HTML 内容时收到 SSLHandshakeExceptions。这些出现的网页因设备而异,在某些设备上,我的客户端根本无法加载任何网页(http:// 和 https:// 网页都没有)。
我尝试通过多种方式解决此问题,但无济于事:
在这一点上,我不确定要采取哪些选择,因为我对 SSL、TLS 和 HTTPS 的了解有限。这些错误在 Java 8 中从未发生过,并且在升级到 Java 11 之前一切正常。
根据我的理解,Java 11 关于 SSL 的唯一改变是升级到 TLS 1.3,而之前版本的 Java 依赖于使用 TLS 1.2。
因此,我想强制 Java 11 使用 TLS 1.2 而不是 TLS 1.3,因为我认为这是 SSLHandshakeExceptions 的原因。我该怎么做呢?
我正在使用Apache HttpClient库来设置https连接.不幸的是Android给了我一个"不值得信任的服务器证书"错误.如果我使用手机浏览器浏览网站,它会正确验证证书,这让我相信我需要让HttpClient"知道"手机上的根证书.这是我的HttpClient设置代码:
HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout( params, 20000 );
HttpConnectionParams.setSoTimeout( params, 20000 );
HttpProtocolParams.setVersion( params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset( params, HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue( params, false);
SchemeRegistry schReg = new SchemeRegistry();
schReg.register( new Scheme( "http", PlainSocketFactory.getSocketFactory(), 80 ) );
schReg.register( new Scheme( "https", SSLSocketFactory.getSocketFactory(), 443 ) );
ClientConnectionManager conMgr = new ThreadSafeClientConnManager( params, schReg );
DefaultHttpClient defaultHttpClient = new DefaultHttpClient( conMgr, params );
return ( defaultHttpClient );
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我对SSLSocketFactory没有任何特别之处.如何在不在密钥库中添加自定义证书的情况下使HttpClient库验证我的站点?我应该创建自定义SSLSocketFactory并从Android手机加载cacerts.bks吗?在这种情况下,我可能会遇到不同手机上密钥库的不同密码问题?
如果您需要更多信息,请与我们联系.这个SSL的东西对我来说非常困难.
我正在尝试使用带有.bks密钥库的"https"方案连接到服务器,但由于此问题我无法连接.
任何人都可以告诉我这是什么原因以及如何解决这个问题.
这是我的代码
public String httpRestGetCallwithCertificate(String url, String payLoad) {
String result = null;
DefaultHttpClient httpClient = null;
KeyStore trustStore = null;
try {
httpClient = new DefaultHttpClient(getHttpParams());
HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
HttpHost targetHost = new HttpHost("hostname","portno","https");
httpClient.getCredentialsProvider().setCredentials(
new AuthScope(targetHost.getHostName(), targetHost.getPort()),
new UsernamePasswordCredentials("username","password"));
trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
InputStream instream = mContext.getResources().openRawResource(R.raw.truststore);
try {
trustStore.load(instream, "password".toCharArray());
} finally {
try { instream.close(); } catch (Exception ignore) {}
}
SchemeRegistry registry = new SchemeRegistry();
SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); …
Run Code Online (Sandbox Code Playgroud) 我已经编写了一些代码来从网站下载文件.该代码适用于测试http网址.一旦我将URL更改为https,我就会有一个连接超时.
System.setProperty("http.proxyHost","trproxy.rwe.com") ;
System.setProperty("http.proxyPort", "80") ;
Authenticator.setDefault (new MyAuthenticator("USER","PW"));
//URL url = new URL("http","www.treasury.gov",80,"/ofac/downloads/sdn.csv",new sun.net.www.protocol.http.Handler()); THIS WORKS
URL url = new URL("https", "downloads.elexonportal.co.uk",443,"/bmradataarchive/download?key=MYKEY&filename="+filename,new sun.net.www.protocol.https.Handler());
url.openConnection();
InputStream reader = url.openStream();
FileOutputStream writer = new FileOutputStream("C:/downloads/"+filename);
Run Code Online (Sandbox Code Playgroud)
如果我将https网址复制到浏览器中,我会被问到我希望保存文件的位置,并且工作正常.任何帮助非常感谢.我试过这个 但是没用
谢谢克里斯
我正在尝试使用HTTPS实现Android↔Apache通信,但我收到以下错误.我间歇性地遇到问题,大约30%的时间.
Run Code Online (Sandbox Code Playgroud)javax.net.ssl.sslPeerUnverifiedException: No peer certificate
我在网上搜索,但任何答案都帮助了我......
这是我的Android代码:
http_post = new HttpPost(Utils.IP_ADDRESS);
http_post_data = new ArrayList<NameValuePair>();
http_post_data.add(new BasicNameValuePair("regId", regid));
http_post_data.add(new BasicNameValuePair("email", globals.userInfo.mail));
http_post_data.add(new BasicNameValuePair("pass", globals.userInfo.pass));
http_post.setEntity(new UrlEncodedFormEntity(http_post_data));
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, Utils.TIMEOUT_CONNECTION);
HttpConnectionParams.setSoTimeout(httpParameters, Utils.TIMEOUT_SOCKET);
http_client = new DefaultHttpClient(httpParameters);
response = http_client.execute(http_post);
String responseBody = EntityUtils.toString(response.getEntity(), GlobalsSingleton.applicationCharset);
Run Code Online (Sandbox Code Playgroud)
我有GoDaddy证书.那么我需要更改我的服务器或Android代码才能解决这个问题?
我正在开发一个必须支持API级别16的项目,并要求我对动态URL进行网络调用.我遇到的问题是服务器最近不得不将TLS更新为1.2以实现PCI合规性,默认情况下在Android API 16-19上禁用.虽然启用此功能并不困难,但我遇到了仅针对这些API级别的X509证书问题.
我对它做了很多研究,虽然所有这些链接都很有用:
1)如何在Android应用程序中启用TLS 1.2支持(在Android 4.1 JB上运行)
2)如何使用自签名证书连接到Android(paho客户端)中的Mqtt服务器?
4)允许Java使用不受信任的证书进行SSL/HTTPS连接
6)SSLHandshakeException:未找到证书路径的信任锚.仅适用于Android API <19
他们没有解决我遇到的核心问题,即我看到了这个例外:
com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:151)
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:112)
Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:409)
at com.android.okhttp.Connection.upgradeToTls(Connection.java:146)
at com.android.okhttp.Connection.connect(Connection.java:107)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294)
at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:503)
at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:136)
at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:110)
at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:96)
... 1 more
Run Code Online (Sandbox Code Playgroud)
当我尝试连接到需要TLS1.2的URL时,例如https://www.ssllabs.com/ssltest/viewMyClient.html. …
我尝试使用Url的XML解析器读取XML数据(" https://....etc ").但我面临以下错误.这是我的日志.
04-08 16:34:23.017:WARN/System.err(8052):javax.net.ssl.SSLException:不受信任的服务器证书
04-08 16:34:23.098:WARN/System.err(8052):at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:371)
04-08 16:34:23.107:WARN/System.err(8052):at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:92)
04-08 16:34:23.107:WARN/System.err(8052):at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381)
04-08 16:34:23.107:WARN/System.err(8052):at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:164)
04-08 16:34:23.116:WARN/System.err(8052):at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
04-08 16:34:23.116:WARN/System.err(8052):at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
04-08 16:34:23.116:WARN/System.err(8052):at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348)
04-08 16:34:23.116:WARN/System.err(8052):at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
04-08 16:34:23.127:WARN/System.err(8052):at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
04-08 16:34:23.127:WARN/System.err(8052):at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
04-08 16:34:23.127:WARN/System.err(8052):at androidexperts.apps.prontonnetworks.xmlparser.(xmlparser.java:108)
04-08 16:34:23.196:WARN/System.err(8052):at androidexperts.apps.prontonnetworks.prontonnetworks $ HandlerServer.doInBackground(prontonnetworks.java:486)
04-08 16:34:23.232:WARN/System.err(8052):at androidexperts.apps.prontonnetworks.prontonnetworks $ HandlerServer.doInBackground(prontonnetworks.java:1)
04-08 16:34:23.257:WARN/System.err(8052):在android.os.AsyncTask $ 2.call(AsyncTask.java:185)
04-08 16:34:23.287:WARN/System.err(8052):at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:305)
04-08 16:34:23.307:WARN/System.err(8052):at java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-08 16:34:23.317:WARN/System.err(8052):at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
04-08 16:34:23.317:WARN/System.err(8052):at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:561)
04-08 16:34:23.317:WARN/System.err(8052):at java.lang.Thread.run(Thread.java:1096)
04-08 16:34:23.317:WARN/System.err(8052):引起:java.security.cert.CertificateException:java.security.cert.CertPathValidatorException:找不到CertPath的TrustAnchor.04-08 16:34:23.327:WARN/System.err(8052):at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:168)
04-08 16:34:23.327:WARN/System.err(8052):at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:366)
04-08 16:34:23.337:WARN/System.err(8052):......还有18个 …
我正在尝试使用 curl 执行 https 发布请求。当我执行此请求时,我既没有收到任何响应,也没有收到任何错误或异常。帮助或任何关于这里出了什么问题的线索表示赞赏。谢谢。
curl 命令行格式:
curl -X POST \
-F 'image=@filename.png;type=image/png' \
-F 'svgz=@filename.svgz;type=image/svg+xml' \
-F 'json={
"text" : "Hello world!",
"templateid" : "0010",
"timestamp" : "1342683312",
"location" : [ 37.7793, -122.4192 ],
"facebook" :
{
"id": "738124695",
"access_token": "<VALID_USER_FACEBOOK_TOKEN_WITH_PUBLISH_ACTIONS_PERMISSIONS",
"expiration_date": "1342683312"
}
};type=application/json' \
https://sample.com/api/posts
Run Code Online (Sandbox Code Playgroud)
Facebook发布代码:
public static void uploadToFB() {
HttpClient client = getNewHttpClient();
HttpPost httpost = new HttpPost("https://sample.com/api/posts");
httpost.addHeader("image", "filename.png");
httpost.addHeader("svgz", "filename.svgz");
httpost.addHeader("type", "application/json");
httpost.setHeader("Content-type", "application/json");
JSONObject data = new JSONObject();
JSONObject facebook = new …
Run Code Online (Sandbox Code Playgroud) 关于AndroidHttpClient的信息很少,特别是我找不到任何好的例子.从我读到的 - 我可以使用此客户端,它已预先配置为SSL.我的目标是2.2+,所以它对我很有用.
谢谢!
我自己的答案(见下面的代码).
我的应用程序单例版本.请参阅顶部的注释,详细了解我用于生成所有内容的命令行.始终使用相同的密码以确保其有效.PKS文件密码必须匹配.
import android.net.http.AndroidHttpClient;
import android.app.Application;
import android.util.Log;
import idatt.mobile.android.providers.DBLog;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import java.io.InputStream;
import java.security.KeyStore;
/*
To generate PKS:
1. Created cert in IIS7 and then exported as pfx. Follow instruction on SelfSSL: http://www.robbagby.com/iis/self-signed-certificates-on-iis-7-the-easy-way-and-the-most-effective-way/
1a. Download tool: http://cid-3c8d41bb553e84f5.skydrive.live.com/browse.aspx/SelfSSL
1b. Run: SelfSSL /N:CN=mydomainname /V:1000 /S:1 /P:8081
I use port 8081 on my server
1c. Export from IIS manager to cert.pfx
2. Run command …
Run Code Online (Sandbox Code Playgroud) 我有一个ListView与项目中的一些内容(TextViews,ImageView ...).我正在使用Nostra的UIL加载项目中的图像,但其中一些无法加载.当我打电话时,这就是我得到的Log.v(String.valueOf(failReason.getCause());
:
11-16 23:52:20.447: V/javax.net.ssl.SSLHandshakeException: Handshake failed(17467): failz
11-16 23:52:20.657: V/NativeCrypto(17467): SSL handshake aborted: ssl=0x15fd758: Failure in SSL library, usually a protocol error
11-16 23:52:20.657: V/NativeCrypto(17467): error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:762 0x4c2ed485:0x00000000)
11-16 23:52:21.207: V/NativeCrypto(17467): SSL handshake aborted: ssl=0x1562468: Failure in SSL library, usually a protocol error
11-16 23:52:21.207: V/NativeCrypto(17467): error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:762 0x4c2ed485:0x00000000)
Run Code Online (Sandbox Code Playgroud)
你不知道,为什么会出现这个问题或者我该如何解决?
这是一个示例图像,无法加载:
http://bigparty.cz/photos/headlinefoto/13.jpg
(我可以附加一个包含整个错误的日志 - UIL 自动将其放入Log的错误)
android image-loading imageview sslhandshakeexception universal-image-loader
我在ssl使用httpclient在android上有一些麻烦我试图访问自签名证书的细节我希望我的应用程序信任所有证书(我将使用ssl仅用于数据加密).首先,我尝试使用本指南http://hc.apache.org/httpclient-3.x/sslguide.html在桌面上工作正常,但在Android上我仍然得到javax.net.ssl.SSLException:不信任的服务器证书.在谷歌搜索后我发现了一些其他的例子如何启用ssl.
http://groups.google.com/group/android-developers/browse_thread/thread/62d856cdcfa9f16e - 当我使用URLConnection但使用HttpClient时工作仍然有例外.
http://www.discursive.com/books/cjcook/reference/http-webdav-sect-self-signed.html - 在桌面上使用来自apache的jars工作但在android中使用包含在SDK类中无法使其工作.
所以任何想法如何使用HttpClient信任Android上的所有证书
我有一个Android应用程序,javax.net.ssl.SSLException: Not trusted server certificate
当我尝试将自己的服务器与我自己的自签名证书一起使用时,我会继续使用它.
我正在考虑配置Android TrustManager
以接受自签名证书,或接受所有证书,以便我可以调试我的应用程序.我在这个网站上阅读了一些关于如何做到这一点的资源.这样做安全吗?