2011-07-01 17 views
5

के लिए जावामेल और ग्रीनमेल का उपयोग करना मैं एक परीक्षण लिखने की कोशिश कर रहा हूं जो जावामेल एसएमटीपी या एसएमटीपीएस का उपयोग एसएसएल के माध्यम से एक संदेश भेजने के लिए करेगा और Greenmail सर्वर पर प्रमाणीकरण का उपयोग कर रहा हूं।एसएमटीपीएस/एसएसएल

मैं एक त्वरित छोटे उप है कि मैं वास्तव में क्या चाहते कर रहा हूँ क्या करना चाहिए लिखा है:

Exception in thread "Thread-7" java.lang.RuntimeException: javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown 
    at com.icegreen.greenmail.smtp.SmtpHandler.run(Unknown Source) 
Caused by: javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.java:1293) 
    at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:65) 
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) 
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) 
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) 
    at java.io.InputStreamReader.read(InputStreamReader.java:167) 
    at java.io.BufferedReader.fill(BufferedReader.java:136) 
    at java.io.BufferedReader.readLine(BufferedReader.java:299) 
    at java.io.BufferedReader.readLine(BufferedReader.java:362) 
    at com.icegreen.greenmail.smtp.SmtpConnection.readLine(Unknown Source) 
    at com.icegreen.greenmail.smtp.SmtpHandler.handleCommand(Unknown Source) 
    ... 1 more 
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1720) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:954) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:632) 
    at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59) 
    at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202) 
    at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:272) 
    at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:276) 
    at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:122) 
    at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:212) 
    at java.io.BufferedWriter.flush(BufferedWriter.java:236) 
    at java.io.PrintWriter.flush(PrintWriter.java:276) 
    at com.icegreen.greenmail.util.InternetPrintWriter.println(Unknown Source) 
    at com.icegreen.greenmail.util.InternetPrintWriter.println(Unknown Source) 
    at com.icegreen.greenmail.smtp.SmtpConnection.println(Unknown Source) 
    at com.icegreen.greenmail.smtp.SmtpHandler.sendGreetings(Unknown Source) 
    ... 1 more 
Exception in thread "main" javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 3465; 
    nested exception is: 
    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.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1934) 
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:638) 
    at javax.mail.Service.connect(Service.java:295) 
    at MailTest.main(MailTest.java:35) 
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(Alerts.java:174) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1649) 
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241) 
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:235) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1206) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136) 
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593) 
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:893) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1165) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1149) 
    at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:507) 
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:238) 
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1900) 
    ... 3 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(PKIXValidator.java:323) 
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:217) 
    at sun.security.validator.Validator.validate(Validator.java:218) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1185) 
    ... 13 more 
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174) 
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238) 
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:318) 
    ... 19 more 

मैं देख कोशिश की है:

import java.util.Properties; 

import javax.mail.Session; 
import javax.mail.Transport; 

import com.icegreen.greenmail.user.GreenMailUser; 
import com.icegreen.greenmail.util.GreenMail; 

public class MailTest { 
    public static void main(String[] args) throws Exception { 
     GreenMail greenmail = new GreenMail(); 
     try { 
      greenmail.start(); 

      String email = "[email protected]"; 
      String userid = "user"; 
      String password = "pa$$word"; 
      GreenMailUser setUser = greenmail.setUser(email, userid, password); 
      setUser.create(); 
      GreenMailUser user = greenmail.getManagers().getUserManager().getUser(userid); 
      System.out.println("User created:" + user.getEmail() + ":" + user.getLogin() + ":" + user.getPassword()); 

      int portSmtps = greenmail.getSmtps().getPort(); 
      System.out.println("Smtps started on port:" + portSmtps); 

      Properties props = new Properties(); 
      props.put("mail.smtp.starttls.enable", "true"); 
      props.put("mail.smtp.auth", "true"); 
      props.put("mail.smtp.host", "localhost"); 
      props.put("mail.smtp.socketFactory.port", portSmtps); 
      props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
      props.put("mail.smtp.socketFactory.fallback", "false"); 
      Session session = Session.getInstance(props); 
      Transport transport = session.getTransport("smtp"); 
      transport.connect("localhost", portSmtps, userid, password); 
      System.out.println("Transport is connected: " + transport.isConnected()); 
     } finally { 
      greenmail.stop(); 
     } 
    } 
} 

मेरे समस्या यह है कि मैं कई अपवाद मिलता है

किसी भी सलाह के लिए लंबे समय तक पद और अग्रिम धन्यवाद के लिए खेद है।

+0

एसएसएल एक निश्चित विश्वास मॉडल है कि यह प्रमाणपत्र-आधारित प्रमाणीकरण के लिए उपयोग करता है। आप हमें एसएमटीपीएस सर्वर प्रमाण पत्र के बारे में क्या बता सकते हैं? शायद यह आत्म हस्ताक्षरित है? –

उत्तर

12

आप इस तरह अपने GreenMail सर्वर शुरू कर देना चाहिए:

Security.setProperty("ssl.SocketFactory.provider", DummySSLSocketFactory.class.getName()); 
GreenMail mailServer = new GreenMail(ServerSetupTest.SMTPS); 
mailServer.start(); 
+1

बहुत बढ़िया! यह मेरे लिए काम किया। – Sunny

1

ग्रीनमेल सर्वर पर उपयोग किए गए एसएसएल प्रमाणपत्र को "ज्ञात" प्रमाण पत्र प्राधिकरण द्वारा हस्ताक्षरित किया जाना चाहिए, या आपको सीए प्रमाण पत्र जोड़ना होगा जिसका प्रयोग जावा के कीस्टोर में प्रमाण पर हस्ताक्षर करने के लिए किया गया था। ज्ञात सीए तक प्रमाणपत्र श्रृंखला को मान्य नहीं करने के लिए जावा को बताने का कोई तरीका नहीं है।