我正在尝试通过 Java 邮件 API 连接到使用带有自签名证书的 StartTLS 的邮件服务器。这似乎是一个问题,因为我找不到任何方法来为 StartTLS 设置接受的证书或信任库。
Properties props = new Properties();
props.put("mail.imap.starttls.enable", "true");
props.put("mail.imap.starttls.required", "true");
Session session = Session.getInstance(props);
Store store = session.getStore("imap");
store.connect(hostName, port, userName, userPassword);
当我按原样运行我的应用程序时,我收到此 PKIX 路径错误:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
我宁愿不使用 VM 参数,"-Djavax.net.ssl.trustStore"
因为我希望能够控制每次访问的受信任证书。
旁注:我见过人们使用"mail.imap.socketFactory.class"
自SocketFactory
定义的TrustManager
. 但是当我这样做时,我的连接失败了
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
我认为这是因为设置套接字工厂实际上将使用 SMTP over SSL 而不是 StartTLS(它以纯文本连接开始,稍后切换到 TLS)。