簡體   English   中英

無法握手具有端口587的SSL套接字和server =“ smtp.gmail.com”

[英]Cannot handshake ssl sockets having port 587 and server=“smtp.gmail.com”

此代碼對於PORT = 465可以正常工作。 但是對於PORT = 587,它將引發異常“線程主javax.net.ssl.SSLException中的異常:無法識別的SSL消息, 純文本連接?

package smtpClient;

import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;

import javax.naming.NamingException;
import javax.net.ssl.HandshakeCompletedEvent;
import javax.net.ssl.HandshakeCompletedListener;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;

class TLS_Mime_G {
    static final int PORT = 587;
    static String REMOTEHOST = "smtp.gmail.com";

    public static void main(String[] args)
            throws IOException, NoSuchAlgorithmException, NamingException, KeyManagementException {

        SSLSocketFactory ssf = (SSLSocketFactory) SSLSocketFactory.getDefault();
        SSLSocket socket = (SSLSocket) ssf.createSocket(REMOTEHOST, PORT);

        socket.setEnabledProtocols(socket.getSupportedProtocols());
        socket.setEnabledCipherSuites(socket.getSupportedCipherSuites());
        socket.addHandshakeCompletedListener(new MyTLSHandshakeListener());
        socket.startHandshake();//Throws Error 

        System.out.println("Connected to " + socket.getRemoteSocketAddress());

    }
}

class MyTLSHandshakeListener implements HandshakeCompletedListener {
    public void handshakeCompleted(HandshakeCompletedEvent e) {
        System.out.println("Handshake succesful!");
        System.out.println("Cipher suite used: " + e.getCipherSuite());

    }
}

/ *支持的協議:SSLv2Hello支持的協議:SSLv3支持的協議:TLSv1支持的協議:TLSv1.1支持的協議:TLSv1.2啟用的協議:TLSv1啟用的協議:TLSv1.1啟用的協議:TLSv1.2 * /

465是“隱式” TLS-以前的SSL; 您在TCP級別進行連接,然后立即始終啟動TLS連接,然后(如果成功)然后通過TLS(通過TCP)連接進行SMTP。

587是“顯式” TLS以前的SSL; 您可以在TCP級別進行連接,並通過閱讀服務器聲明並至少執行EHLO命令和響應(以及可能(可選地,其他),然后開始執行SMTP),然后執行STARTTLS命令並檢查響應,如果成功,則通過現有的TCP連接,然后(如果成功)然后通過基於TCP的TLS進行SMTP。 看看rfc 3207。

您的例外已經告訴您了; 這表示您已連接到尚未(但)正在執行SSL / TLS而是正在執行純文本的服務器(在本例中為SMTP為純文本)。

另外,啟用所有受支持的版本和密碼套件是一個非常糟糕的主意; 由於不安全,默認情況下禁用了它們中的許多。 盡管在這種特殊情況下SSLv3被POODLE(!)破壞了,但是沒關系,因為gmail(正確退出)永遠不會進行協商; OTOH啟用了ECDH_anon_AES *等匿名套件,使活躍的攻擊者可以輕松攔截,閱讀和/或更改您所謂的安全電子郵件。

或者只是使用javamail,它已經實現了所有這些選項,並且更加正確

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM