如何使用OpenSSL验证Jarsigner创建的* .SF / * .RSA签名

时间:2013-11-08 10:26:44

标签: c openssl jarsigner

我有一个我想签名的档案,我想用C和OpenSSL验证它。

为了对档案进行签名,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(...)”失败。

我正在寻找一种在终端中验证它的方法,或者使用OpenSSL来验证它。 C是首选;)但我总是可以将命令转换为代码,以防您只知道如何手动执行。

2 个答案:

答案 0 :(得分:1)

我是个白痴。在这个项目开始时,我知道签名格式必须是DER或PEM。我以为我已经正确配置了这个,但不知何故,当我想验证PEM签名时,它最终出现了Jarsigner的签名是DER格式的情况。

我的解决方案是始终期待DER签名。这是Jarsigner的默认值。对于我的OpenSSL签名者/验证者,我必须确保outform并告知der:-outform der和-inform der。

代码明智我不得不改变这个:

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

进入这个:

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

答案 1 :(得分:0)

如果您想使用命令行工具检查证书链,请按以下步骤操作:

unzip -p your.jar META-INF/*.RSA | openssl pkcs7 -inform DER -text -print_certs