在 java (JSSE API) 中使用现有的 SSL key/certificate 对配置 SSLContext

configuring SSLContext using existing SSL key/certificate pair in java (JSSE API)

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

实现这个过程
  1. 客户端将连接到我

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

  3. 客户端使用我的 public 密钥和 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);

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

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

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

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

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

视情况而定。

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

中描述的步骤

现在,如何在上面发布的代码中使用 my.jks-file?

好吧,这是一段如何初始化 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);