2011-06-30 106 views
89

我有一個java complied包來與網絡上的https服務器通信。運行編譯給出以下例外:無法識別的SSL消息,明文連接?異常

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? 
    at com.sun.net.ssl.internal.ssl.InputRecord.handleUnknownRecord(Unknown Source) 
at com.sun.net.ssl.internal.ssl.InputRecord.read(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.https.HttpsURLConnectionImpl.connect(Unknown Source) 

我認爲這是由於與客戶機建立的連接不安全。有沒有辦法配置本地機器或端口以連接到遠程https服務器?

回答

131

我覺得這是由於連接 與客戶機建立的是 不安全。

這是由於您正在與HTTP服務器而不是HTTPS服務器通話。可能您沒有使用HTTPS的正確端口號。

+1

我有同樣的錯誤,我開始使用http而不是https時解決了。但是,當我將鏈接放在瀏覽器中時,它可以工作!我需要執行安全的查詢。關於如何解決問題的任何想法? – rsy

+5

@rsy當你'用https'放置鏈接'時,瀏覽器已經改變爲你的端口443。你可以自己做同樣的事情。事實上,如果你根本沒有指定端口,'HttpURLConnection'會自動爲你做。 – EJP

+0

這只是一次嘗試。完美解決方案 – MAC

13
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? 

你應該有一個本地SMTP域的名稱,將聯繫該郵件服務器,並建立一個新的連接,以及你應該改變SSL財產編程下面

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection 

props.put("mail.smtp.socketFactory.fallback", "true"); // Should be true 
+3

他說的是HTTPS,而不是SMTP。 -1 – EJP

+1

在我的情況下,工作,謝謝! javax.mail.MessagingException:無法連接到SMTP主機:郵件。livemusicgo.com,端口:25; 嵌套的異常是: javax.net.ssl.SSLException:無法識別的SSL消息,明文連接? – surfealokesea

7

我得到了同樣的錯誤在通過代理執行POST請求之前,當我忘記登錄到公司防火牆時發出消息。

+0

雖然我在公司內部,但我必須這樣做! – MonoThreaded

2

我得到了同樣的錯誤。這是因爲我使用http訪問https端口。當我將http更改爲https時,問題得以解決。

+3

不,您在通過HTTPS訪問HTTP端口時發生錯誤。閱讀錯誤消息。你連接到一個明文目標。你描述的情況不會導致SSLException,因爲你不會使用SSL。 – EJP

-3

也許您的默認證書已過期。要通過管理控制檯進行更新,請轉到「安全> SSL證書和密鑰管理>密鑰存儲區和證書> NodeDefaultKeyStore>個人證書」,然後重新啓動WAS後選擇「默認」別名並單擊「更新」。

+1

已過期的證書rdies不會導致此異常。 – EJP

1

我在構建在Jdevelop 11.1.1.7 IDE中的Java應用程序面臨同樣的問題。我通過取消選中使用代理表單項目屬性來解決問題。

您可以在以下位置找到它: 項目屬性 - >(從左開始)運行/調試/配置文件 - >從右側面板單擊(編輯) - >左側面板中的工具設置 - >取消選中代理)選項。

-3

如果你在命令行Java 6的運行的Java進程或更早版本,加入這個開關解決了上面我的問題:

-Dhttps.protocols =「的TLSv1」

+0

不,它沒有。它解決了一個不同的問題。 – EJP

0

由於EJP說,這是一個消息顯示,因爲一個非HTTPS協議的調用。 如果您確定它是HTTPS,請檢查您的繞過代理設置,並在您的webservice主機url添加到繞過代理列表

0

它現在對我有效,我已經改變了我的谷歌帳戶的設置如下:

 System.out.println("Start"); 
     final String username = "[email protected]"; 
     final String password = "************"; 

     Properties props = new Properties(); 
     props.put("mail.smtp.auth", "true"); 
     props.put("mail.smtp.host", "smtp.gmail.com"); 
     props.put("mail.smtp.port", "465"); 
     props.put("mail.transport.protocol", "smtp"); 
     props.put("mail.smtp.starttls.enable", "true"); 
     props.put("mail.smtp.starttls.enable", "true"); 
     props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 

     Session session = Session.getInstance(props, 
        new javax.mail.Authenticator() { 
        protected PasswordAuthentication getPasswordAuthentication() { 
         return new PasswordAuthentication(username, password); 
        } 
        }); 


     try { 
      Transport transport=session.getTransport(); 
      Message message = new MimeMessage(session); 
      message.setFrom(new InternetAddress("[email protected]"));//formBean.getString("fromEmail") 
      message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("[email protected]")); 
      message.setSubject("subject");//formBean.getString(
      message.setText("mailBody"); 
      transport.connect(); 
      transport.send(message, InternetAddress.parse("[email protected]"));//(message); 

      System.out.println("Done"); 

     } catch (MessagingException e) { 
      System.out.println("e="+e); 
      e.printStackTrace(); 
      throw new RuntimeException(e); 

     } 

雖然我已經啓用了SSL和TSL在此link同一職位上運行程序時。我花了很多時間,但比我意識到並找到了這個鏈接。 並完成2以下步驟,並在谷歌設置控制。:

  • 禁用兩步驟驗證(密碼和OTP)

  • 啓用以允許訪問不夠安全的應用(允許不夠安全的應用: ON

現在我可以使用上述程序發送郵件。

+0

問題是關於HTTPS。 – EJP

0

添加此作爲答案,因爲它可能會在稍後幫助某人。我不得不強制jvm使用IPv4堆棧來解決錯誤。我的應用程序曾用於在公司網絡中工作,但在家中連接時,它給出了相同的例外。沒有涉及代理。添加了jvm參數 -Djava.net.preferIPv4Stack=true和所有https請求的行爲正常。

0

如果連接是FTPS試驗:

FTPSClient ftpClient =新FTPSClient(協議,假);

protocol = TLS,SSL 和false = isImplicit。

-1

另一個原因可能是「訪問被拒絕」,也許你無法訪問URI並且收到阻止內部網絡訪問的響應頁面。如果您不確定您的應用程序區域是否需要防火牆規則,則嘗試從終端,命令行進行連接。 對於GNU/Linux或Unix,你可以嘗試像這樣運行命令,看看結果從治堵或真正的遠程地址來:echo | nc -v yazilimcity.net 443

0

如果您正在運行

  • 思科AnyConnect安全移動代理
  • 思科AnyConnect網絡安全代理

嘗試停止服務。

0

我得到了同樣的問題,它通過在系統屬性中設置「proxyUser」和「proxyPassword」得到解決。

System.setProperty("http.proxyUser", PROXY_USER); 
System.setProperty("http.proxyPassword", PROXY_PASSWORD); 

與 「ProxyHost的」 和 「proxyPort」

System.setProperty("http.proxyHost", PROXY_ADDRESS); 
System.setProperty("http.proxyPort", PROXY_PORT); 

希望它會工作一起。

相關問題