Problème signature xml pour webservice

cs_nitho Messages postés 130 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 8 décembre 2015 - 3 déc. 2015 à 17:00
cs_nitho Messages postés 130 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 8 décembre 2015 - 8 déc. 2015 à 16:13
Bonjour,


J’ai un souci pour signer un xml que je dois envoyer à un webservice.

Sur SoapUI tout marche bien et j’arrive à avoir une réponse de mon serveur, mais dans mon script php je ne trouvepas le même hash SHA1. Et du coup je reçois une erreur…

Voici la requête :
<soapenv:Envelope xmlns:elc="http://schemas.datacontract.org/2004/07/toto" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header>
   
</soapenv:Header>
<soapenv:Body wsu:Id="id-C412303BE3B390B3D114265182390668" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <tem:SendMessage>
     <tem:request>
        <elc:XmlData><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<REMITTable1 xmlns="http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <reportingEntityID>
        <ace>Z99999999.CH</ace>
    </reportingEntityID>
    <contractList>
        <contract>
            <contractId>NA</contractId>
            <contractName>BILCONTRACT</contractName>
            <contractType>FW</contractType>
            <energyCommodity>NG</energyCommodity>
            <settlementMethod>P</settlementMethod>
            <organisedMarketPlaceIdentifier>
                <bil>XBIL</bil>
            </organisedMarketPlaceIdentifier>
            <contractTradingHours>
                <startTime>00:00:00Z</startTime>
                <endTime>24:00:00Z</endTime>
            </contractTradingHours>
            <deliveryPointOrZone>10YEU-EUROGAS--8</deliveryPointOrZone>
            <deliveryStartDate>2014-08-01</deliveryStartDate>
            <deliveryEndDate>2014-09-01</deliveryEndDate>
            <loadType>GD</loadType>
            <deliveryProfile>
                <loadDeliveryStartTime>06:00:00</loadDeliveryStartTime>
                <loadDeliveryEndTime>06:00:00</loadDeliveryEndTime>
            </deliveryProfile>
        </contract>
    </contractList>
    <TradeList>
        <TradeReport>
            <RecordSeqNumber>1</RecordSeqNumber>
            <idOfMarketParticipant>
                <ace>Y99999999.CH</ace>
            </idOfMarketParticipant>
            <traderID>
                <traderIdForOrganisedMarket>Trader12345</traderIdForOrganisedMarket>
            </traderID>
            <otherMarketParticipant>
                <lei>a1b2c3d4e5f6g7h8i9l0</lei>
            </otherMarketParticipant>
            <tradingCapacity>P</tradingCapacity>
            <buySellIndicator>B</buySellIndicator>
            <contractInfo>
                <contractId>NA</contractId>
            </contractInfo>
            <organisedMarketPlaceIdentifier>
                <bil>XBIL</bil>
            </organisedMarketPlaceIdentifier>
            <transactionTime>2014-07-15T10:27:00.000+02:00</transactionTime>
            <uniqueTransactionIdentifier>
                <uniqueTransactionIdentifier>K1W9M4K1T0T5</uniqueTransactionIdentifier>
            </uniqueTransactionIdentifier>
            <priceDetails>
                <price>21</price>
                <priceCurrency>EUR</priceCurrency>
            </priceDetails>
            <notionalAmountDetails>
                <notionalAmount>156240</notionalAmount>
                <notionalCurrency>EUR</notionalCurrency>
            </notionalAmountDetails>
            <quantity>
                <value>10</value>
                <unit>MW</unit>
            </quantity>
            <totalNotionalContractQuantity>
                <value>7440</value>
                <unit>MWh</unit>
            </totalNotionalContractQuantity>
            <actionType>N</actionType>
        </TradeReport>
        <TradeReport>
            <RecordSeqNumber>2</RecordSeqNumber>
            <idOfMarketParticipant>
                <ace>Y99999999.CH</ace>
            </idOfMarketParticipant>
            <traderID>
                <traderIdForOrganisedMarket>Trader12345</traderIdForOrganisedMarket>
            </traderID>
            <otherMarketParticipant>
                <lei>a1b2c3d4e5f6g7h8i9l0</lei>
            </otherMarketParticipant>
            <tradingCapacity>P</tradingCapacity>
            <buySellIndicator>B</buySellIndicator>
            <contractInfo>
                <contractId>NA</contractId>
            </contractInfo>
            <organisedMarketPlaceIdentifier>
                <bil>XBIL</bil>
            </organisedMarketPlaceIdentifier>
            <transactionTime>2014-07-15T10:27:00.000+02:00</transactionTime>
            <uniqueTransactionIdentifier>
                <uniqueTransactionIdentifier>K1W9M4K1T0T5</uniqueTransactionIdentifier>
            </uniqueTransactionIdentifier>
            <priceDetails>
                <price>21</price>
                <priceCurrency>EUR</priceCurrency>
            </priceDetails>
            <notionalAmountDetails>
                <notionalAmount>156240</notionalAmount>
                <notionalCurrency>EUR</notionalCurrency>
            </notionalAmountDetails>
            <quantity>
                <value>10</value>
                <unit>MW</unit>
            </quantity>
            <totalNotionalContractQuantity>
                <value>7440</value>
                <unit>MWh</unit>
            </totalNotionalContractQuantity>
            <actionType>E</actionType>
        </TradeReport>
    </TradeList>
</REMITTable1>
]]></elc:XmlData>
     </tem:request>
  </tem:SendMessage>
</soapenv:Body>
</soapenv:Envelope>


Je dois calculer le hash sur le tag body, après avoir fait une canonisation en c14n.

Et là SoapUI trouve : xAK/FTSK4eyiM9vX2V6DV9fAi+E=

Et mon script : aN7y/rSiIKzgh+RJzqRAA1zb3KE=

Mon code pour le calcul

// hash function
private function base64SHA1($str) {
    return base64_encode(sha1($str, true));
}
// Calcul le hash
private function setDigestValues() {
 
    $doc = new DOMDocument();
    $doc->loadXML($this->xml);
 
    foreach($doc->getElementsByTagName('Body') as $elm) {
        $this->data['BodyDigestValue'] = $this->base64SHA1($elm->C14N(true));
    }
 
}


Merci d'avance :)

1 réponse

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
4 déc. 2015 à 00:38
Bonjour,

Je ne sais pas comment est généré le SHA1 de ton document sur le serveur.... mais il se peut que la réponse se trouve là :

Use ASCIIEncoding instead of UnicodeEncoding. PHP uses ASCII charset for hash calculations.

0
cs_nitho Messages postés 130 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 8 décembre 2015
4 déc. 2015 à 12:12
il faudrait donc faire quoi à la place de

base64_encode(sha1($str, true)) ?
0
cs_nitho Messages postés 130 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 8 décembre 2015
8 déc. 2015 à 16:13
en fait le code c# du serveur est écrit avec la bibliothèque Basic128-Algorithm
0
Rejoignez-nous