如何用php(phpseclib)生成java / android签名块文件(.RSA)

时间:2014-03-24 10:23:00

标签: android apk digital-signature phpseclib php-openssl

我正试图用php完全在服务器上签署一个android .apk文件。

为此,我需要生成.apk文件(实际上是一个ZIP文件)中的META-INF目录中包含的文件。在php中创建.MF和.SF文件非常简单。但是,我正在努力使用.RSA文件。

不幸的是,我对密码学一无所知,甚至不了解基本术语。我只知道一些PHP基础知识,但我远没有经验,也没有必要的库/函数的概述。因此,即使经过数小时的研究,我仍然无法创造任何有用的东西。

根据我的理解,.RSA文件应包含:

  • .SF文件的数字签名
  • 带有签名者公钥的证书

此文件应为PKCS7格式。

我试图使用phpseclib。我能够从互联网上的示例创建一个私钥/公钥/证书,但我绝对无法将它们组合在一起形成.RSA文件。

Stackoverflow是一个很好的信息来源,我可能在这里找到了大部分问题的答案。但是,现在我被卡住了。

你们能不能给我一些php示例代码(理想情况下)?甚至一些伪代码/算法...... 这甚至可以用phpseclib / php完成吗?是否需要一些“位移”? 如果可能的话,请不要指向jarsigner的源代码......我看了它,但对Java知之甚少,它只带来了更多的问题。

更新

当你不知道自己在做什么时,很难朝正确的方向前进:D ...

这是我到目前为止所尝试的,但没有任何成功:

  1. 我使用ssh生成公钥/私钥对

    ssh-keygen -t rsa1

  2. 我使用以前生成的密钥对来创建一个带有phpsceclib的自签名证书,如下所述: http://phpseclib.sourceforge.net/new/x509/tutorial.html#selfsigning

  3. 我将证书($ signcert),私钥($ privkey - 来自ssh生成的文件)和签名数据($ infilename - &gt; .SF文件)传递给openssl函数openssl_pkcs7_sign():< / p>

    openssl_pkcs7_sign ($infilename , $outfilename , $signcert , $privkey , array(), PKCS7_DETACHED|PKCS7_BINARY);

  4. 然而,生成的结果似乎是一种称为PEM格式(人类可读)的东西。除了它不是二进制DER(甚至不知道它是什么......只是猜测它应该是DER)最终.RSA文件应该是什么的事实,还有一些其他问题:

    • 结果还包含.SF文件的内容(要签名的原始数据)
    • 它包含一些不必要的标题信息作为常规文本字符串
    • 行以“\ n”结尾,而不是“\ r \ n”
    • 签名(不确定结果中的其他数据是什么,但可能是签名)是base64编码的

    我在这里至少做过什么吗?还需要采取哪些其他步骤才能使其发挥作用?根据上述链接创建证书时,我应该设置哪些属性?如何将结果传输到包含带有签名者公钥的.SF签名和证书的二进制DER格式的.RSA文件?

    更新2:

    我终于有时间继续我的小实验。我查看了我的代码并尝试更改不同的参数。最后我发现了这个问题。看来我只需要在openssl_pkc7_sign()中打开PKCS7_NOATTR标志。

    这是代码

    $configs = array('digest_alg' => 'sha1', 
                     'x509_extensions' => 'v3_ca',
                     'req_extensions' => 'v3_req',
                     'private_key_bits' => 1024,
                     'private_key_type' => OPENSSL_KEYTYPE_RSA,
                     'encrypt_key' => true,
                     'encrypt_key_cipher' => OPENSSL_CIPHER_3DES);
    
    // Generate private/public key pair and certificate
    $privkey = openssl_pkey_new($configs);
    $dn = array("commonName" => "name",
                "emailAddress" => "me@example.com");
    
    $csr = openssl_csr_new($dn, $privkey, $configs);
    $sscert = openssl_csr_sign($csr, NULL, $privkey, 999, $configs);
    
    // Sign the .SF file 
    openssl_pkcs7_sign ( $sfFile , $rsaFile , $sscert , $privkey, array(), 
                         PKCS7_DETACHED|PKCS7_BINARY|PKCS7_NOATTR); 
    

    我只有时间在几个样本上检查它,但它现在似乎正在工作。这是一个非常简单的演示www.balabeng.com/?q=appsigner

0 个答案:

没有答案