我正试图用php完全在服务器上签署一个android .apk文件。
为此,我需要生成.apk文件(实际上是一个ZIP文件)中的META-INF目录中包含的文件。在php中创建.MF和.SF文件非常简单。但是,我正在努力使用.RSA文件。
不幸的是,我对密码学一无所知,甚至不了解基本术语。我只知道一些PHP基础知识,但我远没有经验,也没有必要的库/函数的概述。因此,即使经过数小时的研究,我仍然无法创造任何有用的东西。
根据我的理解,.RSA文件应包含:
此文件应为PKCS7格式。
我试图使用phpseclib。我能够从互联网上的示例创建一个私钥/公钥/证书,但我绝对无法将它们组合在一起形成.RSA文件。
Stackoverflow是一个很好的信息来源,我可能在这里找到了大部分问题的答案。但是,现在我被卡住了。
你们能不能给我一些php示例代码(理想情况下)?甚至一些伪代码/算法...... 这甚至可以用phpseclib / php完成吗?是否需要一些“位移”? 如果可能的话,请不要指向jarsigner的源代码......我看了它,但对Java知之甚少,它只带来了更多的问题。
当你不知道自己在做什么时,很难朝正确的方向前进:D ...
这是我到目前为止所尝试的,但没有任何成功:
我使用ssh生成公钥/私钥对
ssh-keygen -t rsa1
我使用以前生成的密钥对来创建一个带有phpsceclib的自签名证书,如下所述: http://phpseclib.sourceforge.net/new/x509/tutorial.html#selfsigning
我将证书($ signcert),私钥($ privkey - 来自ssh生成的文件)和签名数据($ infilename - &gt; .SF文件)传递给openssl函数openssl_pkcs7_sign():< / p>
openssl_pkcs7_sign ($infilename , $outfilename , $signcert , $privkey , array(), PKCS7_DETACHED|PKCS7_BINARY);
然而,生成的结果似乎是一种称为PEM格式(人类可读)的东西。除了它不是二进制DER(甚至不知道它是什么......只是猜测它应该是DER)最终.RSA文件应该是什么的事实,还有一些其他问题:
我在这里至少做过什么吗?还需要采取哪些其他步骤才能使其发挥作用?根据上述链接创建证书时,我应该设置哪些属性?如何将结果传输到包含带有签名者公钥的.SF签名和证书的二进制DER格式的.RSA文件?
我终于有时间继续我的小实验。我查看了我的代码并尝试更改不同的参数。最后我发现了这个问题。看来我只需要在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