尽管您可以通过构建PublicKey
和使用来使用较低级别的加密函数Cipher
,但值得考虑使用 JSSE:它将在套接字的上下文中提供所有这些。此外,SSL/TLS 提供的加密是通过在握手期间协商的共享密钥完成的(除其他外,它比非对称加密更快)。
您可以使用自签名证书构建一个信任库,用于预共享该公钥。您可以按如下方式加载它(注意InputStream
不一定是 a FileInputStream
,例如,您可以从内存中读取内容):
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance("JKS");
InputStream is = ...
ks.load(is, null);
// or ks.load(is, "thepassword".toCharArray());
is.close();
tmf.init(ks);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
SSLSocketFactory = sslContext.getSocketFactory();
// ...
这是使用 JSSE 的正常方式。如果您想将 SSL/TLS 与显式 RSA 公钥一起使用,则必须实现自己的TrustManager
做显式比较(而不是使用TrustManagerFactory
):这肯定会使代码更长更复杂。
如果你在一个小程序中运行所有这些,你可能仍然有关于小程序权限系统的问题,以建立套接字连接。请参阅小程序可以做什么和不能做什么。