0

我正在用 Java 设置一个许可 servlet 以及一个客户端应用程序,该应用程序将发布新许可请求并验证该服务器上的现有许可。servlet 在 Tomcat 中运行。我已经配置了 Tomcat,以便它只允许通过 https 连接到 servlet,这工作得很好。

我创建了一个自签名证书,使用'keytool -genkey -alias www.mysite.com -keyalg RSA -keystore license.store'它创建一个文件license.store并将 tomcat 指向这个 keystoreFile 及其密码asdf1234

当我尝试通过 Java 中的 https 从客户端连接到 servlet 时,我收到了熟悉PKIX path building failed的信息,因为证书不在信任库中。我尝试使用建议解决此问题,导致以下代码:

private SSLSocketFactory getSSLFactory() throws Exception {

    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    InputStream is = this.getClass().getResourceAsStream("license.store");

    if(is ==null) {
        return null;
    }

    keyStore.load(is, "asdf1234".toCharArray());
    is.close();

    TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(keyStore);

    SSLContext ctx = SSLContext.getInstance("TLS");
    ctx.init(null, tmf.getTrustManagers(), null);

    return ctx.getSocketFactory();
}

之后我打电话:

HttpsURLConnection con = (HttpsURLConnection)url.openConnection();
con.setSSLSocketFactory(getSSLFactory());

这导致成功的连接。

现在的问题是,只有当我将它复制license.store到客户端并将其加载到KeyStore.load(). 将服务器使用的私钥及其密码复制到客户端并不是很安全。有没有办法只从 license.store 中提取公钥并使用它?我已经在这个论坛和其他论坛上搜索了一天,但似乎无法得到它。

4

1 回答 1

3

您不应该生成公私密钥对,而是将服务器的证书导入(客户端的)Java 信任库。证书不是机密,因此不会在客户端提供安全风险。请参阅-importkeytool 的选项。这是一个例子

于 2013-01-17T23:02:03.350 回答