Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有自签名证书的Java SSL连接,无需将完整密钥库复制到客户端_Java_Servlets_Ssl_Https_Keytool - Fatal编程技术网

具有自签名证书的Java SSL连接,无需将完整密钥库复制到客户端

具有自签名证书的Java SSL连接,无需将完整密钥库复制到客户端,java,servlets,ssl,https,keytool,Java,Servlets,Ssl,Https,Keytool,我正在用Java和一个客户端应用程序设置一个许可servlet,该客户端应用程序将发布新许可证的请求,并在该服务器上验证现有许可证。servlet在Tomcat中运行。我已经配置了Tomcat,因此它只允许通过https连接到servlet,这很好 我已经使用'keytool-genkey-alias www.mysite.com-keyalg RSA-keystore license.store'创建了一个自签名证书,它创建了一个文件license.store,并用密码asdf1234将tom

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

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

当我尝试在Java中通过https从客户端连接到servlet时,我收到了熟悉的
PKIX路径构建失败
,因为证书不在信任库中。我尝试使用建议修复此问题,结果出现以下代码:

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());
这将导致成功连接


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

您不应该生成一个公私密钥对,而是应该将服务器的证书导入您(客户端)的Java信任库。证书不是秘密,因此不会在客户端带来安全风险。请参阅keytool的
-import
选项。这里是一个.

示例,您不应该生成一个公私密钥对,而是应该将服务器的证书导入到您(客户机)的Java信任库中。证书不是秘密,因此不会在客户端带来安全风险。请参阅keytool的
-import
选项。这是一张单张。

我终于拿到了!问题是,我首先必须从keystore导出证书:keystore-export-alias www.mysite.com-file license.cer-keystore license.store,然后使用keystore-import-alias where-file license.cer-keystore client.store将导出的证书导入新的keystore。然后将client.store复制到客户端,该客户端在密钥库中读取,如上面的示例所示。我终于得到了它!问题是,我首先必须从keystore导出证书:keystore-export-alias www.mysite.com-file license.cer-keystore license.store,然后使用keystore-import-alias where-file license.cer-keystore client.store将导出的证书导入新的keystore。然后将client.store复制到客户机,并在密钥库中读取,如上面的示例所示。