SoapUI ProのWS-Security

さまざまな支払いゲートウェイの開発および他の統合問題の解決の分野(この技術の範囲はこれによって制限されるとは思わないが、この分野で遭遇した)Ws-security仕様(詳細な説明についてはdocs.oasis-を参照) open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0.pdf )。 この記事では、この仕様に従ってクライアント認証が実行されるWebサービスへのアクセスのケースを検討します。



2つの証明書(双方向SSL、もう1つはメッセージの署名用)を使用して、システム(システムとは、Webサービスへのアクセスを提供する支払いシステムまたは別の組織を意味します)と交換したとします。 このために、システムはあなたからの2つの証明書要求を必要とします。 「証明書と秘密キーの要求」の2つのペアを作成する必要があります。 これは、たとえばopensslユーティリティを使用して実行できます(ダウンロードリンクslproweb.com/products/Win32OpenSSL.html )。 その中で、コマンドを2回実行する必要があります。



openssl req -new -key privkey1.key -out request1.csr







(2回目はそれぞれprivkey2.keyとrequest2.csr)。 最終的に、2つの要求キーのペア(privkey1.keyとrequest1.csr、privkey2.keyとrequest2.csr)ができます。 2つの証明書リクエストをシステムアナリストに送信する必要があります。アナリストはこれらのリクエストに署名し、ストアに追加することにより、システムにアクセスするために* .crt形式で証明書を送り返します。 双方向sslを提供するために使用されるssl.crt証明書を、最初の要求と秘密キーのペアに対応させ、trust.crtを2番目のペアに対応させます。この証明書は、メッセージの署名に使用されます。

これらの証明書を受け取ったら、ブラウザからでもWebサービスが利用可能かどうか、および証明書がすべて正しいかどうかを確認できます。 これを行うには、キーストアに「プライベートキーと証明書」のペアを追加する必要があります。 ブラウザでは、pkcs12形式のストレージを使用します。 同じopensslで作成できます。 コマンドは次のとおりです。



openssl pkcs12 -export -in ssl.crt -inkey privkey1.key -out ssl.p12







当然、コマンドは、証明書ファイルと秘密鍵ファイルが置かれているディレクトリで実行する必要があります(またはフルパスを登録します)。 そのため、* .p12形式のファイルを取得しました。このファイルには、「プライベートキー証明書」のペアが含まれています(最初のペアssl.p12から、2番目からtrust.p12)。 リポジトリに存在する要素を確認するには、標準のopensslコマンドを使用できますが、Keystore Explorerプログラム(http://keystore-explorer.sourceforge.net/)を使用することをお勧めします。 リポジトリに証明書とプライベートキーのペアが複数ある場合、それらを識別するために必要なエイリアスを指定できます。



この記事では、Webサービスとメッセージを交換し、システムにクライアントの認証を実装するプログラミング言語(JavaおよびC#で実装)でのクライアントの開発は考慮していません。 この時点で、開発に着手する前に、証明書に問題があり、署名が正しく機能するかどうかをツールで確認することをお勧めします。

認証と署名を確認するには、SoapUI Proバージョン4.5.1を使用します。 最初に、SSL証明書をSoapUI設定に追加して、安全なチャネルにWebサービスを提供する必要があります。 このバージョンのプログラムでは、これは次のように行われます:ファイル->設定-> SSL設定。 私は英語版を持っているので、すべての用語は英語です。 [キーストア]フィールドで、ssl.p12リポジトリへのパスを指定します。 [キーストアのパスワード]フィールドで、ストアの作成時に設定したパスワードを指定します。 パスワードなしでリポジトリを作成すると失敗します。秘密鍵が含まれているため、これは実行できません。 [OK]をクリックすると、SSL構成が完了します。



その後、いわゆるusernametoken、その署名、およびメッセージ本文の署名を構成する必要があります。 ユーザー名トークンの署名と可用性は、セキュリティ要件とトークンによる認証の可用性によってサーバー上で決定されます。 SoapUIでのサインアップについては、SoapUI自体のWebサイト(www.soapui.org/SOAP-and-WSDL/applying-ws-security.html)で詳細に説明されています。 どこかで繰り返し、どこかで自分自身を追加して、記事を続けます。



I)署名を作成するために、キーと証明書のペアにストレージを追加します。







到着したメッセージの正しい署名をチェックしない場合、トラストストアに何も追加する必要はありません。 ここでは、メッセージに署名するために特別に作成されたため、trust.p12リポジトリを追加しました。 また、* .jks(java keystore)など、他の形式のリポジトリを使用することもできます。



II)Webサービスに送信するときにSOAP要求に適用する構成を作成します。 これを行うには、[発信WS-Security構成]タブで、[新しいWSS構成の追加]をクリックします。 発信と呼びます。







III)ユーザー名トークンを構成に追加します。

クライアントの電話番号がクライアントの識別子として使用される場合、電話番号、つまりシステムでのクライアントのログインを書き込みます。 パスワードがある場合は、「パスワードの種類」->「PasswordDigest」を選択して、メッセージに暗号化された形式で表示されるようにします。







IV)SOAPメッセージの2つの部分(usernametokenとBody)に署名することを前提としているため、2つの署名を作成する必要があります。 これを行うには、ユーザー名とともに、2つのSignature要素を追加します。



V)最初の署名はUsernameTokenに署名するためのものです:







図に示すように、すべての設定(ケースの設定は異なる場合があります)、リポジトリからのパスワードを、署名するSOAPメッセージの部分を登録する部分に書き留めます。 UsernameTokenの名前空間:

docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd



VI)2番目の署名(Body SOAPメッセージ部分)の、Parts部分のみの最初の署名との違い:







本文の名前空間:

schemas.xmlsoap.org/soap/envelope

これで、認証のセットアップと署名が完了しました。 SoapUIでSOAPメッセージを形成し、それに必要な構成を選択します(発信wssに関して)。







メッセージを送信する場合、SoapUI自体がユーザー名トークンと2つの署名を追加します。 どのメッセージが送信されているかを確認するには、 posttestserver.com / post.phpサービスの名前をエンドポイントに追加します。応答には、リクエストを含むページへのリンクが含まれます。 元のSOAP要求は次のようなものです。



 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <soapenv:Body wsu:Id="id-17" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <findSomething/> </soapenv:Body> </soapenv:Envelope>
      
      







署名済みのリクエストは次のようになります。



 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <ds:Signature Id="SIG-21" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:SignedInfo> <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/> <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> <ds:Reference URI="#id-17"> <ds:Transforms> <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> <InclusiveNamespaces PrefixList="" xmlns="http://www.w3.org/2001/10/xml-exc-c14n#"/> </ds:Transform> </ds:Transforms> <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <ds:DigestValue>wU/JToBU67+gCBtfb2+gYL1w9zY=</ds:DigestValue> </ds:Reference> </ds:SignedInfo> <ds:SignatureValue>Ez94qqmkV642l3jIy+8PS8lozO+VtEbMZvYZv3inNV4QCZBsRCmQ9IvGcUhfMXnDlqukXaa+zRwr dW8tVOW9vkc9DVgzeFGMSREvP2BUuqB6HzZKCGeec3Jihlc59EyuHwyiz5+18jObuyD18Mtb7T90 7adQsDVSBmQGLydX/tfptopmykYfUpRYTh0sMCcRH7J4B51RrecBs6rK9GJEslWTeW2tGgxpxQJ4 Y690rzkrR6AT6h7t4HBD6JltQUi9xwsjpnQ0j0ReSiK+jNNf99pBl7iiEPc9Kzrc8vNKRacbTfm4 /EE9xP6qu61hBxFQpmpWTRt+SmvVCkDOkBAGew==</ds:SignatureValue> <ds:KeyInfo Id="KI-7D1A45FAAA5C9F47FD138788868310035"> <wsse:SecurityTokenReference wsu:Id="STR-7D1A45FAAA5C9F47FD138788868310036"> <wsse:KeyIdentifier 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#X509SubjectKeyIdentifier">lPhvPtZSH+7TfXO2TMEIe0jlDQw=</wsse:KeyIdentifier> </wsse:SecurityTokenReference> </ds:KeyInfo> </ds:Signature> <ds:Signature Id="SIG-20" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:SignedInfo> <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/> <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> <ds:Reference URI="#UsernameToken-19"> <ds:Transforms> <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> <InclusiveNamespaces PrefixList="soapenv" xmlns="http://www.w3.org/2001/10/xml-exc-c14n#"/> </ds:Transform> </ds:Transforms> <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <ds:DigestValue>Bbt473ZLc41VKtiEZbMI+q+sFZY=</ds:DigestValue> </ds:Reference> </ds:SignedInfo> <ds:SignatureValue>F/K6Lgw3P40hFo1ifYY894V5HpVCvns8P4mbeR9pZfTVg4MH/hZf0+KKfKnURTTwS8Rw9MlOM9gG rwkk0hEANxraZHcMIuopWJlvf6sBkykyVSgrAFCHhqjVdAb7bacv7P6U4wHjY1PNRFWMYSUavewq KN08xp80lH30SEMIZznKX6pUuRBllEUTIvRMaR62z1GcNkLWLf5hadUGbv8Qdssj1BL5SY2zin3d hAPFlobMzMUVh019h4Eg0ljWrtFAhHZMOJouZKVYr6ldsPaMiIm9QYTArPoh4fH/rdIIiDT6SVHr e8v0fdywWnapepGyFDJa1ltUXw+JrqBm579PsQ==</ds:SignatureValue> <ds:KeyInfo Id="KI-7D1A45FAAA5C9F47FD138788868306932"> <wsse:SecurityTokenReference wsu:Id="STR-7D1A45FAAA5C9F47FD138788868306933"> <wsse:KeyIdentifier 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#X509SubjectKeyIdentifier">lPhvPtZSH+7TfXO2TMEIe0jlDQw=</wsse:KeyIdentifier> </wsse:SecurityTokenReference> </ds:KeyInfo> </ds:Signature> <wsse:UsernameToken wsu:Id="UsernameToken-19"> <wsse:Username>9035153503</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">sTK/zTQP+BthB9Ag9uYsPXCn2Q8=</wsse:Password> <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">wuPL8u2jN8p3T4u0oAZTiQ==</wsse:Nonce> <wsu:Created>2013-12-24T12:38:03.065Z</wsu:Created> </wsse:UsernameToken> </wsse:Security> </soapenv:Header> <soapenv:Body wsu:Id="id-17" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <findAllPersonalAccounts/> </soapenv:Body> </soapenv:Envelope>
      
      







ご覧のとおり、2つの署名<Signature ...> ...と1つの<wsse:UsernameToken ...> ... </ wsse:UsernameToken>があります。 <soapenv:Body wsu:Id = "id-17" ...から、<ds:Reference URI = "#id-17">からわかるように、最初の署名はBodyを参照します。 2番目の署名URI = "#UsernameToken-19"。




All Articles