0

私のアプリケーションでは、org.springframework.mail.javamail.JavaMailSenderImpl が SSL メールを送信するように構成されていません ( https://javamail.java.net/nonav/docs/api/com/sun/mail/smtpによるデフォルト値) /package-summary.htmlは false)。

そうは言っても、この JavaMail API を介して送信されるメールには 2 種類あります。1 つはマルチパート/相対で準備され、もう 1 つはプレーン テキストです。開発サーバーにデプロイすると、両方のメールが正常に送信されます。しかし、別の開発サーバー (ステージ サーバー) ではマルチパート メールの送信に失敗します。

アプリケーションは Tomcat6 にデプロイされ、JDK 1.6 で実行されます。

Tomcat サーバー用に構成されたキーストアで使用可能なすべての秘密鍵と証明書をデバッグしました (Web アプリケーションは HTTPS で実行されます)。これは良さそうです (キーストアを置き換えるオプションも検討しました)。

メールを送信すると、失敗したメールにはJavaメールAPIからの以下のデバッグがあります

DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "8570-5cb30915t8.tb.bbossyyy.com", port 25, isSSL     false
220 8570-5CB30915T8.TB.bbossyyy.com ESMTP SubEthaSMTP null
DEBUG SMTP: connected to host "8570-5cb30915t8.tb.bbossyyy.com", port: 25

EHLO hqarchs01
250-8570-5CB30915T8.TB.bbossyyy.com
250-8BITMIME
250-AUTH LOGIN
250 Ok
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN"
DEBUG SMTP: Found extension "Ok", arg ""
DEBUG SMTP: use8bit false
MAIL FROM:<dfn@bbossyyy.com>
250 Ok
DEBUG SMTP: sendPartial set
RCPT TO:<rp@bbossyyy.com>
250 Ok
RCPT TO:<rp@bbossyyy.com>
250 Ok
RCPT TO:<archo@bbossyyy.com>
250 Ok
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   RP <rp@bbossyyy.com>
DEBUG SMTP:   RP <rp@bbossyyy.com>
DEBUG SMTP:   archo@bbossyyy.com
DATA
354 End data with <CR><LF>.<CR><LF>
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
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)

送信が成功するように、以下にデバッグ ステートメントを示します。

DEBUG: getProvider() returning    javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "8570-5cb30915t8.tb.bbossyyy.com", port 25, isSSL     false
220 8570-5CB30915T8.TB.bbossyyy.com ESMTP SubEthaSMTP null
DEBUG SMTP: connected to host "8570-5cb30915t8.tb.bbossyyy.com", port: 25

EHLO hqarchs01
250-8570-5CB30915T8.TB.bbossyyy.com
250-8BITMIME
250-AUTH LOGIN
250 Ok
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN"
DEBUG SMTP: Found extension "Ok", arg ""
DEBUG SMTP: use8bit false
MAIL FROM:<archo@bbossyyy.com>
250 Ok
DEBUG SMTP: sendPartial set
RCPT TO:<jmi@bbossyyy.com>
250 Ok
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   John Mirabile <jmirabile@bbossyyy.com>
DATA
354 End data with <CR><LF>.<CR><LF>
Date: Wed, 4 Jun 2014 18:06:15 -0400 (EDT)
From: ArchO <archo@bbossyyy.com>
To: JM <jm@bbossyyy.com>
Message-ID: <1680495420.11401919575021.JavaMail.svcaoadmin@hqarchs01>
Subject: PO # 88636 Approval
MIME-Version: 1.0
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit

<html>
  <head>
  <title>PO Approval</title>
  <style>
  * {
      font-family:Tahoma,Arial,Verdana,Helvetica,sans-serif;
      font-size:10pt;
  }
  </style>
  </head>
  <body>
    ------------------------------
  </body>
</html>
.
250 Ok
QUIT
221 Bye

さらに、スローされる例外は org.springframework.mail.MailSendException であり、ネストされた原因は通常の SSL ハンドシェイク例外のものです

    Caused by: 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   
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
        at java.net.URL.openStream(Unknown Source)
        at javax.activation.URLDataSource.getInputStream(Unknown Source)
        at javax.activation.DataHandler.writeTo(Unknown Source)
        at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1350)
        at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:845)
        at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:361)
        at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:85)
        at javax.activation.ObjectDataContentHandler.writeTo(Unknown Source)
        at javax.activation.DataHandler.writeTo(Unknown Source)
        at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1350)
        at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1683)
        at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:585)
        ... 77 more
    Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target    
        at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
        at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
        at sun.security.validator.Validator.validate(Unknown Source)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(Unknown Source)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
        ... 101 more
    Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target  
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
        at java.security.cert.CertPathBuilder.build(Unknown Source)
        ... 107 more

