2013-11-08 5 views
1

У меня есть архив, который я хочу подписать, и я хочу проверить его на C с OpenSSL.Как использовать OpenSSL для проверки подписи * .SF/* .RSA, созданной Jarsigner

Чтобы подписать архив, jarsigner казался хорошей идеей, учитывая, что мне не нужно было что-то создавать самостоятельно, и, похоже, он отлично работает. С OpenSSL я могу проверить различные значения дайджеста, но я не могу заставить его проверить подпись * .SF * .RSA.

шаги я взял:

Создание хранилища ключей

$ keytool -genkeypair -alias <alias> -keystore <keystore> -validity 360 -keyalg RSA -keysize 2048 -sigalg SHA256withRSA 

Подписать архив

$ jarsigner -keystore <keystore> -signedjar <signedFile>.zip <fileToSign>.zip <alias> 

отрезала кода проверки C

BIO *in = NULL, *indata = NULL; 
PKCS7 *p7 = NULL; 
int flags = PKCS7_DETACHED; 
    flags |= PKCS7_NOVERIFY; 
    flags |= PKCS7_BINARY; 

OpenSSL_add_all_algorithms(); 

/* load *.RSA (PKCS7) file */ 
if (!(in = BIO_new_file(path, "r"))) { 
    printf ("Can't open input file %s\n", path); 
    status = FAILURE; 
} 

if (!(p7 = PEM_read_bio_PKCS7(in, NULL, NULL, NULL))) { 
    printf ("Error in reading PKCS7 PEM file.\n"); 
    status = FAILURE; 
} 

/* load *.SF file */ 
if (!(indata = BIO_new_file(path, "r"))) { 
    printf("Can't read content file %s\n", path); 
    status = FAILURE; 
} 

/* validate signature */ 
if (PKCS7_verify(p7, NULL, NULL, indata, NULL, flags)) 
    printf("Signature verification successful!\n"); 
else { 
    printf("Signature verification failed!\n"); 
    status = FAILURE; 
} 

Ошибка

Он терпит неудачу в "PEM_read_bio_PKCS7 (...)".

Я ищу либо способ проверки его в терминале, либо с помощью C с использованием OpenSSL. C является предпочтительным;), но я всегда могу преобразовать команду в код, если вы знаете только, как это сделать вручную.

ответ

0

Я идиот. В начале этого проекта я знал, что формат подписи должен быть либо DER, либо PEM. Я думал, что правильно настроил это, но почему-то это закончилось тем, что подпись Jarsigner была в формате DER, когда я хотел проверить подпись PEM.

Мое решение - всегда ожидать подписи DER. Это значение по умолчанию для Jarsigner. Для моего подписчика/верификатора OpenSSL мне пришлось убедиться, что outform и inform были der: -outform der and -inform der.

код мудрый я должен был изменить это:

if (!(p7 = PEM_read_bio_PKCS7(in, NULL, NULL, NULL))) { 

в этом:

if (!(p7 = d2i_PKCS7_bio(in, NULL))) { 
0

Если вы хотите сделать проверить цепочку сертификатов с помощью инструментов командной строки, вот как:

unzip -p your.jar META-INF/*.RSA | openssl pkcs7 -inform DER -text -print_certs 
Смежные вопросы