【问题标题】:configuring SSLContext using existing SSL key/certificate pair in java (JSSE API)在 java (JSSE API) 中使用现有的 SSL 密钥/证书对配置 SSLContext
【发布时间】:2023-03-14 04:00:01
【问题描述】:

我正在开发一个 Java 项目,我应该在该项目中在服务器端实现 SSL 协议。这是我第一次在我的应用程序中使用 SSL,所以我阅读了很多关于 SSL/TLS 的内容,现在我想用 Java 实现一些东西。我将使用 JSSE API 来实现这个过程:

  1. 客户端将连接到我

  2. 我将使用我的公钥证书进行身份验证。我的意思是我会给客户端发一个公钥和对应的证书

  3. 客户端使用我的公钥和 RSA 算法加密密钥并将其发送给我

我已经将私钥和证书保存在我计算机上的密钥库中。所以我很犹豫如何从我的 Java 应用程序访问它们。我不知道,访问它们的步骤是什么,因为这是我第一次处理这种东西

我将使用SSLEngine。所以我应该先用这段代码初始化一个SSLContext

// First initialize the key and trust material.
KeyStore ksKeys = KeyStore.getInstance("JKS");
ksKeys.load(new FileInputStream("/.../myKey"), passphrase);
KeyStore ksTrust = KeyStore.getInstance("JKS");
ksTrust.load(new FileInputStream("/../myCertificate"), passphrase);

sslContext = SSLContext.getInstance("TLS");
sslContext.init( kmf.getKeyManagers(), tmf.getTrustManagers(), null);
// We're ready for the engine.
SSLEngine engine = sslContext.createSSLengine(hostname, port);

// Use as client
engine.setUseClientMode(true);

我对密码学真的很陌生,这是我第一次编写这些东西。有什么想法吗?

【问题讨论】:

  • 你还有私钥在哪里?为什么所有这些东西都没有在密钥库中?
  • 我知道。我在这个领域真的很新。我至少知道通往他们的道路。我应该使用 InputStream 来读取它们,然后将它们加载到我的 Keystore 中吗?
  • 方法对吗?
  • 真的很抱歉。我说我不知道​​为什么?我的电脑上有它们(我至少知道它们的路径)
  • 他们是如何到达那里的?魔法?谁生成了私钥?以什么格式?谁产生了企业社会责任?谁签的?签名证书及其签名者链是如何提供的?

标签: ssl public-key-encryption public-key jsse


【解决方案1】:

在服务器上,公钥及其证书与原始私钥一起进入 KeyStore,都在同一个别名下。

如果证书是自签名的,您需要将其从那里导出到客户端的信任库中。

您无需为此编写代码。只需设置系统属性:

javax.net.ssl.keyStore
javax.net.ssl.keyStorePassword
javax.net.ssl.trustStore

视情况而定。

【讨论】:

  • 证书不是自签名的。那么我应该将公钥和证书发送给客户端,以便它可以识别我吗?
  • 如果您再次仔细阅读我的回答,您会发现如果您的证书不是自签名的,我没有指定任何必需的操作,
【解决方案2】:

困惑之后,我做了很多研究,我找到了解决方案。首先,我将描述情况,然后我将给出解决问题的步骤。就像我在帖子中所说的那样,我有私钥(.key-file)和证书(.cer 文件),我需要在我的 java 应用程序(使用 ssl 协议的服务器)中使用它们。因此,第一步要做的是创建一个名为.jks 的密钥库,其中包含证书/密钥,以便我可以将它们用于您的基于 java 的服务器。为此,我使用了此链接http://blog.jgc.org/2011/06/importing-existing-ssl-keycertificate.html

中描述的步骤

现在,我如何在上面发布的代码中使用 my.jks 文件?

这是一段如何初始化 SSLEngine 的代码:

char [] keyphrase="xxx".toCharArray();
char [] passphrase= "yyy".toCharArray();

// First initialize the key and trust material.
KeyStore ksKeys = KeyStore.getInstance("JKS");
InputStream readStream = new FileInputStream(new File("/.../file.jks"));
ks.load(readStream, passphrase );
// create an factory for key-managers
KeyManagerFactory   =KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, keyphrase);
SSLContext sslContext = SSLContext.getInstance("TLS");
//initialize the ssl-context
sslContext.init(kmf.getKeyManagers(),null,null);
// We're ready for the engine.
SSLEngine engine = sslContext.createSSLEngine(host, port);
// Use as client
engine.setUseClientMode(true);

【讨论】:

  • 正如我在回答中已经说过的,您不需要为此编写代码。您可以使用系统属性完成所有操作。
  • 好的。是的,我知道。这对我来说是新的。我已经使用此链接stackoverflow.com/questions/5871279/java-ssl-and-cert-keystore 来了解它。我遇到的第一个问题(在我的帖子中)是如何获取 .jks 文件,因为没有 .jks 格式我无法使用这些材料。谢谢你的建议
猜你喜欢
  • 2014-02-09
  • 2013-08-02
  • 2013-01-02
  • 2015-11-24
  • 2010-10-28
  • 1970-01-01
  • 2011-08-17
  • 2014-05-06
  • 1970-01-01
相关资源
最近更新 更多