Openssl 分别使用私钥和公钥

Openssl 分别使用私钥和公钥,openssl,java,Openssl,Java,我想在java中通过SSL/TLS建立客户机-服务器通信。服务器是多线程的。使用openssl,我充当自己的CA(为权威机构创建私钥和自签名证书)。现在我想为我的服务器和客户端创建密钥和证书,这些密钥和证书是从我创建的CA签名的 1) 我是否必须从提示符为每个客户端创建证书和密钥?还是另一种“自动化”方式,例如使用脚本 2) 我已经看到了用于设置密钥库的代码 private void setupClientKeyStore() throws GeneralSecurityException, I

我想在java中通过SSL/TLS建立客户机-服务器通信。服务器是多线程的。使用openssl,我充当自己的CA(为权威机构创建私钥和自签名证书)。现在我想为我的服务器和客户端创建密钥和证书,这些密钥和证书是从我创建的CA签名的

1) 我是否必须从提示符为每个客户端创建证书和密钥?还是另一种“自动化”方式,例如使用脚本

2) 我已经看到了用于设置密钥库的代码

private void setupClientKeyStore() throws GeneralSecurityException, IOException { clientKeyStore = KeyStore.getInstance( "JKS" ); clientKeyStore.load( new FileInputStream( "client1publickey.jks" ), "password".toCharArray() ); } private void setupServerKeystore() throws GeneralSecurityException, IOException { InputStream keyStoreResource = new FileInputStream("serverprivatekey.jks"); char[] keyStorePassphrase = "password".toCharArray(); serverKeyStore = KeyStore.getInstance("JKS"); serverKeyStore.load(keyStoreResource, keyStorePassphrase); } private void setupClientKeyStore()引发GeneralSecurityException,IOException { clientKeyStore=KeyStore.getInstance(“JKS”); load(新文件输入流(“client1publickey.jks”), “password.toCharArray()); } private void setupServerKeystore()引发GeneralSecurityException,IOException { InputStream keyStoreResource=新文件InputStream(“serverprivatekey.jks”); char[]keystrepassphrase=“password”.toCharArray(); serverKeyStore=KeyStore.getInstance(“JKS”); 加载(keyStoreResource、keystorePassphase); } 我已经运行了命令来查看这些条目的类型,client1publickey是一个TrustedCert条目,而serverprivatekey是一个PrivateKey条目。这段代码在我的服务器类上。我的客户机类上有这个代码

private void setupServerKeystore() throws GeneralSecurityException, IOException { serverKeyStore = KeyStore.getInstance( "JKS" ); serverKeyStore.load( new FileInputStream("serverpublickwy.jks"), "university".toCharArray() ); } private void setupClientKeyStore() throws GeneralSecurityException, IOException { clientKeyStore = KeyStore.getInstance( "JKS" ); clientKeyStore.load( new FileInputStream( "client1privatekey.jks" ), "university".toCharArray() );} private void setupServerKeystore()引发GeneralSecurityException,IOException{ serverKeyStore=KeyStore.getInstance(“JKS”); 加载(新文件输入流(“serverpublickwy.jks”), “大学”; } private void setupClientKeyStore()引发GeneralSecurityException,IOException{ clientKeyStore=KeyStore.getInstance(“JKS”); load(新文件输入流(“client1privatekey.jks”), “大学”
问题是如何分别创建这些jks文件?publickey.jks文件是cert,对吗?如何从私钥将其保存在另一个文件中并从CA签名?或者这是在客户端/服务器之间建立连接的另一种方式?首先,我用openssl创建了CA,然后服务器和客户端的两个jks文件包括证书和密钥。

您在这里设置的内容看起来相当原始和脆弱。JKS存储实际上是一个很难处理的问题,但它们都是一些Java库可以接受的,所以如果您被卡住了,您就被卡住了

这是一个关于keytool基础知识的相当不错的教程,keytool是操作密钥存储的标准方法。JKS文件可以具有密钥对&CSR、密钥对&signed cert或任意数量的证书。没有与之关联的密钥对

脚本 通常,我将这些脚本编写为命令行驱动的案例,它们是我需要执行的任何启动脚本的一部分。我的基本前提是,如果密钥对没有离开创建它的盒子,那么它是最安全的。因此,密钥对创建、密码设置和CSR生成是我在设置框时要注意的事情。使用open SSL或keytool,不仅可以编写密钥对和CSR设置的脚本,还可以将CSR发送到CA。如果您想完成整个过程,甚至可以编写脚本查询CA以获取签名证书

我倾向于在Java或JEE框架之外这样做。我使用任何适合我选择的操作系统的脚本机制

话虽如此,我相信这一准则:

提供如何在Java中设置JKS的示例

特别有趣的是,至少在Java7中,您可以使用PKCS12而不是JKS文件。PKCS12s是Java之外的默认版本,因此很高兴看到它们加入标准

信托商店 JKS文件或PKCS12也可以包含所有受信任证书的捆绑包。在大多数情况下,这是Hierarachy中的CA或CA集。这个信任存储可以大规模分布,为了简单起见,您可以将它放在您计划以这种方式配置的每台服务器的构建中。您可能还希望将包托管在可以轻松从任何服务器获取干净副本的位置

问题是如何分别创建这些jks文件?publickey.jks文件是cert,对吗?如何从私钥将其保存在另一个文件中并从CA签名?或者这是在客户端/服务器之间建立连接的另一种方式

好吧,我想你在这里失去我了

Java密钥存储的基本前提是,描述和签署密钥对公钥的证书与密钥对位于同一位置。任何实体(服务器或客户机)都需要正好1个JKS文件,该文件包含与其身份相关的所有信息,包括密钥对和证书

在这种特殊情况下,试图将它们分开长期存储对我来说没有多大意义

然而,如果你问的是“我如何在CA获得需要签名的东西,而不是私钥,这样我就不必随身携带私钥?”-这是一个很好的问题。答案是CSR(Certificate Signing Request,证书签名请求),它是一个自签名的信息块,仅包括公钥和一组您希望CA在签署证书时使用的信息。在密钥工具中执行此操作的方法是:

keytool -certreq -alias mydomain -keystore keystore.jks -storepass password -file mydomain.csr
最后你会在“mydomain.csr”中看到它

您将使用该证书从CA获取签名证书,然后使用以下内容上载证书:

keytool -import -trustcacerts -alias mydomain -file mydomain.crt -keystore keystore.jks -storepass password

我不明白你在问什么。您是否正在寻找一种自动化的方法来为每个客户机生成唯一的密钥库,以实现相互身份验证,并让他们通过您的服务获得荣誉?这正是我所寻找的!多谢各位