Java可以连接到通配符ssl吗

Java可以连接到通配符ssl吗,java,ssl,wildcard,Java,Ssl,Wildcard,我们希望购买通配符SSL证书,因为我们有很多子域。但是我不知道Java是否信任通配符证书。当人们通过SSL连接到我们的API时,我们不足以强制所有与我们通信的第三方将SSL证书添加到他们的本地信任库中 目前,我面临着一个两难境地:从java可信发行人处购买通配符证书,还是每个子域购买多个证书 其他语言也有信任库吗?如果是这样的话,是否有人知道通配符证书也可以使用它们。Sun JSSE中的默认实现不支持通配符。您需要编写自己的X509TrustManager来处理通配符 但是,自Java5以来,J

我们希望购买通配符SSL证书,因为我们有很多子域。但是我不知道Java是否信任通配符证书。当人们通过SSL连接到我们的API时,我们不足以强制所有与我们通信的第三方将SSL证书添加到他们的本地信任库中

目前,我面临着一个两难境地:从java可信发行人处购买通配符证书,还是每个子域购买多个证书


其他语言也有信任库吗?如果是这样的话,是否有人知道通配符证书也可以使用它们。

Sun JSSE中的默认实现不支持通配符。您需要编写自己的X509TrustManager来处理通配符


但是,自Java5以来,Java支持SAN(主题替代名称)。如果您的姓名少于20个,则可以为所有姓名获得一份证书。它可能比通配符证书便宜。

我已经用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();
        }
    }
}
package com.example.test;
导入java.io.DataInputStream;
导入java.io.IOException;
导入java.net.MalformedURLException;
导入java.net.URL;
导入java.net.URLConnection;
导入java.util.Iterator;
导入java.util.List;
导入java.util.Map;
导入java.util.Map.Entry;
公共类SSLTEST{
公共静态void main(字符串[]args){
试一试{
URL=新URL(“https://test.example.com/robots.txt");
URLConnection=null;
试一试{
connection=url.openConnection();
}捕获(IOE异常){
e、 printStackTrace();
}
映射字段=connection.getHeaderFields();
迭代器头迭代器=fields.entrySet().Iterator();
System.out.println(“标题”);
System.out.println(“------------------------------------”;
while(headerierator.hasNext()){
条目标题=HeaderInterator.next();
System.out.println(header.getKey()+“:”);
迭代器valueIterator=header.getValue().Iterator();
while(valueIterator.hasNext()){
System.out.println(“\t”+valueIterator.next());
}
}
字符串输入线;
DataInputStream输入=新的DataInputStream(connection.getInputStream());
System.out.println(“正文内容”);
System.out.println(“------------------------------------”;
而((inputLine=input.readLine())!=null){
系统输出打印LN(输入线);
}
}捕获(格式错误){
系统错误println(e);
}捕获(IOE异常){
e、 printStackTrace();
}
}
}

编辑我刚刚收到确认,这在java 1.5上有效

我考虑的更多的是连接到我们的API的外部方,而不是连接到通配符安全子域的java代码。我将把这一点添加到问题中,以确保其明确性。2017年,Java明确支持通配符证书,甚至在Java 6中也看到了其他答案。但这段代码是否应该与原始问题中的通配符SSL证书一起工作?当我在具有通配符证书的服务器上尝试此代码时,我得到了一个SSLHandshakeException,因为验证路径失败。@Petri Pellinen它对具有verisign证书的有效域有效。使用自签名证书时,您可能运气不佳。现代证书在使用旧版本的Java6时也需要中间证书。(根据我的测试)“…使用旧版本的java 6时需要中间证书…”-PKIX中总是这样。这是PKI中一个众所周知的问题,称为“哪个目录”问题。请参阅OWASP。这是一条很好的信息,对我很有用。通配符ssl与信任所有证书完全不同。通配符SSL为*.domain.com。另外,这个问题比另一个问题早4年。如果你想关闭这个,但它根本不是同一件事。