また、sun.security.provider.certpath.SunCertPathBuilderException から AdjacencyList を取得して、sun.security.provider.certpath.BuildStep を取得し、getCertificate() メソッドを使用して証明書の詳細を出力しました。証明書は、Apache Tomcat サーバーで構成されたキーストアに従って有効なものでした。以下は、デバッグからの詳細です

    DEBUG :BS getFullString  :Certificate to be tried.
    Issuer:     CN=bbossyyyIssuingCA, DC=bbossyyy, DC=bbosstest, DC=com
    Subject:    
    SerialNum:  152a754f000000001177
    Expires:    Fri Apr 22 11:23:39 EDT 2016
    SubjKeyID:  KeyIdentifier [
    0000: 6D E0 32 B3 9E 7C 14 C3   14 B6 63 55 7F C7 4C CB  m.2.......cU..L.
    0010: 2C 48 F6 DC                                        ,H..
    ]
    AuthKeyID:  KeyIdentifier [
    0000: B8 21 48 97 A2 7B 0A A2   03 6F 35 4C 9D DB 38 AE  .!H......o5L..8.
    0010: 6E 3A 6B B6                                        n:k.
    ]
    Exception:  null
    Index:      1

    DEBUG :BS getIssuerName : CN=bbossyyyIssuingCA, DC=bbossyyy, DC=bbosstest, DC=com
    DEBUG :BS verboseToString : Certificate to be tried.
    Certificate contains:
    Issuer:     CN=bbossyyyIssuingCA, DC=bbossyyy, DC=bbosstest, DC=com
    Subject:    
    SerialNum:  152a754f000000001177
    Expires:    Fri Apr 22 11:23:39 EDT 2016
    SubjKeyID:  KeyIdentifier [
    0000: 6D E0 32 B3 9E 7C 14 C3   14 B6 63 55 7F C7 4C CB  m.2.......cU..L.
    0010: 2C 48 F6 DC                                        ,H..
    ]
    AuthKeyID:  KeyIdentifier [
    0000: B8 21 48 97 A2 7B 0A A2   03 6F 35 4C 9D DB 38 AE  .!H......o5L..8.
    0010: 6E 3A 6B B6                                        n:k.
    ]

    DEBUG :BS getSigAlgName : SHA256withRSA
    DEBUG :BS getSigAlgOID : 1.2.840.113549.1.1.11
    DEBUG :BS getType : X.509
    DEBUG :BS getIssuerAlternativeNames : null
    DEBUG :BS getNonCriticalExtensionOIDs : [2.5.29.14, 1.3.6.1.4.1.311.21.10, 1.3.6.1.4.1.311.21.7, 1.3.6.1.5.5.7.1.1, 2.5.29.31, 2.5.29.37, 2.5.29.35]
    DEBUG :BS getNotAfter : Fri Apr 22 11:23:39 EDT 2016
    DEBUG :BS getNotBefore : Wed Jun 04 16:34:29 EDT 2014
    DEBUG :BS getVersion : 3

この問題を解決するには、あなたの助けが必要です。これについてあなたの考えを求めてください。

編集..............

さらなる学習とコメントのため、以下のように再投稿します HTTPS 用に構成された Apache Tomcat サーバー 6.0 からインライン画像を含む電子メールを送信しようとしています。ターゲット SMTP サーバーには、信頼できる CA からの有効な証明書がありません。

これで、添付ファイルなしでメールをサーバーに正常に送信できます。また、HTTP (非セキュア) で実行している場合は、添付ファイル付きのメールを送信することもできます。しかし、Tomcat の HTTPS 構成から smtp サーバーにメールを送信できません。

メールの送信には Spring の JavaMailSenderImpl を使用しています。Mailsender の Bean 構成は次のとおりです。

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
  <property name="host"><value>${smtp.server}</value></property>
  <property name="javaMailProperties">
      <props>
          <prop key="mail.smtp.sendpartial">true</prop>
          <prop key="mail.debug">true</prop>
      </props>
  </property>
