gpt4 book ai didi

java - 使用 URL.openConnection() 建立 HTTPS 连接

转载 作者:搜寻专家 更新时间:2023-10-30 19:46:36 24 4
gpt4 key购买 nike

我正在尝试与 server 建立 HTTPS 连接证书设置为 2013 年 4 月到期并使用 GlobalSign 作为根证书。

HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
// urlConnection.setSSLSocketFactory(sslSocketFactory);
urlConnection.setDoOutput(true);
urlConnection.setChunkedStreamingMode(0);

// Send the POST data
OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
out.write(postParamString.toString().getBytes("UTF8"));

// Read the reply
InputStream in = urlConnection.getInputStream();

就目前而言,这会抛出 javax.net.ssl.SSLHandshakeException: org.bouncycaSTLe.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature.getOutputStream() 被调用。

同一站点和证书在原装 HTC 网络浏览器和桌面浏览器中有效。当我使用相同的代码访问 Google 时它有效(但随后提示 404 错误)。 StackOverflow 上的各种帖子暗示它应该“正常工作”,而其他人则说要设置您自己的 key 存储(或禁用所有 HTTPS 验证!)我认为行为的差异取决于使用的不同根 key 存储(任何人都可以澄清这一点?)。

我现在尝试使用充气城堡创建 key 存储,但我无法将其加载到我的设备上。

从 Firefox 导出证书后,我使用以下方法创建 keystore :

keytool.exe -import -alias onlinescoutmanager -file www.onlinescoutmanager.co.uk.crt -storetype BKS -keystore res\raw\keystore

然后使用以下方法在应用程序中加载和使用:

InputStream stream = context.getResources().openRawResource(R.raw.keystore);
// BKS seems to be the default but we want to be explicit
KeyStore ks = KeyStore.getInstance("BKS");
ks.load(stream, "www.onlinescoutmanager.co.uk".toCharArray());
stream.close();

TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
SSLContext context2 = SSLContext.getInstance("TLS");
context2.init(null, new TrustManager[] { defaultTrustManager }, null);
sslSocketFactory = context2.getSocketFactory();

keystore.Load() 被调用时,出现 java.io.IOException: Wrong version of key store. 失败。

我有ensured I'm passing -storetype BKS , used a <=7 character keystore password ,将 CA 证书添加到 keystore ,并使用 Bouncy CaSTLe 版本 1.45 和 1.47 创建 keystore ,报告的错误消息没有变化。

我的环境是 Eclipse Juno 4.2.1,在 Windows 8 上运行 JRE 1.7u9b5。我正在测试的设备是运行 Android 2.3 的 HTC 感觉。该应用程序的最低 SDK 版本为 7,目标为 15。

如果有人能解释如何在 Windows 8 上创建有效的 BKS key 存储或者我如何让 Java 使用与浏览器(或系统?)相同的 key 存储,我们将不胜感激。

您可以下载 entire project在撰写本文时,generated keystore如果需要的话。

最佳答案

感谢不同的人对此的提示,有很多事情都需要正确才能工作。

  1. 如果 HTTPS 站点的证书是由受信任的根证书签署的,那么它将开箱即用,无需自定义 SSLSocketFactory。受信任的根证书可能与浏览器使用的证书不同,因此不要假设如果它在 Android 网络浏览器中工作,那么它也会在您的应用程序中工作。
    如果它不是受信任的根证书,并且出现类似 javax.net.ssl.SSLHandshakeException: org.bouncycaSTLe.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature. 的异常,那么您需要创建并如下所示加载 keystore 。

  2. keystore 需要使用 Bouncy CaSTLe 提供程序 ( 1 ) 通过在 keytool 命令行上指定 -storetype bks 来生成。
    如果未正确安装 Bouncy CaSTLe,则会失败并出现各种异常,包括 java.security.KeyStoreException: BKS not found。如果 keystore 不是使用 Bouncy CaSTLe 提供程序创建的,那么您可能会得到 java.io.IOException: Wrong version of key store. 异常,导致与下一个案例混淆。

  3. 您需要使用适当版本(123)的 Bouncy CaSTLe 供应商。在大多数情况下,这似乎是 version 1.46 .
    这可以放在你的JRE的lib/ext/文件夹中,类名添加到lib/security/java.security,或者直接在命令行指定 key 工具。如果它是不兼容的版本(或存储类型),您将再次遇到类似 java.io.IOException: Wrong version of key store. 的异常。

  4. 您必须包括所有中介证书和根证书。如果有任何缺失,您将收到 javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 异常。

  5. 证书链必须是为了正确验证它们。如果不是,您将得到 javax.net.ssl.SSLHandshakeException: org.bouncycaSTLe.jce.exception.ExtCertPathValidatorException: IssuerName(CN=XYZ) does not match SubjectName(CN=ABC) of signing certificate. 或再次,通用 javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.我还没有找到在 key 商店订购它们的方法,所以求助于 doing it in code at runtime .

有人建议using a keystore password longer than 7 characters也会导致它失败,但这不是我发现的。

我认为这涵盖了我发现的每一个陷阱,但请随意扩展并添加相关问题的链接。

关于java - 使用 URL.openConnection() 建立 HTTPS 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14114480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com