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

3
我有一个归档文件需要签名,并且我想在使用OpenSSL的C中验证它。
为了签名存档文件,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语言中验证它的方法。首选是C语言 ;) 但如果您只知道如何手动操作,我也可以将命令转换为代码。

2个回答

3
如果您想使用命令行工具来检查证书链,请按照以下步骤进行:
unzip -p your.jar META-INF/*.RSA | openssl pkcs7 -inform DER -text -print_certs

1
或者,如果您已经解压缩了存档并拥有一个名为 <filename.RSA> 的文件:openssl pkcs7 -inform DER -text -print_certs -in <filename.RSA> - Beat Nideröst

1
我是一个笨蛋。在这个项目开始时,我知道签名格式必须是DER或PEM。我认为我已经正确配置了它,但不知何故,当我想验证PEM签名时,Jarsigner的签名却以DER格式出现了。

我的解决方案是始终期望DER签名。这是Jarsigner的默认设置。对于我的OpenSSL签名者/验证器,我必须确保输出格式和输入格式都是der:-outform der和-inform der。

代码方面,我必须更改这个:

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

转换成:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接