我正在尝试在java应用程序中设置相互SSL身份验证。服务器端(Websphere Liberty)配置正确(使用openssl测试)但是java客户端应用程序失败并出现'java.io.EOFException:SSL peer shutdown错误'。
经过一番调查后,我发现X509KeyManager没有选择任何客户端证书发送回服务器。尽管服务器从服务器的信任库发送了3个发布者的列表(包括与客户端私钥相关的列表),但密钥管理器的chooseClientAlias(...)始终返回null。但是,如果创建自定义密钥管理器并从chooseClientAlias(...)返回正确的别名,则握手成功完成。
为什么密钥管理器不选择别名?哪些规则正在使用?
这是服务器的信任:
Keystore type: jks
Keystore provider: IBMJCE
Your keystore contains 3 entries
bssuat, Apr 5, 2017, trustedCertEntry,
Certificate fingerprint (SHA1): 2F:EA:2C:86:95:DF:08:CC:F1:84:39:94:1C:BF:7D:33:1B:77:49:AE
*.somecloud.com, Aug 17, 2017, trustedCertEntry,
Certificate fingerprint (SHA1): D5:99:95:84:0A:87:0C:AC:4E:4B:38:4E:5C:A2:43:11:EF:59:F7:E6
stag.somecloud.com, Aug 17, 2017, trustedCertEntry,
Certificate fingerprint (SHA1): 11:5C:40:40:98:AA:87:80:5B:87:17:A7:38:B7:BB:DC:32:38:45:6D
客户的密钥库:
Keystore type: jks
Keystore provider: IBMJCE
Your keystore contains 1 entry
stag.somecloud.com, 22-Aug-2017, keyEntry,
Certificate fingerprint (SHA1): 11:5C:40:40:98:AA:87:80:5B:87:17:A7:38:B7:BB:DC:32:38:45:6D