署名済みの XML ドキュメント ( xmlseclibsを使用) を送信しようとしていますが、署名自体が間違っています。
私が使用しているコードは次のようになります。
// input variables:
$tout = __DIR__ . "/" . $firmacert2;
$certBuffer = file_get_contents($tout);
$certTempFile = __DIR__ . '/temp/temp.xml';
$xmlBuffer = base64_decode($xmlstrBase64);
// document creation and loading
$doc = new DOMDocument();
$doc->loadXML($xmlBuffer);
$objDSig = new XMLSecurityDSig();
$objDSig->setCanonicalMethod(XMLSecurityDSig::EXC_C14N);
$objDSig->addReference($doc, XMLSecurityDSig::SHA1, array('http://www.w3.org/2000/09/xmldsig#enveloped-signature'));
$objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type' => 'private'));
// load private key
$objKey->passphrase = $pass;
$objKey->loadKey($tout, TRUE);
$objDSig->sign($objKey);
// Add associated public key
$objDSig->add509Cert($certBuffer);
$objDSig->appendSignature($doc->documentElement);
$doc->save($certTempFile);
$codif = file_get_contents($certTempFile);
$xml_base64 = base64_encode($codif);
$param1 = new SoapParam($xml_base64, 'xml');
$com = new SoapClient('https://www.aespd.es:443/agenciapd/axis/SolicitudService?wsdl', array('trace' => 1, 'encoding' => 'UTF-8'));
$respuesta2 = $com->probarXml($param1);
$respuesta = base64_decode($respuesta2);
そして、xml が送信されています。これは素晴らしいことですが、xml ファイルを復元して署名を確認すると、http: //www.aleksey.com/xmlsec/xmldsig-verifier.htmlが表示されます。
私が得ているエラーは次のとおりです。
func=xmlSecOpenSSLEvpDigestVerify:file=digests.c:line=229:obj=sha1:subj=unknown:error=12:invalid data:data and digest do not match
証明書を個別の秘密鍵と公開鍵、同じファイル、別のファイル、インポートとエクスポートなどに変換しようとしました。
流れは次のようになります。
Java プログラムは、生成された未署名の Base64 でエンコードされた XML を PHP ファイルに送信します。PHP ファイルは、署名して送信しSoapClient
、結果が出力され、Java プログラムによってキャプチャおよび解釈されるため、このシステムを使用するマシンに個別の証明書が存在することを回避できます。