【问题标题】:Can Java connect to wildcard sslJava可以连接到通配符ssl吗
【发布时间】:2010-07-02 14:01:33
【问题描述】:

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

目前,我面临着从 Java 受信任的颁发者那里购买通配符证书或为每个子域购买多个证书的两难选择。

其他语言也有信任库吗?如果是这样,有人知道通配符证书是否也适用于他们。

【问题讨论】:

  • 这是一条很好的信息,对我很有用。
  • 通配符 ssl 与信任所有证书根本不是一回事。通配符 SSL 是 *.domain.com。这个问题也比另一个问题大 4 岁。如果你愿意,可以关闭它,但它根本不是一回事。

标签: java ssl wildcard


【解决方案1】:

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

但是,Java 从 Java 5 开始支持 SAN(主题备用名称)。如果您的名称少于 20 个,则可以为所有这些名称获得一份证书。它可能比通配符证书便宜。

【讨论】:

  • 我更多地考虑连接到我们的 API 的外部方,而不是连接到通配符安全子域的 Java 代码。我将把它添加到问题中以确保它清楚。
  • Java 在 2017 年明确支持通配符证书,甚至在 java 6 中也支持查看其他答案。
【解决方案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

【讨论】:

  • 但是这段代码是否应该与原始问题的通配符 SSL 证书一起使用?当我在带有通配符证书的服务器上尝试此代码时,我收到 SSLHandshakeException,因为验证路径失败。
  • @Petri Pellinen 它使用威瑞信证书为我提供了一个有效的域。使用自签名证书可能不太幸运。使用旧版本的 java 6 时,现代证书也需要中间证书。(根据我的测试)
  • "...使用较旧版本的 java 6 时需要中间证书..." - 在 PKIX 中总是如此。它是 PKI 中一个众所周知的问题,称为“哪个目录”问题。请参阅 OWASP 的Transport Layer Protection Cheat Sheet
猜你喜欢
  • 2011-04-17
  • 1970-01-01
  • 2020-03-17
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 2013-06-25
相关资源
最近更新 更多