SSL证书交换密钥库与信任库

时间:2020-06-16 07:19:16

标签: ssl smtp ssl-certificate client-certificates starttls

我有一个常规用例,其中我必须向Java smtp服务器验证常规客户端,才能使客户端向我的smtp服务器发送邮件。现在,我想在此环境中启用STARTTLS。我知道有很多关于此的文章,我确实阅读了所有内容,但仍然有些东西对我没有作用。这是我的问题:

(如果以下任何信息有误,请纠正我)

要成功进行SSL握手,我们需要密钥库和信任库。

基本密钥库->我们拥有公用密钥和专用密钥以及证书(基本上是用来标识自己的方式)

信任存储->基本上是另一个密钥存储,但是在这里,我们存储受信任实体的公钥或证书。

现在,为了成功地对服务器进行客户端身份验证,我想在服务器上使用我的自签名证书。为此,我们需要:

服务器->应该具有密钥库(私有+公钥)+信任库(包含客户端的公钥)

客户端->密钥库(包含客户端的私钥和公钥)+信任库(服务器的证书)

在这里,我很困惑的是,客户端也需要密钥库吗?或仅客户端拥有服务器的公共证书就足够了。

如果到目前为止所有方法都正确,这就是我面临的问题:

我有两个单独的Eclipse Java项目。第一个是具有嵌入式smtp库的服务器。第二个Java项目具有一些Java邮件代码,用于将邮件发送到此smtp服务器。

我使用keytool创建了一个证书。但这是事情。在服务器端,我使用的是

private void setSystemPropertiesForSSLConnection() {
    System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "debug");
    System.setProperty("javax.net.ssl.keyStore", "C:/store/keystore.jks");
    System.setProperty("javax.net.ssl.keyStorePassword", "mypassword");
}

如您所见,尽管上面我们说我需要信任客户机的公共证书,但我没有指定任何信任库。

此外,在客户端,我在java邮件部分中具有以下代码:

Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.debug", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.host", host);
    props.put("mail.smtp.port", "25000");

现在是这种情况,正如您在我的客户端中看到的那样,我没有任何密钥库或信任库规范,但是如果运行代码,则使用javamail成功发送邮件。但是,信任库和密钥库发生了什么?为什么只有在服务器端有密钥库时才可以使用。因为我没有添加公共证书。服务器或客户端指定的客户端,客户端如何信任服务器?

0 个答案:

没有答案