我们希望购买通配符SSL证书,因为我们有很多子域。但是我不知道Java是否信任通配符证书。当人们通过SSL连接到我们的API时,我们不足以迫使我们通信的所有第三方将我们的SSL证书添加到他们的本地信任库中。Java可以连接到通配符ssl
目前,我面临着从java可信任颁发者购买通配符证书或每个子域购买多个证书的两难困境。
其他语言是否也有信任存储?如果有的话,是否有人知道通配符证书是否也适用于他们。
我们希望购买通配符SSL证书,因为我们有很多子域。但是我不知道Java是否信任通配符证书。当人们通过SSL连接到我们的API时,我们不足以迫使我们通信的所有第三方将我们的SSL证书添加到他们的本地信任库中。Java可以连接到通配符ssl
目前,我面临着从java可信任颁发者购买通配符证书或每个子域购买多个证书的两难困境。
其他语言是否也有信任存储?如果有的话,是否有人知道通配符证书是否也适用于他们。
我用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的
但是,该代码应该与原始问题的通配符SSL证书一起使用?当我在带有通配符证书的服务器上尝试此代码时,我得到一个SSLHandshakeException,因为验证路径失败。 – 2011-02-21 08:10:58
@Petri Pellinen它使用verisign证书为我工作了一个有效的域。使用自签名证书可能会少一些。当使用旧版本的Java 6时,现代证书也需要中间证书。(根据我的测试) – Wes 2011-02-21 13:07:04
感谢您的澄清 – 2011-03-11 09:47:34
Sun的JSSE中的默认实现不支持通配符。您需要编写自己的X509TrustManager来处理通配符。
但是,自从Java 5以来,Java支持SAN(主题备选名称)。如果您的名称少于20个,您可以为它们获取一个证书。它可能比通配证书更便宜。
它的一个不错的一条信息,这是对我很有用。 – Allen 2012-02-17 03:36:59
通配符ssl与信任所有证书完全不一样。通配符SSL是* .domain.com。这个问题也比其他问题大4岁。如果你愿意,可以关闭它,但它不是一回事。 – Wes 2014-10-24 07:56:01