问题标签 [httpsurlconnection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
32386 浏览

android - 使用本地信任库时,Android HttpsUrlConnection javax.net.ssl.SSLException 连接因对等握手错误而关闭

我无法让 AndroidOpenSSL使用该对象连接到一个简单的服务器HttpsUrlConnection(我已经梳理了 StackOverflow 和一堆在线教程,并且几乎逐行地按照示例进行操作,但我仍然无法弄清楚为什么我的当我使用本地信任库时损坏)。

我目前有一个尝试连接到简单的 Android 活动OpenSSL server(我可以使用 OpenSSL 客户端连接到我的服务器),一旦HttpsUrlConnection.connect()被调用,我就会收到一个“javax.net.ssl.SSLException: Connection closed by peer" error during the SSL handshake. 也许我错误地设置了我的示例服务器?

注意事项:

  • 暂时没有客户授权
  • 加载默认信任库时能够连接到https://www.google.com
  • 无法使用自签名证书连接到本地主机上的服务器
  • 不想信任所有证书
  • 不想使用 Apache HttpClient
  • 只想使用本地信任库
  • 用充气城堡创建了本地信任库
  • 能够正确地将信任库加载到
  • 在代理防火墙后面,在我的 android 虚拟设备上设置了代理
  • AVD 设置为Android 4.1 API 16.

我已经尝试过的事情:

  • 连接到两者127.0.0.1 and 10.0.2.2
  • 使用新的SecureRandom() with the SSLContext.init()
  • 创建网址'URL u = new URL("https", "10.0.2.2", 443, "/");'
  • 使用TrustManagerFactory.getDefaultAlgorithms()而不是“X509”
    • 给出"Unexpected response code error 503"而不是“连接被对等方关闭”

提前感谢您抽出宝贵时间查看我的问题!

使用命令启动的简单服务器:

使用命令测试客户端连接:

Android 活动代码(已编辑以删除完整的运行代码以进行简化 - 如果需要更多代码,请告诉我) - 错误输出位于代码下方。

正确连接到https://www.google.com时的输出:

尝试使用自签名证书连接到我的服务器时的输出:

再次感谢!!

0 投票
1 回答
1612 浏览

java - HttpsURLConnection.getInputStream() 会自动重试吗?

我正在使用 HttpsURLConnection 向服务器发出服务请求,如下面的代码:

服务有时可能需要更长的时间,所以理想情况下我应该期待一个超时异常,但客户端正在重试并再次发送相同的请求。有没有办法明确禁用任何类型的重试?而且我什至不确定设置的超时方法是否有任何区别。

我正在使用 Java 1.6

更新
我尝试了 connect() 和 getResponseCode() 而不是 getInputStream() 但行为相同:

即使这是提出2个请求。

更新
HttpClient解决了这个问题。在 HttpClient 中,您可以将重试显式设置为 false

0 投票
2 回答
6146 浏览

android - 将 cookie 存储在 sharedpreferences 中

我一直在努力解决这个问题:我正在制作一个 HttpsURLConnection 并使用 java.net.cookiemanager 来管理我的 cookie(据我所知,没有办法将 android.webkit.cookiemanager 用于 HttpUrlConnection/HttpsUrlConnection 吗? )。我需要将我的长期 cookie 保存到以后的连接中。

可悲的是我不能使用http://loopj.com/android-async-http/它是 PersistentCookieStore 因为我需要允许一个不受信任的证书(使用http://abhinavasblog.blogspot.se/2011/07/allow-untrusted -certificate-for-https.html)。我试过单独使用他们的 PersistentCookieStore 但他们使用的是 apache cookie 而我使用的是 java.net cookie ......

这是我尝试过的:

当我在下一次应用启动时检索 cookie 时:

cookie 已添加到 cManager 但服务器无法识别。我相信存在某种解析问题。有人得到解决方案吗?

0 投票
1 回答
826 浏览

ssl - 如何使用来自另一个 jar 的资源加载密钥库。

我的问题是:我有两个由 maven 构建的罐子。一个 jar 包含一个逻辑,该逻辑包装来自 jave.net.ssl 的一些类,以在 URL 中的方案为 https 时发出 https 请求:获得 HttpsUrlConnection 后,我将获得 SSLSocketFactory,如下所示:

请注意 secConfig.getSslTrustStore() 部分,因为它包含传递给此方法的 InputStream,在从 jar 的类中获取它之后,该类是包含上述代码的父类。获取InputStream如下:

资源定位成功,获得InputStream。但是在第一个片段上执行 trustStore.load() 时,我收到奇怪的异常,说 KeyStoreFormat 无效。KeyStoreFormat 是有效的 - 这是肯定的 - 因为当我从包含此 prepareSSLSocketFactory 的 jar 执行测试方法并加载相同的密钥库文件但位于当前 jar 的资源中时,根本没有例外,并且客户端通过 ssl 成功通信。

因此,我的观察如下:如果我从位于执行方法 prepareSSLSocketFactory 的 jar 中的密钥库资源中加载提供 InputStream 的 trustore,则它可以工作,但是如果另一个 jar 负责将 InputStream(带有密钥库)提供给包含 prepareSSLSocketFactory() 的依赖 jar - 它抛出异常。不知道如何处理它。

请注意,我已经通过调用检查了提供资源的类和包含 prepareSSLSocketFacory 的类是否由同一个 ClassLoader 加载:

this.getClass().getClassLoader().equals(HttpConnector.class.getClassLoader()) - 没关系。

从提供密钥库 InputStream 的类到底层的 https 请求生成类。

但是我不知道是否有可能,HttpConnector.class.getClassLoader() 返回的 ClassLoader 不是加载最后在运行时使用的 HttpConnector 的那个。

0 投票
1 回答
3764 浏览

java - 为什么 HttpsURLConnection.getServerCertificates() 在 Java6 和 Java7 中返回不同的结果?

我有这样的代码:

在 Java 6 上针对特定网站运行此代码,我得到的证书与 Java 7 不同。假设主机名是 abc.myhost.com。

在 Java6 上我得到:

在 Java7 上,我得到:

如果我打印出有效日期,那也是不同的。和序列号一样。这些是不同的证书。

在 Java 7 上看起来不错;在 Java 6 上,我在主机名和 CN 之间存在分歧。证书看起来不对。

该服务器完全有可能在代理后面。该服务器的所有者(我正在从事的项目中的合作伙伴)也有可能最近更改了证书。可能有 2 个证书,一个在代理服务器上,一个在代理服务器后面的服务器上。我让他们调查这个。

我的问题是,为什么我不能在 Java7 上得到与在 Java6 上相同的结果?Java 改变了什么HttpsURLConnection.getServerCertificates()


对于好奇的人,这只是一种诊断工作。真正的错误是:

这种情况下的问题通常是证书中的主机名和 CN 不一致。我已经验证了分歧,但仅限于 Java 6。我想了解为什么 Java6 和 Java7 不同。


编辑Python 2.7.1 脚本返回与 Java6 相同的证书。 SSLConnection.get_peer_cert()向我显示 CN 不匹配的证书。

0 投票
1 回答
6344 浏览

android - Android 4.x 中的 SSL 客户端身份验证

我想创建一个连接到服务器的应用程序。此服务器使用 SSL 客户端身份验证。应用程序的用户应该能够选择证书并允许使用它,就像它在浏览器应用程序中实现一样。

在浏览器应用程序中,身份验证按预期工作,因此我使用的证书是有效的。

当我尝试在我的应用程序中连接时,出现以下错误:

我试图按照我的实现的 android 文档。

这是我的示例活动的代码:

异常被抛出urlConnection.getInputStream();

这是服务器和客户端之间握手的捕获。 SSL 握手的网络捕获

感谢您的任何建议和提示。

0 投票
1 回答
1187 浏览

android - 当我尝试通过 HttpsUrlConnection 发送帖子时出现意外的 IOException

我的 Android 代码一直在发送数据,它似乎一直在工作,直到抛出一个完全意外的 IOException,冻结一切。我不明白为什么我可以毫无问题地发送多个帖子请求,直到出现异常,几乎是随机的。这是我的代码:

我再说一遍:代码一直有效,直到多次发送后,然后由于 IO 异常而崩溃。此外,服务器很好,我的代码有问题。

这是整个错误堆栈跟踪:

0 投票
1 回答
1683 浏览

android - 带有自定义证书的 Android https 连接

我想使用位于 p12 包中的自定义证书进行 https 连接。我已经在 iPhone 上做过了(所以我可以验证,证书、服务器等一切都很好),但是 Android 有一些问题。

我遵循了如何请求需要客户端证书进行身份验证的 URL,但结果出现以下异常:

12-13 12:32:44.545: W/System.err(4407): javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: 找不到证书路径的信任锚。12-13 12:32:44.545: W/System.err(4407): 在 org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:374) 12-13 12:32:44.545: W/System.err(4407): 在 libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209) 12-13 12:32:44.545: W/System.err(4407): 在 libcore.net.http .HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478) 12-13 12:32:44.545: W/System.err(4407): 在 libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433) 12-13 12:32:44.545: W/System.err(4407): 在 libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java: 856) 12-13 12:32:44.555: W/System.err(4407): 由: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: 找不到证书路径的信任锚。12-13 12:32:44.560: W/System.err(4407): 在 org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:192) 12-13 12:32:44.560: W/System.err(4407): 在 org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:163) 12-13 12:32:44.560: W/System.err(4407):在 org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:573) 12-13 12:32:44.560: W/System.err(4407): 在 org.apache.harmony.xnet。 provider.jsse.NativeCrypto.SSL_do_handshake(本机方法)12-13 12:32:44.560:W/System.err(4407):在 org.apache.harmony.xnet。provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:371) 12-13 12:32:44.560: W/System.err(4407): ... 18 更多 12-13 12:32:44.560: W/System。错误(4407):原因:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚。12-13 12:32:44.560: W/System.err(4407): ... 23 更多

