Что происходит с приложением Java Web Start (подписанным без метки времени) по истечении срока действия сертификата?
У нас есть приложение Java Web Start, подписанное сертификатом CA (Thawte). Приложение распространяется среди сотен клиентов. Они размещали его на своих серверах и запускали через Интернет или интранет на своих клиентских компьютерах. Теперь это работает отлично. Проблема в том, что приложение подписано без отметки времени. Что происходит с клиентами по истечении срока действия сертификата? Должны ли они иметь возможность запустить приложение? Если нет, то как мы можем им помочь? Помогает ли им добавление URL-адреса их сервера в список сайтов исключений?
Мы пытались изменить местное время, чтобы притвориться об истечении срока действия сертификата. Затем приложение блокируется из-за безопасности. Добавление URL в список сайтов исключений не помогает:
java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Response is unreliable: its validity interval is out-of-date
at com.sun.deploy.security.RevocationChecker.checkOCSP(Unknown Source)
at com.sun.deploy.security.RevocationChecker.check(Unknown Source)
at com.sun.deploy.security.TrustDecider.checkRevocationStatus(Unknown Source)
at com.sun.deploy.security.TrustDecider.getValidationState(Unknown Source)
at com.sun.deploy.security.TrustDecider.validateChain(Unknown Source)
at com.sun.deploy.security.TrustDecider.isAllPermissionGrantedInt(Unknown Source)
at com.sun.deploy.security.TrustDecider.isAllPermissionGranted(Unknown Source)
at com.sun.javaws.security.AppPolicy.grantUnrestrictedAccess(Unknown Source)
at com.sun.javaws.security.JNLPSignedResourcesHelper.checkSignedResourcesHelper(Unknown Source)
at com.sun.javaws.security.JNLPSignedResourcesHelper.checkSignedResources(Unknown Source)
at com.sun.javaws.Launcher.prepareResources(Unknown Source)
at com.sun.javaws.Launcher.prepareAllResources(Unknown Source)
at com.sun.javaws.Launcher.prepareToLaunch(Unknown Source)
at com.sun.javaws.Launcher.prepareToLaunch(Unknown Source)
at com.sun.javaws.Launcher.launch(Unknown Source)
at com.sun.javaws.Main.launchApp(Unknown Source)
at com.sun.javaws.Main.continueInSecureThread(Unknown Source)
at com.sun.javaws.Main.access$000(Unknown Source)
at com.sun.javaws.Main$1.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Suppressed: com.sun.deploy.security.RevocationChecker$StatusUnknownException
at com.sun.deploy.security.RevocationChecker.checkCRLs(Unknown Source)
... 19 more
Caused by: java.security.cert.CertPathValidatorException: Response is unreliable: its validity interval is out-of-date
at sun.security.provider.certpath.OCSPResponse.verify(Unknown Source)
at sun.security.provider.certpath.OCSP.check(Unknown Source)
at sun.security.provider.certpath.OCSP.check(Unknown Source)
at sun.security.provider.certpath.OCSP.check(Unknown Source)
at com.sun.deploy.security.RevocationChecker$2.run(Unknown Source)
at com.sun.deploy.security.RevocationChecker$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.deploy.security.RevocationChecker.doPrivilegedOCSPCheck(Unknown Source)
... 20 more
Что мы можем сделать? Конечно, мы попросили Thawte обновить наш сертификат и попросим наших клиентов обновить приложение до отказа. Но мы не можем охватить все из них. Нам нужно получить быстрый совет для них, когда они спросят нас. Время истекает, поэтому любые комментарии приветствуются.
2 ответа
Что просходит?
Поведение WebStart сильно зависит от версии JRE, к которой он принадлежит.
Это результаты нашего теста с приложением, подписанным действительным сертификатом от официального органа сертификации, но без отметки времени после истечения срока действия сертификата. Протестировано на Windows 7 с 64-разрядными JRE, выполняя напрямую javaws.exe
в разных версиях и изменение системных часов для симуляции:
- <= 7u21: предупреждающее сообщение (может быть скрыто с помощью флажка)
- 7u25 - 7u40: WebStart ломается по-разному, изменяя поведение в каждом выпуске обновления, не использовать в любом случае
- 7u45 до 7u51: приложение заблокировано при настройке безопасности "очень высокий", предупреждающее сообщение при настройке "высокий" (можно скрыть с помощью флажка)
- > = 7u55: приложение заблокировано
- >= 8u0: приложение заблокировано
Мы заметили, что WebStart пытается использовать самую последнюю версию, установленную в настоящее время в системе, при запуске из браузера. Изменение приложения для файлов JNLP в браузере недостаточно (Firefox). Существует стратегия поиска с использованием JRE и JDK, установленных в Programm Files\Java
папка. призвание javaws.exe
из командной строки или ссылки Windows действительно выполняет версию для тестирования. Вы можете увидеть версию в консоли Java (успешный запуск) или столбце командной строки диспетчера задач (делегаты на jp2launcher.exe
другой версии).
Временное решение
- Для нас работает список сайтов исключений (протестирован с j8u66). Тем не менее, кажется, сложно ввести правильный URL. Мы считаем, что это должен быть точно такой же URL-адрес, который используется в URL-адресе файла JNLP. Когда URL JNLP
http://myhost:12345/my/app/test.jnlp
сайт исключенийhttp://myhost:12345/
работает. Используя IP-адресmyhost
вместо илиmyhost.in-my-domain.com
не будет соответствовать. См. http://java.com/de/download/faq/exception_sitelist.xml. - В зависимости от типа приложения, создающего ссылку на рабочий стол Windows на j7u21
...\javaws.exe <jnlp-url>
может быть выход.
Подписание с отметкой времени и предупреждением
Oracle заявляет, что подписание с отметкой времени от официального органа отметки времени (TSA) предотвратит истечение срока подписи. Это позволяет предотвратить проблему в будущих выпусках и доставлять обновления.
Обратите внимание на это предупреждение: WebStart доволен подписью с отметкой времени даже после истечения срока действия сертификата подписи. Однако он заблокирует приложение и сообщит, что "срок действия сертификата истек или еще не действителен" в момент истечения срока действия сертификата TSA. В наших тестах это в 2020-03-16 с использованием TSA http://tsa.starfieldtech.com/
, Вы можете увидеть эту дату истечения срока действия после Timestamp:
на выходе keytool -printcert -jarfile <your-signed.jar>
,
Отметка времени дает вам еще несколько лет на часах этой бомбы замедленного действия. В зависимости от типа вашего приложения это может не быть проблемой, но для встроенных приложений в закрытых средах, которые должны работать в течение следующих 10 лет, это убийственно. (протестировано с j8u66)
Обновление от 2016-01-07: Окончательный ответ службы поддержки Oracle по этому вопросу: "Нет ошибки. Поведение является ожидаемым и преднамеренным. Определенно изменений не будет". Это означает, что есть и не будет возможности подписать заявку без истечения срока действия.
Я просто хочу добавить, что исключение, которое вы видите при изменении времени компьютера, не имеет никакого отношения к истечению срока действия сертификата. OCSP — это протокол для вызова сервера, если сертификат отозван или нет. В ответе OCSP есть время, и если часы вашего компьютера отстают от времени ответа более чем на 900 секунд, возникает это исключение. Это исключение не произойдет, если часы не манипулируются.
Этот фрагмент из 1.8u221 JRE sun.security.provider.certpath.OCSPResponsesingleResponse имеет ответ от сервера OCSP.
/* 591 */ long l = (paramDate == null) ? System.currentTimeMillis() : paramDate.getTime();
/* 592 */ Date date1 = new Date(l + MAX_CLOCK_SKEW);
/* 593 */ Date date2 = new Date(l - MAX_CLOCK_SKEW);
/* 594 */ for (SingleResponse singleResponse : this.singleResponseMap.values()) {
/* 595 */ if (debug != null) {
/* 596 */ String str = "";
/* 597 */ if (singleResponse.nextUpdate != null) {
/* 598 */ str = " until " + singleResponse.nextUpdate;
/* */ }
/* 600 */ debug.println("OCSP response validity interval is from " + singleResponse
/* 601 */ .thisUpdate + str);
/* 602 */ debug.println("Checking validity of OCSP response on: " + new Date(l));
/* */ }
/* */
/* */
/* */
/* */
/* */
/* 609 */ if (date1.before(singleResponse.thisUpdate) || date2
/* 610 */ .after(
/* 611 */ (singleResponse.nextUpdate != null) ? singleResponse.nextUpdate : singleResponse.thisUpdate))
/* */ {
/* 613 */ throw new CertPathValidatorException("Response is unreliable: its validity interval is out-of-date");
/* */ }
/* */ }
/* */ }