2010-07-02 56 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