Исключение при чтении сертификатов подписи OCSP в Java

В настоящее время я работаю над тем, чтобы приложение Java (JRE 1.5+) взаимодействовало с ответчиком Windows 2008 OCSP, и я получаю странную ошибку при попытке прочитать сертификат подписи ответчика.

Я получаю следующее исключение при попытке выполнить проверку OCSP.

Caused by: java.security.cert.CertificateParsingException: java.io.IOException: short read on DerValue buffer
    at sun.security.x509.X509CertInfo.<init>(Unknown Source)
    at sun.security.x509.X509CertImpl.parse(Unknown Source)
    at sun.security.x509.X509CertImpl.<init>(Unknown Source)
    at sun.security.provider.certpath.OCSPResponse.<init>(Unknown Source)
    at sun.security.provider.certpath.OCSPChecker.check(Unknown Source)
    ... 6 more
Caused by: java.io.IOException: short read on DerValue buffer
    at sun.security.util.DerValue.getOctetString(Unknown Source)
    at sun.security.x509.Extension.<init>(Unknown Source)
    at sun.security.x509.CertificateExtensions.init(Unknown Source)
    at sun.security.x509.CertificateExtensions.<init>(Unknown Source)
    at sun.security.x509.X509CertInfo.parse(Unknown Source)
    ... 11 more

Это говорит о том, что возникла проблема с чтением сертификата подписи, поэтому я попытался импортировать его отдельно, используя метод, аналогичный приведенному ниже:

    public static List<Certificate> readCerts(String certFile,
        CertificateFactory cf, boolean withCRL) throws Exception {
    FileInputStream fis = new FileInputStream(certFile);
    BufferedInputStream bis = new BufferedInputStream(fis);

    List<Certificate> certs = new LinkedList<Certificate>();

    while (bis.available() > 0) {
        Certificate cert = cf
                .generateCertificate(bis);
        X509Certificate cx509 = (X509Certificate) cert;
        certs.add(cert);
    }

    return certs;
}

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

Кто-нибудь еще сталкивался с подобными проблемами с поддержкой X509 в Java?

С уважением, Том

ОБНОВЛЕНИЕ: сертификат, с которым у меня возникли проблемы, выглядит следующим образом:

-----BEGIN CERTIFICATE-----
MIIDzDCCArSgAwIBAgIKYQWrDAAAAAAABjANBgkqhkiG9w0BAQUFADBFMRMwEQYK
CZImiZPyLGQBGRYDaW50MRUwEwYKCZImiZPyLGQBGRYFbG9ucWExFzAVBgNVBAMT
DmxvbnFhLVRFLUNBLUNBMB4XDTA5MDkyMTE2NDIxNloXDTA5MTAwNTE2NDIxNlow
GjEYMBYGA1UEAxMPdGUtY2EubG9ucWEuaW50MIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEA6rYO7X/PztBE2Do9u95ws3Ob86cySJ1iLrHLSF+VjvTQkZ3J
e0uKxoK4doSikqCZH9zXZ6qFFVMZlzq/FnIP9TLhv3uFom0y+Z0HmPAW7RtrZ8R6
1EAmcQDGpyRhzCWJqrEzgbW1v1QtF854kium97GwUWnVijGv3jQqT3hbmD7++9lh
9ILaLXMAKdTFpL1ao2eHWYf2mChRpuAox2juO1g4xjot9GXsEMhTwAg9F/pZnbKE
hhpeo1c0kgP3uus7ULlwdRnZ4O+tp79GeVKsdJbphmnC6Fc/PdT0KuHSk9Q0v192
Ger5nTQaZk/dmsyGBd8g4Q+0g0Ri+wgpUUsykQIDAQABo4HoMIHlMDYGCSsGAQQB
gjcVBwQpMCcGHysGAQQBgjcVCIHPgWyXxQ2ChYcyg8LhMoWky3ppASACAWUCAQAw
EwYDVR0lBAwwCgYIKwYBBQUHAwkwDgYDVR0PAQH/BAQDAgeAMBsGCSsGAQQBgjcV
CgQOMAwwCgYIKwYBBQUHAwkwDQYJKwYBBQUHMAEFBAAwHQYDVR0OBBYEFNblspp7
Hu07mraeMSyuBUTUnbl3MB8GA1UdIwQYMBaAFK/r521FB+GNls/fe8hrNE8UpQhv
MBoGA1UdEQQTMBGCD3RlLWNhLmxvbnFhLmludDANBgkqhkiG9w0BAQUFAAOCAQEA
FASEVcUJQlrmCD/ysycOxAIAoc2BVLhteOMoZ7V65a5/+Q5JM7Od+gKqoxLVrjb2
BDLlDFp5U8CirQ4lyWV5i1gQpLFTDcjgonp9Ky50KA0Ginn5CmTELB2THwFSQwfm
OFenSaV1mAcEzdyp/hi2xSuMqhveSanQFD0r6y45oZsd9ubdFEWI6nBRrj4hhfw0
Wo2GKUgslXqAqEezdin5JNgsPdj3qsi4+U4llyrd3gG20eoWzGHF4h7wfFiQV+fs
yEPY06Rg9G9m3GlIv+7Gp3sixb+cvZe+e0gO32mVRydTXMaAZu7ZiFk3M6AqxfDw
dO//eCu2dZCLTw6xTbUc9A==
-----END CERTIFICATE-----

person Tom Elliott    schedule 30.09.2009    source источник
comment
Спасибо за быстрые ответы, ребята. Я добавил сертификат проблемы в описание.   -  person Tom Elliott    schedule 30.09.2009
comment
Смотрите мое редактирование .......................   -  person ZZ Coder    schedule 30.09.2009


Ответы (1)


Я предполагаю, что вы получите свою фабрику вот так,

  cf = CertificateFactory.getInstance("X509");

Фабрика X509 по умолчанию имеет множество ограничений. Похоже, ваш сертификат содержит расширение, которое фабрика не знает, как анализировать. Если вы опубликуете сертификат, я могу помочь вам определить оскорбительное расширение.

РЕДАКТИРОВАТЬ: оскорбительное расширение

1.3.6.1.5.5.7.48.1.5 — id-pkix-ocsp-nocheck

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

person ZZ Coder    schedule 30.09.2009
comment
Спасибо, я перешел к поставщику BouncyCastle, и, похоже, он работает нормально. - person Tom Elliott; 30.09.2009