###【自己解決しました】servletからjavax.mailを使ってgmailにメールを送りたい
現在、javax.mailの仕組みを利用してgmailに対してメールを送信する仕組みを構築しています。
mainメソッドからはメールが送信できることを確認しましたが、この仕組みをWebSphereServerに持って行ったところ、
下記のエラーが発生しました。
###発生している問題・エラーメッセージ
[ERROR ] CWPKI0022E: SSL ハンドシェークの失敗: SubjectDN CN=smtp.gmail.com, O=Google Inc, L=Mountain View, ST=California, C=US の署名者がターゲット・ホストから送信されました。 SSL 構成別名 defaultSSLConfig にあるローカル・トラストストア /Users/xxxx/wlp/usr/servers/xxxxx/resources/security/key.jks にこの署名者を追加する必要がある可能性があります。 SSL ハンドシェーク例外から送られた拡張エラー・メッセージは次のとおりです: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target [err] javax.mail.MessagingException: Could not convert socket to TLS; nested exception is: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target [err] at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1907)
###該当のソースコード
Java
1package com.xxxxx.module.mail; 2 3import java.io.IOException; 4import java.net.InetAddress; 5import java.net.Socket; 6import java.security.cert.X509Certificate; 7 8import javax.net.SocketFactory; 9import javax.net.ssl.SSLContext; 10import javax.net.ssl.SSLSocketFactory; 11import javax.net.ssl.TrustManager; 12import javax.net.ssl.X509TrustManager; 13 14/** 15 * DummySSLSocketFactory 16 */ 17public class DummySSLSocketFactory extends SSLSocketFactory { 18 private SSLSocketFactory factory; 19 20 public DummySSLSocketFactory() { 21 try { 22 SSLContext sslcontext = SSLContext.getInstance("TLS"); 23 sslcontext.init(null, new TrustManager[] { new X509TrustManager() { 24 public void checkClientTrusted(X509Certificate[] cert, String authType) { 25 // everything is trusted 26 } 27 28 public void checkServerTrusted(X509Certificate[] cert, String authType) { 29 // everything is trusted 30 } 31 32 public X509Certificate[] getAcceptedIssuers() { 33 return new X509Certificate[0]; 34 } 35 } }, null); 36 factory = (SSLSocketFactory) sslcontext.getSocketFactory(); 37 } catch (Exception ex) { 38 // ignore 39 } 40 } 41 42 public static SocketFactory getDefault() { 43 return new DummySSLSocketFactory(); 44 } 45 46 public Socket createSocket() throws IOException { 47 return factory.createSocket(); 48 } 49 50 public Socket createSocket(Socket socket, String s, int i, boolean flag) throws IOException { 51 return factory.createSocket(socket, s, i, flag); 52 } 53 54 public Socket createSocket(InetAddress inaddr, int i, InetAddress inaddr1, int j) throws IOException { 55 return factory.createSocket(inaddr, i, inaddr1, j); 56 } 57 58 public Socket createSocket(InetAddress inaddr, int i) throws IOException { 59 return factory.createSocket(inaddr, i); 60 } 61 62 public Socket createSocket(String s, int i, InetAddress inaddr, int j) throws IOException { 63 return factory.createSocket(s, i, inaddr, j); 64 } 65 66 public Socket createSocket(String s, int i) throws IOException { 67 return factory.createSocket(s, i); 68 } 69 70 public String[] getDefaultCipherSuites() { 71 return factory.getDefaultCipherSuites(); 72 } 73 74 public String[] getSupportedCipherSuites() { 75 return factory.getSupportedCipherSuites(); 76 } 77}
###試したこと
問題点は、SSLが秘密鍵を求めていることでした。
SSLはTrustManagerというクラスの中で秘密鍵を求めています。
そこで上記のダミーのSSLSocketFactoryを用意し、TrustManagerを求められる場所でX509TrustManagerインターフェイスをimplementした匿名クラスを作成し、そこで各メソッドをoverrideして秘密鍵を求めないように変更しました。
java
1 Properties props = new Properties(); 2 props.put("mail.smtp.host", "smtp.gmail.com"); 3 props.put("mail.smtp.socketFactory.port", "587"); 4// props.put("mail.smtp.socketFactory.class", "javax.net.SocketFactory"); 5 props.put("mail.smtp.ssl.socketFactory.class","com.xxxxx.module.mail.DummySSLSocketFactory"); 6 7 props.put("mail.smtp.auth", "true"); 8 props.put("mail.smtp.port", "587"); 9 props.put("mail.smtp.ssl.enable", "false"); 10 props.put("mail.smtp.starttls.enable", "true"); 11 props.put("mail.smtp.ssl.trust", "smtp.gmail.com"); 12
結果、秘密鍵を求められることなくgmailでの送信が可能になりました。
ご協力ありがとうございました。
###補足情報(言語/FW/ツール等のバージョンなど)
・MacOS
・Java8
・製品名: WebSphere Application Server 製品バージョン: 16.0.0.3
あなたの回答
tips
プレビュー