2014-07-03 122 views
1

我想用PHP使用OpenSSL对XML文件进行数字签名,到目前为止,我可以生成一个包含我需要的所有信息的XML,并且我有一个签名和验证签名的工作演示(声明私有和公钥作为字符串)。我有一个.cer文件和一个.key文件,这些文件是我想用来签署XML文件的文件。我怎样才能做到这一点? 目标是最终用户只需上传这些证书并下载已签名的XML。(约今一些具体的文档不胜感激)PHP数字签名

编辑:好吧,我现在熟悉了OpenSSL和它的功能,但我仍然需要知道如何做包括这在PHP中:

openssl pkcs8 -inform DER -in c:/route/myfile.key -passin pass:contraseña -out c:/route/myfile.pem 

要这样:

$data = "||2.0|ABCD|2|03-05-2010T14:11:36|49|2008|INGRESO|UNA SOLA EXHIBICIÓN|2000.00|00.00|2320.00|PAMC660606ER9|CONTRIBUYENTE PRUEBASEIS PATERNOSEIS MATERNOSEIS|PRUEBA SEIS|6|6|PUEBLA CENTRO|PUEBLA|PUEBLA|PUEBLA||MÉXICO|72000|CAUR390312S87|ROSA MARÍA CÁLDERON URIEGAS|TOPOCHICO|52|JARDINES DEL VALLE|NUEVO LEÓN|MEXICO|95465|1.00|SERVICIO|01|ASESORIA FISCAL Y ADMINISTRATIVA|2000.00|IVA|16.00|320.00|| "; 

$priv_key_id=openssl_get_privatekey("file://C:\files\Clavepr.key.pem"); 
$public_key_id=openssl_get_publickey("file://C:\files\cert.cer.pem"); 
$o=openssl_sign($data,$cadenafirmada, $priv_key_id,OPENSSL_ALGO_SHA1); 
$sello=base64_encode($cadenafirmada); 

var_dump($sello); 
+0

向我们展示您的代码... – jcaron

+0

@jcaron更新了我的文章 – Carlos

回答

0

我目前在hostgator中使用的网站,我提出了关于此事的一张票,他们在服务器中配置了OpenSSL并为我启用了它,然后不再使用exec()来执行我用过的shell_exec(),然后执行该命令直接进入Linux控制台,它看起来像这样:

shell_exec('openssl pkcs8 -inform DER -in '.$_SERVER['DOCUMENT_ROOT'].'/'.$path1.' -passin pass:'.$contrasena.' -out '.$_SERVER['DOCUMENT_ROOT'].'/'.$path1.'.pem'); 

这是唯一的问题。

0

这个了一些具体的文件是极大的赞赏

您正在查找的文档是PKCS7_sign(3)

您还可以通过检查openssl smime实用程序的源代码来了解OpenSSL如何使用它。你可以在<openssl src>/apps/smime.c找到源代码。您对operation == SMIME_SIGN的代码块感兴趣,并且可能是PKCS7_STREAM标志。

+0

我已经阅读了整个页面,现在更熟悉OpenSSL,PKCS7不是解决方案的工作,我设法以编程方式将我的.cer DER编码的证书转换为PEM格式,并且我已经将我的.key文件转换为PEM格式,在OpenSSL控制台中使用pcks8,使用PEM格式的2个密钥,我也验证了它们,但我仍然需要找到一种方法PHP中的pkcs8转换。 – Carlos