Мы хотим купить подстановочный сертификат SSL, поскольку у нас есть много субдоменов. Однако я не знаю, доверяет ли Java Wildcard-сертификатам. Поскольку люди соединяются в наш API через SSL, не будет достаточно для нас вынудить всех третьих лиц, которыми мы общаемся с для добавления нашего сертификата SSL в их локальную базу доверенных сертификатов.
В данный момент я сталкиваюсь с дилеммой, чтобы купить Wildcard-сертификат от выпускающего Java, которому доверяют, или купить несколько сертификатов один на субдомен.
Другие языки также имеют базу доверенных сертификатов? Раз так делает любой знает, работают ли Wildcard-сертификаты с ними также.
Я пробовал это с помощью 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
Реализация по умолчанию в Sun JSSE не поддерживает подстановочные знаки. Вам нужно написать свой собственный X509TrustManager для обработки подстановочных знаков.
Однако Java поддерживает SAN (альтернативные имена субъектов), начиная с Java 5. Если у вас меньше 20 имен, вы можете получить один сертификат для всех из них. Это может быть дешевле, чем сертификат с подстановочными знаками.