2010-07-02 78 views
6

我們希望購買通配符SSL證書,因爲我們有很多子域。但是我不知道Java是否信任通配符證書。當人們通過SSL連接到我們的API時,我們不足以迫使我們通信的所有第三方將我們的SSL證書添加到他們的本地信任庫中。Java可以連接到通配符ssl

目前,我面臨着從java可信任頒發者購買通配符證書或每個子域購買多個證書的兩難困境。

其他語言是否也有信任存儲?如果有的話,是否有人知道通配符證書是否也適用於他們。

+0

它的一個不錯的一條信息,這是對我很有用。 – Allen 2012-02-17 03:36:59

+1

通配符ssl與信任所有證書完全不一樣。通配符SSL是* .domain.com。這個問題也比其他問題大4歲。如果你願意,可以關閉它,但它不是一回事。 – Wes 2014-10-24 07:56:01

回答

2

我用java 6試過這個。

它看起來工作正常。我已成功從具有通配符SSL證書的文件中讀取標題和正文內容。

package com.example.test; 

import java.io.DataInputStream; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 
import java.util.Map.Entry; 


public class SSLTEST { 
    public static void main(String[] args) { 
     try { 
      URL url = new URL("https://test.example.com/robots.txt"); 
      URLConnection connection = null; 
      try { 
       connection = url.openConnection(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      Map<String, List<String>> fields = connection.getHeaderFields(); 
      Iterator<Entry<String, List<String>>> headerIterator = fields.entrySet().iterator(); 
      System.out.println("HEADERS"); 
      System.out.println("-------------------------------"); 
      while (headerIterator.hasNext()){ 
       Entry<String, List<String>> header = headerIterator.next(); 
       System.out.println(header.getKey()+" :"); 
       Iterator<String> valueIterator = header.getValue().iterator(); 
       while (valueIterator.hasNext()){ 
        System.out.println("\t"+valueIterator.next()); 
       } 

      } 

      String inputLine; 
      DataInputStream input = new DataInputStream(connection.getInputStream()); 
      System.out.println("BODY CONTENT"); 
      System.out.println("-------------------------------"); 
      while ((inputLine = input.readLine()) != null) { 
       System.out.println(inputLine); 
      } 


     } catch (MalformedURLException e) { 
      System.err.println(e); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

編輯我剛剛收到確認,這適用於Java 1.5的

+0

但是,該代碼應該與原始問題的通配符SSL證書一起使用?當我在帶有通配符證書的服務器上嘗試此代碼時,我得到一個SSLHandshakeException,因爲驗證路徑失敗。 – 2011-02-21 08:10:58

+1

@Petri Pellinen它使用verisign證書爲我工作了一個有效的域。使用自簽名證書可能會少一些。當使用舊版本的Java 6時,現代證書也需要中間證書。(根據我的測試) – Wes 2011-02-21 13:07:04

+0

感謝您的澄清 – 2011-03-11 09:47:34

6

Sun的JSSE中的默認實現不支持通配符。您需要編寫自己的X509TrustManager來處理通配符。

但是,自從Java 5以來,Java支持SAN(主題備選名稱)。如果您的名稱少於20個,您可以爲它們獲取一個證書。它可能比通配證書更便宜。

+0

我在考慮更多的外部團體連接到我們的API,而不是我們的Java代碼連接到通配符安全的子域。我將在問題中加入這一點,以確保其清晰。 – Wes 2010-07-05 08:25:53

+0

主機名驗證不在信任管理器中完成。 – Bruno 2012-01-05 18:19:33

+0

Java在2017年肯定支持通配符證書,甚至在java 6中也看到了其他答案。 – Wes 2016-09-29 12:07:45