当前位置: 首页 > 知识库问答 >
问题:

私钥和公钥分开

平和雅
2023-03-14

我想在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 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() );} 

问题是我如何单独创建这些jks文件?publickey.jks文件是cert的,对吗?我如何才能从私钥在另一个文件中拥有它,并从CA签名?或者这是我可以在客户机/服务器之间建立连接的另一种方式?首先,我用openssl创建了CA,然后服务器端和客户端的两个jks文件包括证书和密钥。

共有1个答案

华哲茂
2023-03-14

你在这里设置的东西看起来相当原始和脆弱。JKS存储实际上是一个真正的痛苦工作,但它们是一些Java库将接受的全部,所以如果你被卡住,你就被卡住了。

http://www.javacodeGeeks.com/2014/07/java-keystore-tutorial.html

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

说到这里,我相信这段代码:

http://docs.oracle.com/javase/7/docs/api/java/security/keystore.html

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

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

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

但是,如果您所问的是“我如何获得在CA上签名所需的东西,使其与我的私钥分离,从而使我不必随身携带私钥?”-这是个很好的问题。答案是CSR(证书签名请求),它是一个自签名的信息块,仅包括公钥和您希望CA在签名证书时使用的一堆信息。在关键工具中做的方法是:

keytool -certreq -alias mydomain -keystore keystore.jks -storepass password -file mydomain.csr
keytool -import -trustcacerts -alias mydomain -file mydomain.crt -keystore keystore.jks -storepass password
 类似资料:
  • 问题内容: 我以编程方式创建了jks类型(即默认类型)的Java密钥库。 它最初是空的,所以我创建了DSA证书。 如何查看公钥和私钥? 即有一个命令可以打印我的证书的私钥? 我只能从我的理解中找到哪个可以整体打印证书: 我认为这是整个证书。如何通过keytool查看私钥(或公钥)? 问题答案: 您在密钥库中创建了一个私有(和关联的公共)密钥。要使其真正可用,可以让它由认证机构(CA)签名- 因为这

  • 我一直在阅读一些RSA文献和堆栈溢出问题,但我没有得到明确的答案。 仅给定一个RSA私钥模和私钥指数,这是我所拥有的全部(也足够用于所有密码相关操作),我能得到相关的公钥模和公钥指数吗? 另外,我是否可以仅用这两个参数获得私钥的编码形式?我在java中尝试了以下方法(java不是实际的请求),但是支持它的OpenSSL引擎失败,错误为:04000090:RSA例程:openSSL_internal

  • Auth0提供了两个JWT库,一个用于Node:Node jsonwebtoken,另一个用于Java:Java JWT。事实证明,JavaJWT不支持公钥/私钥对。 然而,另一个java库jjwt库声称支持该特性。但是,该文档没有显示如何在jjwt中使用自己的公钥/私钥对。 我创建了私有/公钥对,并在Node中成功地使用了node-jsonwebToken: 但是我发现在Java中用JWT无法做

  • 我试图理解使用带有私钥/公钥(RS512)的JSON Web令牌的逻辑,当将从客户端(在本例中是React Native App)发送到服务器的数据有效载荷签名时。 我认为私钥/公钥的全部意义在于将私钥保持为私钥(在我的服务器上),并将公钥交给成功登录应用程序的人。 我认为,对于我的服务器的每个API请求,经过身份验证的应用程序用户将使用公钥创建JWT(在客户端),服务器将使用私钥验证来自API请

  • 我使用secp192r1曲线生成了ECC公钥和私钥。公共密钥数组长度为75,私有密钥数组长度125。为什么私钥比公钥长?为什么私钥的长度不是公钥的两倍?为什么由于secp192r1私钥不是192位=24字节?

  • 我想通过RSACryptServiceProvider签名和验证数据 为此,我需要公钥和私钥。 在我的项目中,我将公钥和私钥存储在XML文件中。 有一次,我生成了我的公钥和私钥 在上面,我展示了“通过公钥验证数据” 我的SignData方法类似。 在那里, 我的问题是:举个例子,我认识到;通过crt/pem/cert等导入公钥和私钥。证书文件。在那里我存储了XML文件。 我的解决方案错了吗? 第二