</bean>

以下に示すように、クライアントがサーバーへのデータ送信を開始するとすぐに例外が作成されます。

    DEBUG: JavaMail version 1.4ea   
    DEBUG: java.io.FileNotFoundException: C:\Program Files\Java\jre6\lib\javamail.providers (The system cannot find the file specified) 
    DEBUG: !anyLoaded   
    DEBUG: not loading resource: /META-INF/javamail.providers   
    DEBUG: successfully loaded resource: /META-INF/javamail.default.providers   
    DEBUG: Tables of loaded providers   
    DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc]}  
    DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]}    
    DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map 
    DEBUG: !anyLoaded   
    DEBUG: not loading resource: /META-INF/javamail.address.map 
    DEBUG: java.io.FileNotFoundException: C:\Program Files\Java\jre6\lib\javamail.address.map (The system cannot find the file specified)   
    DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]    
    DEBUG SMTP: useEhlo true, useAuth false 
    DEBUG SMTP: trying to connect to host "appsmtp.bobbsincyyy.com", port 25, isSSL false   
    220 hqxhubp15.fb.bobbsincyyy.com Microsoft ESMTP MAIL Service ready at Thu, 5 Jun 2014 13:47:10 -0400   
    DEBUG SMTP: connected to host "appsmtp.bobbsincyyy.com", port: 25   

    EHLO hqarchd01  
    250-hqxhubp15.fb.bobbsincyyy.com Hello [172.25.14.13]   
    250-SIZE 219901952  
    250-PIPELINING  
    250-DSN 
    250-ENHANCEDSTATUSCODES 
    250-AUTH    
    250-8BITMIME    
    250-BINARYMIME  
    250-CHUNKING    
    250-XEXCH50 
    250 XSHADOW 
    DEBUG SMTP: Found extension "SIZE", arg "219901952" 
    DEBUG SMTP: Found extension "PIPELINING", arg ""    
    DEBUG SMTP: Found extension "DSN", arg ""   
    DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""   
    DEBUG SMTP: Found extension "AUTH", arg ""  
    DEBUG SMTP: Found extension "8BITMIME", arg ""  
    DEBUG SMTP: Found extension "BINARYMIME", arg ""    
    DEBUG SMTP: Found extension "CHUNKING", arg ""  
    DEBUG SMTP: Found extension "XEXCH50", arg ""   
    DEBUG SMTP: Found extension "XSHADOW", arg ""   
    DEBUG SMTP: use8bit false   
    MAIL FROM:<df@bobbsincyyy.com>  
    250 2.1.0 Sender OK 
    DEBUG SMTP: sendPartial set 
    RCPT TO:<rp@bobbsincyyy.com>    
    250 2.1.5 Recipient OK  
    RCPT TO:<rp@bobbsincyyy.com>    
    250 2.1.5 Recipient OK  
    RCPT TO:<archo@bobbsincyyy.com> 
    250 2.1.5 Recipient OK  
    DEBUG SMTP: Verified Addresses  
    DEBUG SMTP:   RB <rp@bobbsincyyy.com>   
    DEBUG SMTP:   RB <rp@bobbsincyyy.com>   
    DEBUG SMTP:   archo@bobbsincyyy.com 
    DATA    
    354 Start mail input; end with <CRLF>.<CRLF>    
    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  
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)

http://springinpractice.com/2012/04/29/fixing-pkix-path-building-issues-when-using-javamail-and-smtpで利用できるかなり良い説明があります。しかし、これも機能しませんでした (smtp サーバーからの自己署名証明書が問題を引き起こす可能性があるかどうかはわかりません)。

また、トラストストア構成を使用して、javamail プロパティで STARTTLS を有効にしようとしました。それもうまくいきませんでした。

SMTP サーバーはイントラネット サーバーであり、外部に公開されません。したがって、基本的には、自己署名証明書を使用しても、この SMTP を信頼しても問題ありません。

これを達成する方法は?

4

3 に答える 3

0

これは、ポート 25 で接続していて、サーバーがそのポートで TLS をサポートしていないためだと強く思われます。STARTTLS サポートは、接続時にサーバーによって通知されないことに注意してください (250 接続メッセージ)。

おそらく、465 (SSL) または 587 (STARTTLS) のいずれかを使用する必要があります。

于 2014-06-04T23:40:30.630 に答える