我采用了以下示例并移动了代码,以便更好地模拟实际的客户端和实际的服务器
- 服务器只能访问信任库文件
- 客户端只能访问客户端密钥库文件
至少在 TLS1v2 中,它是这样工作的。在我重新编写代码后,有两个 SSL 上下文(一个服务器端和一个客户端),它爆炸并且不起作用
javax.net.ssl.SSLHandshakeException: No available authentication scheme
我重新编写的代码现在是这样的
public SSLEngineSimpleDemo() throws Exception {
File baseWorkingDir = FileFactory.getBaseWorkingDir();
File keyStoreFile = FileFactory.newFile(baseWorkingDir, "src/test/resources/client2.keystore");
char[] passphrase = "123456".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(keyStoreFile), passphrase);
clientCtx = SSLContext.getInstance("TLS");
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, passphrase);
clientCtx.init(kmf.getKeyManagers(), null, null);
File trustStoreFile = FileFactory.newFile(baseWorkingDir, "src/test/resources/server2.keystore");
KeyStore ts = KeyStore.getInstance("JKS");
ts.load(new FileInputStream(trustStoreFile), passphrase);
serverCtx = SSLContext.getInstance("TLS");
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ts);
serverCtx.init(null, tmf.getTrustManagers(), null);
}
我有这样的代码可以在 TLS1v2 上运行,所以我不确定为什么在 TLS1v3 中,这不再工作了。
- 我在这里有什么问题?
- 我的假设是否正确,因为 trustStoreFile 是我的私有服务器密钥?
- 我的假设是否正确,因为 clientStoreFile 是我的公钥?
- 我的假设是否正确,因为服务器只需要私钥?
- 我的假设是否正确,因为客户端只需要公钥?
Java版本:/Library/Java/JavaVirtualMachines/jdk-11.0.5.jdk