現在、リクエストをサーバーに送信する前に署名する必要がある WS クライアントを開発しています。この目的のために秘密鍵と証明書を持っていますが、セキュリティ ヘッダーに苦労しています。出力 XML の予想される構造は、次のようになります。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header><wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-
1.0.xsd"><wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"
ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="CertId-45..."
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-
1.0.xsd"> ... </wsse:BinarySecurityToken><ds:Signature Id="Signature-13"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI="#id-14">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>62...</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
...
</ds:SignatureValue>
<ds:KeyInfo Id="KeyId-...">
<wsse:SecurityTokenReference wsu:Id="STRId-..." xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-
wss-wssecurity-utility-1.0.xsd"><wsse:Reference URI="#CertId-..." ValueType="http://docs.oasis-
open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/></wsse:SecurityTokenReference>
</ds:KeyInfo>
</ds:Signature></wsse:Security></soapenv:Header>
<soapenv:Body wsu:Id="id-14" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
xmlseclibs を使用してみましたが、例がかなり基本的なものであるため、必要なすべての情報を含める方法がわかりません。
DIY の方法で手動でヘッダーを作成することもできると思いますが、できるだけシンプルに保ちたいと考えています。
手がかりはありますか?
追加情報
現在、このタスクに SoapClient を使用しています。問題は、これを正確に行う方法がわからないということです。私が送信している XML はそのコンテンツに署名する必要があり、手動で署名しました (c14n 関数を使用し、そのダイジェストを計算します..)。ただし、全身に対して同じことを行うには、生の XML にアクセスする必要があるため (おそらく)、うまくいかないと思います。
ハッキングを回避しようとしているため、SOAP ヘッダーを手動で作成しようとはしていません。実装しやすく、作業しやすいものを探しています。
現在、私のコードは次のようになっています (読みやすくするために最小限に抑えています)。
$context = stream_context_create(array(
'ssl' => array(
'verify_peer' => false,
'allow_self_signed' => true,
'ciphers'=>'SSLv3'
)
));
$client = new SoapClient($url, array(
//'connection_timeout' => 100,
/* 'passphrase' => $pass,
'local_cert' => $keystore,*/
'stream_context' => $context,
// 'connection_timeout' => 1,
'trace' => true,
'exceptions' => true
));
$soapBody = new \SoapVar($xml, \XSD_ANYXML);
try{
$client->__soapCall('SOMEACTION', array($soapBody));
}
catch (SoapFault $exception) {
echo $exception->getMessage();
}
変数には、xml
正しいことがわかっている XML コードが含まれています。SoapUI (キーとパスワードを入力する必要がありました) と、プロバイダーが提供しているオンライン テスト サービスの両方でテストされています。これは、送信されるデータが 100% 正しいことを意味します。
ただし、私の PHP コードは「Internal Error」で終了します。証明書の不足などに関係していると思います。応答から詳細情報を取得する方法があるかどうかはわかりませんが、上記のエラーに関するドキュメントはありません。
いくつかのオプションとキーストア、秘密鍵、および証明書をいくつかの形式でいじっていますが、肯定的な結果は得られません。正しいヘッダーが送信されていないという事実にすべて関係していると思います。
どうもありがとう。