2015-10-09 2 views
1

Мы подписали наше приложение Java Web Start с сертификатом подписи кода из CA (Thawte). Подпись имеет временную метку (мы передаем аргумент -tca https://timestamp.geotrust.com/tsa инструменту jarsigner), чтобы быть действительным после истечения срока действия сертификата. В настоящее время, когда сертификат действителен, приложение работает отлично. Но когда мы пытаемся изменить местное время для симуляции срока действия сертификата, приложение не запустится. Мы получаем следующее исключение:Как проверить, будет ли приложение Java Web Start продолжать работу после истечения срока действия сертификата

java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Responder's certificate not within the validity period 
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) 
Caused by: java.security.cert.CertPathValidatorException: Responder's certificate not within the validity period 
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 
Caused by: java.security.cert.CertificateExpiredException: NotAfter: Thu Dec 17 00:59:59 CET 2015 
at sun.security.x509.CertificateValidity.valid(Unknown Source) 
at sun.security.x509.X509CertImpl.checkValidity(Unknown Source) 
... 28 more 

Свидетельство действует с 09.10.2015 по 08.11.2017.

Мы попытались проверить подписанный JAR с помощью инструмента jarsigner. Кажется, что все файлы имеют временную метку:

 [entry was signed on 9.10.15 16:42] 
    X.509, CN="GEOVAP, spol. s.r.o.", OU=Software, O="GEOVAP, spol. s.r.o.", L=Pardubice, ST=Czech Republic, C=CZ 
    [certificate is valid from 9.10.15 2:00 to 8.11.17 0:59] 
    X.509, CN=thawte SHA256 Code Signing CA, O="thawte, Inc.", C=US 
    [certificate is valid from 10.12.13 1:00 to 10.12.23 0:59] 

Таким образом, вывод jarsigner представляется правильным. Может ли кто-нибудь подтвердить, что это действительно означает, что подпись имеет временную метку?

Мы заметили, что если мы изменим местное время всего на несколько (3) дней вперед, приложение будет работать. Но если мы изменим его больше (неделя), то получим исключение. Проверяет ли сервер ЦС время локального клиента? Если это так, как мы можем имитировать срок действия сертификата? Спасибо.

ответ

3

Причина и обходной путь

Ваше исключение StackTrace показывает, что проверка отзыва сертификата с использованием протокола OCSP (он-лайн сертификат состояния сертификата) не удался из-за истечения срока действия Сертификат ответчика OCSP на дату тестирования (не из-за вашего сертификата).

Для выполнения проверки попробуйте переключить проверку отзыва сертификатов на панели управления Java.

Также убедитесь, что ваш сертификат еще не принят на постоянной основе (используйте «Восстановить подсказки безопасности» на панели управления Java).

Примечания по времени подписания штампованных

В настоящее время (до j8u66 до j8u144) отметок времени подписания не долговечно предотвратить подписи истекающего. Web Start не будет жаловаться на истечение срока действия вашего сертификата. Тем не менее, он заблокирует ваше приложение и заявит, что «сертификат истек или еще не действителен» в момент истечения срока действия вашего сертификата TSA. Вы можете проверить это, используя дату, даже после даты истечения срока действия сертификата TSA, видимого в части Timestamp: вывода keytool -printcert.

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

Обновление от 2016-01-07: окончательный ответ от Oracle Support: «Нет ошибок. Поведение ожидается и преднамеренно. Не будет никаких изменений». Это означает, что есть и не будет возможности подписывать приложение без истечения срока действия.

Обновление от 2017-11-06: Несмотря на то, что заявления Oracle от 2016 года остаются в силе даже после даты истечения срока действия сертификата TSA с помощью Web Start j8u151 (протестировано с j8u144 и j8u151, j9 не проверено). Сомнительно, если это по намерению или по ошибке.

+0

Кажется, что Oracle установил на j8U151. По крайней мере, у нас была эта проблема и она не воспроизводится в 151. Не могли бы вы поделиться ссылкой на эту проблему? – docDevil

+0

@docDevil: Цитата из одного из наших случаев в рамках платной поддержки Oracle. Эти случаи не являются общедоступными, поэтому я не могу предоставить ссылку. Тем не менее, я также собираюсь проверить поведение 8u151. – Holger

+0

@docDevil: Мой тест с 8u151 Web Start также показывает, что подписи остаются в силе даже после даты истечения срока действия сертификатов и сертификатов TSA. 8u144 Web Start блокирует приложение. – Holger

1

JDK Keytool может также использоваться, чтобы проверить метку времени:

keytool -printcert -jarfile app.jar 

отчет Отметка должен выглядеть следующим образом:

Timestamp: 

Owner: CN=GeoTrust 2048-bit Timestamping Signer 1, O=GeoTrust Inc, C=US 
Issuer: CN=Symantec Time Stamping Services CA - G2, O=Symantec Corporation, C=US 
Serial number: 5fd693fab098e3f4677bb8cb672c229e 
Valid from: Thu Jun 11 02:00:00 CEST 2015 until: Wed Dec 30 00:59:59 CET 2020 
Certificate fingerprints: 
    MD5: 2B:51:8D:A4:11:F1:43:C7:84:62:5A:41:95:BB:5E:05 
    SHA1: D7:1D:45:62:C6:33:36:7C:34:E3:66:CF:B7:6F:B9:7B:05:AF:34:B4 
    SHA256: DC:DA:D2:91:F5:32:D5:BD:FC:E6:9D:06:41:A1:45:57:85:74:E0:D5:B9:8F:19:00:6C:19:AB:2E:9D:F9:96:42 
    Signature algorithm name: SHA1withRSA 
    Version: 3