2009-03-04 6 views
0

У меня есть основное приложение Java, работающее на моем ПК, которое может отправлять XML-данные в сервисный пакет и получать данные XML обратно. http://iamt.wisconsin.gov/IAM-WiEntUser/WiEntUserService?xml=SSL-связь, как это сложно?

Я могу использовать https://iamt.wisconsin.gov/IAM-WiEntUser/WiEntUserService?xml= из IE и Firefox, потому что я разрешил мне загрузить частный сертификат.

Я хочу использовать https из основного приложения Java, потому что некоторые данные чувствительны. Я получаю IOException с сертификатом MSG = unkown. Хорошо, это имеет смысл, Java не знает о частном сертификате.

Я надеялся, что было бы так же просто, как сказать Java, чтобы доверять сертификатам FireFox. System.setProperty ("javax.net.ssl.trustStore", "C:/Documents and Settings/kendajm/Данные приложения/Mozilla/Firefox/Profiles/6f8ggdi7.default/cert8.db"); Но это дает IOException с MSG = Неверный формат хранилища ключей.

Связь SSL, как трудно это может быть? Я провел восемь часов, пытаясь выяснить, как это сделать. Кажется, это так просто, что это не документировано или очень сложно, и у кого-то нет хорошего примера.

Помощь.

ответ

1

Насколько я понимаю, проблема в том, что Java не принимает самозаверяющий сертификат. Поправьте меня, если я ошибаюсь!

Вы пытались использовать Commons-HttpClient? У этого есть еще несколько вариантов, и на this page есть руководство для принятия самозаверяющих сертификатов. Также см. this sample code

Редактировать: есть руководство по импорту сертификата в Java here - очевидно, вам нужно будет сделать это на каждой машине, на которой работает Java-приложение. Опция HttpClient может быть более гибкой, в зависимости от того, что вам нужно.

+0

+1; EasySSLProtocolSocketFactory также можно использовать без Commons-HttpClient. – trunkc

1

Я смог использовать самозаверяющий сертификат, как только я зарегистрировал его правильно с помощью Java с помощью keytool.

Смотрите это руководство: http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/keytool.html

По сути, вам: 1. Создание собственного сертификата 2. экспортировать его в файл 3. Импорт его в хранилище по умолчанию

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

4

Формат хранилища ключей Mozilla cert8.db по умолчанию не читается (хотя можно «подключить» поставщика, который может его проанализировать.) Проще всего импортировать сертификат в хранилище ключей, которое поддерживается по умолчанию.

Во-первых, вам нужна копия сертификата.

В Firefox зайдите на страницу, о которой идет речь. Щелкните значок «блокировка» в строке состояния в правом нижнем углу окна. В появившемся диалоговом окне нажмите кнопку «Просмотреть сертификат». Появится новое диалоговое окно; выберите вкладку «Подробности». Нажмите кнопку «Экспорт» в нижней части окна, чтобы сохранить сертификат в файл (используйте формат DER или PEM).

Теперь вам нужно получить сертификат в формате хранилища ключей, используемом Java.

Используйте JDK в keytool утилита:

keytool -import -keystore mykeystore.jks -alias iamt -file iamt.wisconsin.gov

При запросе пароля, выберите новый пароль, который может быть использован позже, чтобы проверить, что сертификаты в хранилище не были подделаны. Затем, keytool подскажет вам, следует ли доверять новому сертификату — введите да! У вас должен быть новый файл хранилища ключей Java с именем «mykeystore.jks» (или что бы вы ни выбрали).

Теперь запустите свою программу, указав свой новый файл хранилища ключей как значение свойства «javax.net.ssl.trustStore».


Кстати, я заметил, что вы возвращаете Java Beans XMLEncoder выход из вашей службы. Этот формат «Долгосрочная стойкость» - это пропущенная жемчужина JDK, но небезопасно разбирать недоверенный контент. Используя этот синтаксис, любой метод может быть вызван в JVM, выполняющем синтаксический анализ. Это похоже на «eval» с ненадежным JSON. Таким образом, если бы я выполнял клиентскую службу, я бы, вероятно, не захотел анализировать результат из службы без большой дополнительной работы для «песочницы» разбора как ненадежного кода. И я предполагаю, что служба анализирует один и тот же формат в запросах, что также опасно для сервера.


Когда вы задаете вопрос о сообщении об ошибке, это отличная идея, чтобы отправить сообщение целиком, в том числе трассировки стека (если это не на самом деле java.lang.StackOverflowError!). Это может быть бессмысленным для вас, но часто у него есть информация, которую нужно мгновенно выявить.

0
  1. Экспорт сертификата из IE, как Base-64 закодированной X.509 (.CER)
  2. Run Keytool на экспортируемого сертификата. Предоставьте файл и пароль trustStore. Ответить «да», чтобы доверять вопросу. keytool -import -v -trustcacerts -alias IamtCert -file C: \ Work \ IAM \ Acceptance \ IamAcceptanceCertificate.cer -keystore N: \ WEB \ DEG \ CaCert.dat
  3. Добавьте две строки кода. System.setProperty ("javax.net.ssl.trustStore", "N: \ WEB \ DEG \ CaCert.dat"); System.setProperty ("javax.net.ssl.trustStorePassword", "xxxxxx");

Не сложно, если вы знаете, что делать. Остальная часть кода остается прежней. (Сервлет имеет другой способ действительного вызова, который не включает сертификат.)

urlAddress += encodedXmlData; 
    URL url = null; 
    HttpURLConnection connection = null; 
    StringBuffer result = new StringBuffer(); 
    try { 
     url = new URL(urlAddress); 
     connection = (HttpURLConnection)url.openConnection(); 
    } 
    catch(IOException ioe) { 
     System.out.println(classMethod+": IOException: URL Msg="+ioe.getMessage()); 
     return(null); 
    }   
    connection.setDoInput(true); // Default value. 
    connection.setDoOutput(true); // Not the default value. 
    connection.setUseCaches(false); // Not the default value. 
    try { 
     connection.setRequestMethod("POST"); // Large pay load. 
    } 
    catch(ProtocolException pe){ 
     System.out.println(classMethod+": ProtocolException: URL Msg="+pe.getMessage()); 
     return(null); 
    } 
    // If true, this URL is being examined in a context in which it makes 
    // sense to allow user interactions such as popping up an 
    // authentication dialog. 
    connection.setAllowUserInteraction(false); 
    try { 
     connection.connect(); 
     BufferedReader bufferedReader = new BufferedReader(new 
       InputStreamReader(connection.getInputStream())); 

     // Retrieve the response 
     String inputLine = null; 
     while ((inputLine = bufferedReader.readLine()) != null) { 
      if (inputLine.indexOf("</void>") > -1) inputLine+='\n'; 
      result.append(inputLine); 
     } 
     bufferedReader.close(); 
     connection.disconnect(); 
    } 
    catch(IOException ioe) { 
     System.out.println(classMethod+": IOException: Read Msg="+ioe.getMessage()); 
     return(null); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^