我的连接代码如下所示:

干杯,马尔辛

0 投票
0 回答
828 浏览

android - Android HttpsUrlConnection 在同一毫秒内重复请求

我有个问题。我只见过一次。我的代码算法设计为只请求一次。但是服务器收到了两次请求。我必须提出一个解决方案。
我想,这个问题喜欢这个 url但我找不到关于 httpurlconnection 的任何东西(错误或问题)?

设备的Android版本为4.0.3,连接方式为GET。

0 投票
0 回答
264 浏览

java - java客户端应用程序中的2路相互协商

我正在尝试为在线购物创建 java 桌面应用程序。到目前为止,我可以使用 httpsurlconnect 登录、选择产品并选择结帐。但结帐网站重定向到银行支付网关后。而且我总是得到响应,无法在重定向后处理您的请求。我认为这是因为支付网关使用双向相互协商(不确定)。那么如何根据第四个请求创建双向相互协商。

我在互联网上做了一些研究。我发现它需要 keystore.jks 和 truststore.jks。我假设 JDK 带有可以接受服务器证书的 CA 信任库。我需要带有客户端密钥和证书的 keystore.jks 文件。如果我创建自签名证书,服务器会接受它吗?服务器用户经过验证的 CA 证书,我无法控制服务器。如何获取客户端 keystore.jks 并在第四次请求时实现握手。下面给出了我的实现的示例代码。

连接方法: