メールには SMTP を使用し、メールの取得には imap (imap + ssl) を使用します。
私が行う接続方法の中で:
private Session connect(SMTPTask task) {
SSLSocketFactory factory = null;
try {
SSLContext ctx;
KeyManagerFactory kmf;
KeyStore ks;
char[] passphrase = "changeit".toCharArray();
ctx = SSLContext.getInstance("TLS");
kmf = KeyManagerFactory.getInstance("SunX509");
ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("truststore.jks"), passphrase);
kmf.init(ks, passphrase);
ctx.init(kmf.getKeyManagers(), null, null);
factory = ctx.getSocketFactory();
} catch (Exception e) {
log.error("Error with SSLFactory",e);
}
String host = getHost();
String port = String.valueOf(getPort());
Authenticator authenticator = new Authenticator(task);
Properties properties = new Properties();
properties.setProperty("mail.smtp.submitter", authenticator.getPasswordAuthentication().getUserName());
properties.setProperty("mail.smtp.auth", "true");
//properties.setProperty("mail.imap.auth.login.disable", "true");
properties.setProperty("mail.smtp.host", host);
properties.setProperty("mail.smtp.port", port);
properties.put("mail.imaps.ssl.socketFactory", factory);
properties.setProperty("mail.imap.port", "993");
Properties systemProps = System.getProperties();
systemProps.put( "javax.net.ssl.trustStore", "truststore.jks");
systemProps.put( "javax.net.ssl.trustStorePassword", "changeit");
System.setProperties(systemProps);
return Session.getInstance(properties, authenticator);
そして、私がする他の場所:
...
store.connect(getHost(),getUser(),getPass());
...
編集:そして、ここで次の例外が発生します:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
ここで、独自の証明書を持つカスタム トラストストアを追加したいと考えています。別の投稿では、Java でそれを行う方法を示しています:クライアント認証用のトラストストアを追加します。
しかし、どうすれば SSLSocketFactory をストアと組み合わせることができるでしょうか? では、私のストアはカスタム SSL 接続を使用していますか?
それを行う正しい方法は何ですか?それが不可能な場合、トラストストアをJavaのストアに追加する別の方法はありますか?
編集:何が欠けていますか、またはプロパティで何か間違ったことをしましたか?
よろしく