SSL与Java运行时证书

SSL与Java运行时证书,java,ssl,runtime,Java,Ssl,Runtime,我有一个java项目,每个安装中都有一个服务器和一个客户机。连接应牢固。服务器部分是跨平台的(包括Android),因此使用Keytool或openssl生成密钥不是一个选项 由于将有很多服务器,我不能只生成一个证书并包含它,因为这样每个服务器都将具有相同的证书(当然,自签名) 因此,理想情况下,我希望在服务器第一次启动时使用纯java在运行时生成证书,因为我不能使用任何外部工具 请提供实际实施的例子。您也可以选择其他方法或建议。这里有一些您想要的 //Build a blank keystor

我有一个java项目,每个安装中都有一个服务器和一个客户机。连接应牢固。服务器部分是跨平台的(包括Android),因此使用Keytool或openssl生成密钥不是一个选项


由于将有很多服务器,我不能只生成一个证书并包含它,因为这样每个服务器都将具有相同的证书(当然,自签名)

因此,理想情况下,我希望在服务器第一次启动时使用纯java在运行时生成证书,因为我不能使用任何外部工具


请提供实际实施的例子。您也可以选择其他方法或建议。

这里有一些您想要的

//Build a blank keystore with a password
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
char[] password = "some password".toCharArray();
ks.load(null, password);

//Sample key storage
javax.crypto.SecretKey mySecretKey;
KeyStore.SecretKeyEntry skEntry =
    new KeyStore.SecretKeyEntry(mySecretKey);
ks.setEntry("secretKeyAlias", skEntry, 
    new KeyStore.PasswordProtection(password));

//Update the keystore file
fos = new java.io.FileOutputStream("keystorefilename");
ks.store(fos, password);

但是,您需要使用BouncyCastle创建证书并导入它。还有。

这个问题阅读评论也没有多大意义。
即使您在第一次安装时动态生成密钥库(这是可能的,例如通过Bouncy Castle),您也需要将其存储在文件系统中,以便下次重新启动。

如果客户端要对服务器进行身份验证,则需要接收与信任库中相同的证书(而不是根据您的操作在每次重新启动时新生成的证书)这在您的案例中是一个困难的部分,因为您没有使用知名发行人的证书,并且必须手动将受信任的证书导入客户端的信任库。

“由于将有很多服务器,我不能只生成一个证书并将其包括在内,因为这样每个服务器都将具有相同的证书。”-为什么会出现问题?服务器和客户端都是免费下载的,因此任何人都可以访问客户端的私钥。让服务器生成自己的证书为客户端提供绝对零安全性。你需要重新考虑你的需求:它根本不安全。没有人会给你一个实际实现的例子。那是你的工作,确实如此。这一要求根本不安全。服务器安装程序需要生成自己的证书。