当前位置: 首页 > 知识库问答 >
问题:

为HTTPSURLConnection设置TLS协议

严恩
2023-03-14

我需要对使用TLS协议连接的F5机器工作。为此,我构建了一个使用HTTPsURLConnection对象的类。

m_httpsConnection = (HttpsURLConnection) m_url.openConnection();

然后,我下载了F5证书文件,使用JDK密钥工具创建密钥库,并使用它尝试将连接设置为使用TLS协议:

        InputStream in = new FileInputStream(new File("c:/temp/F5keystore"));
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        ks.load(in, "changeit".toCharArray());
        in.close();
        
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(ks);
        X509TrustManager defaultTrustManager = (X509TrustManager)tmf.getTrustManagers()[0];
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, new TrustManager[] {defaultTrustManager}, null);
        SSLSocketFactory sslSocketFactory = context.getSocketFactory();
        
        ((HttpsURLConnection) m_httpsConnection).setSSLSocketFactory(sslSocketFactory);

(我没有被你抓住……)

代码似乎在快速传递,但是当我这样做的时候:

OutputStream os = m_httpsConnection.getOutputStream();

我得到。。。

“javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径”

现在,我在c:\temp下有一个密钥库文件F5keystore,为什么它找不到呢?。。

这真的是将TLS设置到连接的正确方法吗?现在我是在打开连接之后做的,虽然我可能认为应该在连接打开之前做。但是,连接仍然是空的。。。

根据您的要求,我在此添加更多信息:

C:\temp>keytool -v -printcert -file server.crt
Owner: EMAILADDRESS=root@localhost.localdomain, CN=localhost.localdomain, OU=MyOrg, O=MyCompany, L=Seattle, ST=WA, C=--
Issuer: EMAILADDRESS=root@localhost.localdomain, CN=localhost.localdomain, OU=MyOrg, O=MyCompany, L=Seattle, ST=WA, C=--

Serial number: 90f9d7e288ae6a77
Valid from: Fri Nov 07 08:20:36 IST 2014 until: Mon Nov 04 08:20:36 IST 2024
Certificate fingerprints:
         MD5:  C1:BE:43:9B:8B:C3:AA:F7:F2:BF:E6:06:08:42:18:17
         SHA1: 12:36:01:30:14:68:1C:C9:7D:7B:32:75:C6:08:86:E9:36:AD:CF:AA
         Signature algorithm name: SHA1withRSA
         Version: 3

Extensions:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: AA B6 71 94 D1 CB ED DF   1B 38 66 12 70 94 AA 76  ..q......8f.p..v
0010: 68 DF 2A 16                                        h.*.
]
]

#2: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

#3: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: AA B6 71 94 D1 CB ED DF   1B 38 66 12 70 94 AA 76  ..q......8f.p..v
0010: 68 DF 2A 16                                        h.*.
]

[EMAILADDRESS=root@localhost.localdomain, CN=localhost.localdomain, OU=MyOrg, O=MyCompany, L=Seattle, ST=WA, C=--]
SerialNumber: [    90f9d7e2 88ae6a77]
]

共有1个答案

游安康
2023-03-14

我明白,实际上我可以绕过证书问题,继续我的活动。所以我用这个来实现这个旁路。

 类似资料:
  • 问题内容: 我读了一篇 将透明地协商SSL连接的文章。 官方文件说: 此类使用HostnameVerifier和SSLSocketFactory。这两个类都有默认的实现。[ 1 ] 这是否意味着一旦您打开与 它已经被SSL / TLS加密了,没有更多麻烦了吗? 如何查看和设置标准实施的TLS版本?(对于Java 8应该是TLS 1.2,对于Java 7应该是TLS 1.0) 参考文献 甲骨文公司(

  • 我从这里使用了SSLSocketFacory: http://blog.dev-area.net/2015/08/13/Android-4-1-enable-tls-1-1-and-tls-1-2/ 我通过以下示例成功地实现了这一点: 更新:我修改了我的代码如下: 我使用了SSL工厂的以下实现 公共类NoSSLv3SocketFactory扩展SSLSocketFactory{私有最终SSLSoc

  • 根据下面的代码,如何将协议设置为TLSv1.2、TLSv1、SSLv3? 使用SoapUi,我可以使用以下配置请求服务:-dSOAPUI.https.protocols=TLSv1.2,TLSv1,SSLv3 使用CXF,我得到一个“javax.net.ssl.SSLHandShakeException:没有适当的协议(协议被禁用或密码套件不适当)” 很抱歉我对Soap和SSL的知识很差...

  • 我们有一个使用Mule standalone 3.5的应用程序(我知道…)需要强制它使用TLS 1.1或1.2作为HTTPS。 我们已经升级到最新的Java 8(8u112)。我们已经修改了mule的tls默认值。包括以下内容: 我们的HTTPS GET请求结果出现异常: 没有合适的协议(协议被禁用或密码套件不合适)(javax.net.ssl.SSLHandshakeException) 有没有

  • 我们使用UnboundID(不幸的是应该很快升级的旧版本)。 我想为SSL连接上的LDAP配置多个TLS协议:TLSv1、TLSv1.1、TLSv1.2。 如何配置多个TLS协议?

  • 问题内容: 正常的方式来获得的将是初始化一个新的用,并和使用方法。但是,这不允许我启用所需的密码套件或协议。 唯一允许进行此类更改的配置是通过设置其默认值。我可以创建一个类来扩展和覆盖方法,并包装创建的套接字以设置所需的密码和协议。但是,此方法不允许我为连接初始化a 吗? 有没有我可以同时做的方法-设置密码套件和协议并初始化信任管理器? 问题答案: 将获取的取为并将其包装在的自定义子类中,该子类委