Может ли Java подключиться к шаблону SSL - PullRequest
7 голосов
/ 02 июля 2010

Мы хотим купить сертификат SSL подстановочного знака, так как у нас много поддоменов. Однако я не знаю, доверяет ли Java сертификатам подстановочных знаков. Когда люди подключаются к нашему API через SSL, нам будет недостаточно заставить все третьи стороны, с которыми мы общаемся, добавить наш сертификат SSL в их локальное хранилище доверенных сертификатов.

В настоящий момент я сталкиваюсь с дилеммой, чтобы купить сертификат с подстановочными знаками у доверенного эмитента Java или купить несколько сертификатов по одному на каждый поддомен.

У других языков также есть склад доверенных сертификатов? Если так, то кто-нибудь знает, работают ли с ними и подстановочные сертификаты.

Ответы [ 2 ]

6 голосов
/ 02 июля 2010

Реализация по умолчанию в JSSE Sun не поддерживает подстановочные знаки. Вам нужно написать свой собственный X509TrustManager для обработки подстановочных знаков.

Однако Java поддерживает SAN (альтернативные имена субъектов) начиная с Java 5. Если у вас менее 20 имен, вы можете получить один сертификат для всех них. Это может быть дешевле, чем сертификат с подстановочным знаком.

2 голосов
/ 26 июля 2010

Я пытался сделать это с помощью 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

...