【问题标题】:How to use OpenSSL to validate a *.SF / *.RSA signature created by the Jarsigner如何使用 OpenSSL 验证由 Jarsigner 创建的 *.SF / *.RSA 签名
【发布时间】:2014-08-27 23:47:20
【问题描述】:

我有一个要签名的存档,我想在 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(...)”中失败。

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

【问题讨论】:

    标签: c openssl jarsigner


    【解决方案1】:

    如果您想使用命令行工具检查证书链,方法如下:

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

    【讨论】:

    • 或者,如果你已经解压了存档并且有一个文件&lt;filename.RSA&gt;:openssl pkcs7 -inform DER -text -print_certs -in &lt;filename.RSA&gt;
    【解决方案2】:

    我是个白痴。在这个项目开始时,我知道签名格式必须是 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))) {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 2020-09-08
      • 1970-01-01
      相关资源
      最近更新 更多