2015-07-07 4 views
1

Я хочу скомпилировать программу this в IntelliJ IDE. Но она возвращает следующие три ошибки:Ошибка при составлении программы проверки сертификата

1.for этой линии:

CertStore certs = s.getCertificatesAndCRLs("Collection", "BC"); 

эта ошибка:

error: cannot find symbol method getCertificatesAndCRLs(String,String) 

2.for эта линия:

Collection certCollection = certs.getCertificates(signer.getSID()); 

Эта ошибка:

error: method getCertificates in class CertStore cannot be applied to given types; 
required: CertSelector 
found: SignerId 
reason: actual argument SignerId cannot be converted to CertSelector by method invocation conversion 

3.And для этой линии:

if (signer.verify(cert.getPublicKey(), "BC")) verified++; 

эта ошибка:

error: method verify in class SignerInformation cannot be applied to given types; 
required: SignerInformationVerifier 
found: PublicKey,String 
reason: actual and formal argument lists differ in length 

Это мой импорт верхней части моей программы:

import java.io.*; 
import java.util.*; 
import java.security.*; 
import java.security.Security; 
import java.security.cert.*; 
import org.bouncycastle.jce.provider.BouncyCastleProvider; 
import org.bouncycastle.cms.*; 

и я добавил jdk1.7.0_15 библиотеки + bcpkix-jdk15on-151.jar и bcprov-jdk16-1.45.jar к моему проекту.

Может ли кто-нибудь помочь мне справиться с этими проблемами?

+0

Возможно, вам стоит попросить автора [этой программы] (http://www.jensign.com/JavaScience/javacrypto/) о правильных библиотеках. Цитата: «Образцы выше были скомпилированы с помощью j2sdk1.4.1_02 и требуют базовый провайдер Bouncy Castle и поставщик почтовых сообщений версии 1.19+ для компиляции и во время выполнения ». – Alexander

+0

Этот образец (который был создан 10 лет назад) использует чрезвычайно старую версию BouncyCastle, я предполагаю, что API отличается от последней версии. рассмотрите возможность поиска более актуальной выборки для функциональности. – yole

ответ

0

Следуйте приведенным ниже инструкциям. Надеюсь, это поможет вам, потому что оно проверено.

Шаг 01:
чтения массив байтов из файла или преобразования объекта данных в массив байтов.
Пример кода:

FileInputStream fis = new FileInputStream(file); 
byte fileContent[] = new byte[(int)file.length()]; 
fis.read(fileContent); 

Шаг 02:
создать объект CMSSignedData из массива байтов.
Пример кода:

CMSSignedData data = new CMSSignedData(fileContent); 

Шаг 03:
Get CertStore из CMSSignedData.
Пример кода:

CertStore certs = data.getCertificatesAndCRLs("Collection", "BC"); 

Обязательно добавьте BouncyCastleProvider в безопасности на первом:

Security.addProvider(new BouncyCastleProvider());' 

Шаг 04:
Получить коллекцию сертификатов, используя подписывающего информацию.
Пример кода:

SignerInformation signer = (SignerInformation) i.next(); 
Collection<? extends Certificate> certCollection = certs.getCertificates(signer.getSID()); 

Шаг 05:
Проверьте знак от подписавшего для каждого сертификата.
Пример кода:

if (signer.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert))) 
{ 
    } 



Пожалуйста, проверьте, чтобы fulfuill вашей цели, вы выполнили вышеуказанные шаги.

Я угадываю, либо вы делаете CMSSignedData из-за неправильного ввода данных, либо зависимые библиотеки конфликтуют друг с другом (наиболее вероятная причина). Я использовал bcprov-jdk16-1.46.jar и bcmail-jdk16-1.46.jar для выполнения всех задач.

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