我已经解决了这个问题,但无法弄清楚我们为什么需要它。我创建了一个自签名的SSL证书,并在我的Android设备上进行测试。我已将其存储在keystore
中,并将其用作
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(context.getAssets().open("self.jks"), "password".toCharArray());
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
它工作正常,即我从服务器得到正确的响应。我的密钥库看起来像这样
Keystore type: BKS
Keystore provider: BC
Your keystore contains 1 entry
Alias name: ca
Creation date: Apr 22, 2017
Entry type: trustedCertEntry
Owner: CN=92.168.10.11,E=email@gmail.com,O=Self,L=Islamabad,C=PK
Issuer: CN=92.168.10.11,E=email@gmail.com,O=Self,L=Islamabad,C=PK
Serial number: f2b8e66caa28f0da
Valid from: Tue Apr 18 19:29:45 PKT 2017 until: Wed Apr 18 19:29:45 PKT 2018
Certificate fingerprints:
MD5: 2A:46:42:A8:7B:10:21:19:5F:B0:E2:A8:A1:BF:76:D3
SHA1: 6A:18:AE:C7:4A:46:77:23:63:6B:8F:B8:40:46:49:47:67:30:5A:D5
SHA256: B9:83:1A:D7:92:72:77:C2:88:AE:37:34:B4:70:31:94:C4:4E:03:7E:23:96:63:0C:00:E4:7F:35:B9:67:12:97
Signature algorithm name: SHA256WithRSAEncryption
Version: 1
*******************************************
*******************************************
虽然我所关注的书有如下关键词
Alias name: asynchronous_client
Entry type: PrivateKeyEntry
Certificate[1]:
Owner: C=UK,ST=Birmingham,L=Birmingham,O=Packt Publishing,OU=Packt
Publishing,CN=asynchronous_client
Issuer: C=UK,…,CN=packt
Certificate[2]:
Owner: C=UK,…,CN=packt
Alias name: ca
Entry type: trustedCertEntry
Owner: C=UK,…,CN=packt
Issuer: C=UK,…,CN=packt
他们同时拥有私钥和证书。我想知道
如果一切正常,没有它,为什么他们需要私钥呢? 如果我们确实需要它,它将如何在SSL握手中使用?
答案 0 :(得分:1)
如果一切正常,没有它,为什么他们需要私钥呢?如果我们确实需要它,它将如何在SSL握手中使用?
客户端不需要服务器私钥来执行SSL握手。这不仅是不必要的,而且是安全问题,因为如果服务器以外的任何人都拥有密钥的副本,则可以代表服务器行事,例如,一个中间人。私钥不应该与其所有者的其他任何人一起使用。
在这种情况下,您应该仅向客户端提供服务器证书(或包含它的密钥库)。