我有一个常规用例,其中我必须向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成功发送邮件。但是,信任库和密钥库发生了什么?为什么只有在服务器端有密钥库时才可以使用。因为我没有添加公共证书。服务器或客户端指定的客户端,客户端如何信任服务器?