Str*_*kop 5 java jakarta-mail starttls
我正在尝试通过 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);
Run Code Online (Sandbox Code Playgroud)
当我按原样运行应用程序时,出现以下 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
Run Code Online (Sandbox Code Playgroud)
我不想使用虚拟机参数,"-Djavax.net.ssl.trustStore"因为我希望能够控制每次访问的可信证书。
旁注:我见过人们使用"mail.imap.socketFactory.class"自定义SocketFactory的TrustManager. 但是当我这样做时,我的连接失败了
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
Run Code Online (Sandbox Code Playgroud)
我认为这是因为设置套接字工厂实际上将使用基于 SSL 的 SMTP,而不是 StartTLS(它以纯文本连接启动,稍后切换到 TLS)。
我可以使用com.sun.mail:javax.mail:1.5.5从(不是那么标准的)pfx 文件加载的(根)证书来进行 SMTP 连接(不是 IMAP)。给出的属性按以下方式构建(另请参阅此处和此处Session.getInstance(props)的 API 文档,我认为您可以简单地替换为大多数属性):
"mail.transport.protocol", "smtp"
"mail.smtp .host","主机名"
smtpimap
"mail.smtp.port", "25"
"mail.smtp.connecttimeout", "5000" // 5 秒
"mail.smtp.timeout", "50000" // 50 秒
"mail .smtp.ssl.protocols", "TLSv1.2"
"mail.smtp.starttls.required", "true"
com.sun.mail.util.MailSSLSocketFactory现在使用(阅读链接中的 API 文档)
构建 SSL 套接字工厂:MailSSLSocketFactory sslSocketFactory = new MailSSLSocketFactory("TLSv1.2");
创建并初始化(默认)KeyManagerFactory kmf(例如通过加载密钥库)。
创建并初始化一个(默认)TrustManagerFactory tmf。
致电sslSocketFactory.setKeyManagers(kmf.getKeyManagers())并sslSocketFactory.setTrustManagers(tmf.getTrustManagers())
实例属性“mail.smtp.ssl.socketFactory”并将其设置sslSocketFactory使用props.put(k,v)- 方法)。请注意,设置的是创建和配置的套接字工厂实例,而不是某个字符串或类。Javamail将直接使用设置的套接字工厂实例。
使用属性来创建会话。
确保您已正确配置日志记录并将其设置为 com.sun.mail 的 TRACE。日志记录准确地显示了什么是“越线”,在我的例子中显示例如:
DEBUG com.sun.mail.smtp - Found extension "STARTTLS", arg ""
...
TRACE com.sun.mail.smtp.protocol - STARTTLS
TRACE com.sun.mail.smtp.protocol - 220 Ready to start TLS
附带说明:创建默认密钥库和 trustore 可以使用此类SslUtils、方法loadKeyStore(null)和createDefaultTrustStore()(我不久前创建了此实用程序类来帮助我加载不那么标准的 pfx 文件)。
| 归档时间: |
|
| 查看次数: |
8280 次 |
| 最近记录: |