完成后,当我将Java从8.0.6.15升级到8.0.6.25时,我遇到了一个问题,并且我对将调用的端点进行了测试连接;endpoint.server";我握手失败了。
除了升级之外,我没有更改任何内容,所以安全策略文件等仍然不变
当我检查日志时,我确实看到了一些奇怪的东西,那就是在ClientHello握手消息阶段:
"ClientHello": {
"client version" : "TLSv1.2",
"random" : "43 8B 8E 7E 3E 91 E9 9D 4A 1B 60 40 9B 42 AD ED 18 14 48 06 3E 84 4D A3 C4 F8 ED 8D DE 73 1A EA",
"session id" : "DD 61 0A ED B9 2D 52 DA EB 5C DF 1C 61 B3 73 49 9C 7C A4 CF C5 E2 1D 00 F5 24 B2 DB 5B 58 B0 94",
"cipher suites" : "[TLS_AES_256_GCM_SHA384(0x1302), TLS_CHACHA20_POLY1305_SHA256(0x1303), TLS_AES_128_GCM_SHA256(0x1301)]",
"compression methods" : "00",
"extensions" : [
"server_name (0)": {
type=host_name (0), value=endpoint.server
},
"supported_groups (10)": {
"versions": [secp256r1, secp384r1, secp521r1]
},
"signature_algorithms (13)": {
"signature schemes": [ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, ecdsa_secp521r1_sha512, rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_ps
s_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, ecdsa_sha1, rsa_pkcs1_sha1]
},
"signature_algorithms_cert (50)": {
"signature schemes": [ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, ecdsa_secp521r1_sha512, rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_ps
s_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, ecdsa_sha1, rsa_pkcs1_sha1]
},
"supported_versions (43)": {
"versions": [TLSv1.3]
},
"psk_key_exchange_modes (45)": {
"ke_modes": [psk_dhe_ke]
},
"key_share (51)": {
"client_shares": [
{
"named group": secp256r1
"key_exchange": {
0000: 04 ac 3a de da 54 45 3a 48 e2 95 d9 97 24 bd 38 .....TE.H......8
0010: cf bb e3 8c b9 98 e6 31 46 06 da 89 db 07 2e c7 .......1F.......
0020: 77 79 8d bc 39 8b 54 f8 a1 ab 27 1f 39 b2 6e aa wy..9.T.....9.n.
0030: be ae 5d 50 c1 19 69 4a 9f 60 20 1a 61 40 ba ce ...P..iJ....a...
0040: cf
}
},
]
}
]
}
如果我错了,请纠正我,但是,似乎它想使用以下密码:
[TLS_AES_256_GCM_SHA384(0x1302), TLS_CHACHA20_POLY1305_SHA256(0x1303), TLS_AES_128_GCM_SHA256(0x1301)]
这些密码适用于TLSv1.3,但根据以下内容,它使用的是TLSv1.2。
"client version" : "TLSv1.2"
我试图连接到的服务器";endpoint.server";仅支持TLSv1.2和以下密码:
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA265
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA265
就我所发现的而言,它不可能是有限/无限的安全策略文件,因为它们不会根据以下url在和之间更改:https://www.ibm.com/docs/en/sdk-java-technology/8?topic=guide-sdk安全策略文件#sdkpolicyfiles
我也尝试过这个设置:com.ibm.jsse2.overrideDefaultCSName,值分别为true和false,但没有任何作用
在java.security中,它使用以下设置:
jdk.certpath.disabledAlgorithms = [MD2, MD5, SHA1 jdkCA & usage TLSServer, RSA keySize < 1024, DSA keySize < 1024, EC keySize < 224]
jdk.tls.disabledAlgorithms = [SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, DESede, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, DES_CBC]
正如你所看到的,这里没有任何关于我禁用TLSv1.2的内容。
我还尝试了以下操作,即将版本8.0.6.15的java/jre/lib/security的完整文件夹复制到8.0.6.25。当我在这之后进行测试连接时,它就起作用了。
有人知道这两个版本在java/jre/lib/安全性方面有什么区别吗
据我所知,我之前说过,有限/无限安全策略文件不会根据给定的url进行更改。
我已经解决了这个问题,通过使用java 8.0.6.25编辑java.security文件,它看起来像:
security.provider.1=com.ibm.jsse2.IBMJSSEProvider2
security.provider.2=com.ibm.crypto.provider.IBMJCE
security.provider.3=com.ibm.crypto.plus.provider.IBMJCEPlus
security.provider.4=com.ibm.security.jgss.IBMJGSSProvider
security.provider.5=com.ibm.security.cert.IBMCertPath
security.provider.6=com.ibm.security.sasl.IBMSASL
security.provider.7=com.ibm.xml.crypto.IBMXMLCryptoProvider
security.provider.8=com.ibm.xml.enc.IBMXMLEncProvider
security.provider.9=com.ibm.security.jgss.mech.spnego.IBMSPNEGO
security.provider.10=sun.security.provider.Sun
我已将其更改为:
security.provider.1=com.ibm.jsse2.IBMJSSEProvider2
security.provider.2=com.ibm.crypto.provider.IBMJCE
security.provider.3=com.ibm.security.jgss.IBMJGSSProvider
security.provider.4=com.ibm.security.cert.IBMCertPath
security.provider.5=com.ibm.security.sasl.IBMSASL
security.provider.6=com.ibm.xml.crypto.IBMXMLCryptoProvider
security.provider.7=com.ibm.xml.enc.IBMXMLEncProvider
security.provider.8=com.ibm.security.jgss.mech.spnego.IBMSPNEGO
security.provider.9=sun.security.provider.Sun
出于某种原因,它想使用com.ibm.crypto.plus.provider.IBMJCEPlus,即使失败了,它也不会尝试其他方法,所以最简单的方法是从java.security文件中删除com.ibm.crypto.plus.previder.IBMJCEPlus。