GOST暗号化に基づくデジタル署名をサポートするWebサービス

バージョン2008.2以降、CachéとEnsembleは、SOAPメッセージの電子署名を検証および生成するメカニズムを含む、 WS-Securityの組み込みサポートを備えています。 現在、 RSAファミリーの暗号化アルゴリズムに基づくデジタル署名の「すぐに使える」サポートがあります。



ロシアの顧客向けに作成されたシステムでは、GOST暗号化アルゴリズムを使用する認定された暗号化情報保護ツールを使用する必要があります。 以下では、GOSTの暗号化に基づくデジタル署名で保護されたCachéWebサービスの開発へのアプローチの1つについて説明します。



認定された暗号情報保護システムとして、署名アルゴリズム-GOST R 34.10-2001とハッシュアルゴリズムGOST R 34.11-94を実装するJavaライブラリのセットであるCryptoPro JCP製品を使用します。



WindowsでのCryptoPro JCPのインストール



まず、システムサーバーにJava Runtime Environment (JRE)バージョン1.6以降をインストールします。



メーカーのWebサイトからCryptoPro JCP 配布キットをダウンロードし、サーバー上のフォルダーに解凍して、install.batインストールスクリプトを実行します。 スクリプトは、ディストリビューションのlibフォルダーにあります。 起動したら、JREへのパスを指定する必要があります。



install.bat "C:\ Program Files \ Java \ jdk1.6.0_20 \ jre"



ライセンスがある場合、スクリプトを実行すると、シリアル番号と会社名も表示されます。



install.bat "C:\ Program Files \ Java \ jdk1.6.0_20 \ jre" XXXXX-XXXXX-XXXXX-XXXXX-XXXXX "Your Company"



Windows 7では、インストールスクリプトは管理者権限で実行する必要があります。 スクリプトが完了したら、次のライブラリがjre \ lib \ extフォルダーに表示されることを確認します。

asn1rt.jar Jcp.jar JCPRevCheck.jar JCP_ASN.jar
AsnLite.jar JCPinst.jar JCPRevTools.jar JCryptoP.jar
forms_rt.jar JCPRequest.jar JCPxml.jar


追加のJavaライブラリ



CachéからJCPを操作するための多くのヘルパークラスを含むiscjcp.jarライブラリ( ここにソースがあります )が必要になります。 さらに、 Commons LoggingSantuario (別名XML Security)、 WSS4Jの 3つのオープンソースライブラリが必要になります 。 それらの使用は、 Apache Software License 2.0によって規制されています



リストされている4つのライブラリを含むjars.zipアーカイブをダウンロードし、jre \ lib \ extフォルダーに解凍します。



Windows 7を使用している場合、jre \ lib \ extフォルダー内のすべてのライブラリーを読み取って実行するためのアクセス権をEveryoneグループに付与する必要があります。



Javaゲートウェイを構成および実行し、クラスのプロジェクションを作成



Caché/ EnsembleからJavaクラスを呼び出せるようにするには、Javaゲートウェイを構成および実行し、使用するJavaクラスのプロジェクションを作成する必要があります。



SYS領域のJavaゲートウェイ設定テーブルに新しいエントリを追加します。



Net_Remote.ObjectGateway(名前、タイプ、サーバー、ポート、JavaHome)の値( 'JCPGate'、 '1'、 '127.0.0.1'、 '55555'、 'C​​:\ Program Files \ Java \ jdk1.6.0_20に挿入します\ jre ')



ここで、[名前]フィールドの値は「JCPGate」です。これは、新しいJavaゲートウェイの名前です。 「JavaHome」フィールドで、JCPがインストールされたJREへのパスを指定する必要があります。 [ポート]フィールドは、CachéからこのJavaゲートウェイと通信するために使用されるTCPポートを指定します。



これで、Cachéターミナルで次のコマンドを実行して、新しいJavaゲートウェイを開始できます。



##クラス(%Net.Remote.Service).StartGateway( "JCPGate")を記述します



停止するには、StopGatewayメソッドを呼び出します。



##クラス(%Net.Remote.Service).StopGateway( "JCPGate")を記述します



任意のエリアからJava Gatewayを起動/停止できます。



Webサービスが開発されているエリアに行き 、Cachéターミナルで次のコマンドを実行してisc.jcp.JcpFacade Javaクラスのプロジェクションを作成します。



do ##クラス(%Net.Remote.Java.JavaGateway)。%ExpressImport( "isc.jcp.JcpFacade"、 "55555")



ここで、55555は、Javaゲートウェイとの通信に使用されるTCPポート番号です。 このポートは、以前に%Net_Remote.ObjectGatewayテーブルにエントリを追加するときに指定されました。



着信SOAPメッセージのEDSを確認する



smev.JcpUtilsおよびsmev.JcpSignatureクラスのソースコードを含むiscjcp-cos-sources2012.zipアーカイブをダウンロードして解凍します。 Webサービスが開発されている領域に移動した後、Studioを使用してsmev.JcpUtilsクラスをCachéにインポートします。 Studioでインポートしたクラスを開き、JAVAGATEWAYPORTおよびJAVAGATEWAYSERVERパラメーターの値を編集して、使用するJavaゲートウェイのTCPポートとIPアドレスをそれぞれ指定します。 クラスをコンパイルします。



ここで、既存のWebサービスにデジタル署名チェックを追加するには、次のメソッドをWebサービスクラスに追加するだけです。



メソッドOnPreSOAP(モードAs%文字列、アクションAs%文字列、要求)
 {
   do ## super(モード、アクション、リクエスト)

   #dim stream As%Stream.Object = request

   '$ isObject(ストリーム)の場合
   {
     // MIME添付ファイルの場合
     #dim index As%Integer =%request.NextMimeData( "")
     set stream = $ select(index = "": ""、1:%request.GetMimeData(index))
   }

   $ isObject(ストリーム)の場合
   {
   #dim fault As%SOAP.Fault = ## class(s​​mev.JcpUtils).verifySignatureOnPreSoap(ストリーム)
     $ isObject(fault)set ..SoapFault = faultの場合
   }
 }


これは、2009.1以降、Caché/ Ensembleのバージョンで実行されています。 以下は、すべての着信SOAPメッセージの署名を検証するWebサービスの例です。



クラスtest.TestService Extends%SOAP.WebService
 {
  パラメーターSERVICENAME = "TestService";

  パラメーターNAMESPACE = "http:// test / wsdl";

  メソッドecho(リクエストAs%文字列)As%文字列[ProcedureBlock = 1、SoapAction = "urn:echo"、
        SoapBindingStyle = document、SoapBodyUse = literal、WebMethod]
   {
     リクエストをやめる
   }

  メソッドOnPreSOAP(モードAs%文字列、アクションAs%文字列、要求)
   {
     do ## super(モード、アクション、リクエスト)

     #dim stream As%Stream.Object = request

     '$ isObject(ストリーム)の場合
     {
       // MIME添付ファイルの場合
       #dim index As%Integer =%request.NextMimeData( "")
       set stream = $ select(index = "": ""、1:%request.GetMimeData(index))
     }

     $ isObject(ストリーム)の場合
     {
       #dim fault As%SOAP.Fault = ## class(s​​mev.JcpUtils).verifySignatureOnPreSoap(ストリーム)
       $ isObject(fault)set ..SoapFault = faultの場合
     }
   }
 }


Webサービスの送信SOAPメッセージのデジタル署名生成



次に、Webサービスのすべての応答に組織のEDSが署名する必要がある場合を検討します。 このような状況では、システムサーバーは、署名の生成に使用される秘密キーを含むリポジトリをホストします。 さらに、このキーに一致する証明書が利用可能でなければなりません。 iscjcp.jarライブラリーは、FloppyStoreタイプのストレージの処理を実装します。 したがって、EDSを形成するには、キーストアを備えた仮想ディスケットが必要です。



システムサーバー上の仮想ディスケットへの秘密鍵と証明書の配置



このようなディスケットを作成するには、次の手順を実行します。
  1. ImDDなど、FDDドライブをシミュレートするドライバーをインストールします。
  2. Windowsコントロールパネルから、「ImDisk Virtual Disk Driver」セットアッププログラムを実行し、次のパラメーターを使用してディスクを構成します。

    • ドライブ文字:A、
    • 仮想ディスクのサイズ:1メガバイト、
    • デバイスタイプ:フロッピー。
  3. FATファイルシステムで仮想ディスケットをフォーマットします。
  4. FDD.zipアーカイブの内容をドライブAに解凍します:\。


A:\サーバーディスクで説明した操作の結果、テスト秘密キーを含むキーストアができました。 A:\ SelfSigned.cerファイルは、秘密鍵と一致するテスト証明書です。



CryptoPro JCPを使用して、自分でキーと証明書を生成できます。 これらの手順は、製品ドキュメントに記載されています。



EDSの形成



以前にダウンロードしたiscjcp-cos-sources2012.zipアーカイブとCachéオブジェクトスクリプトのソースコードには、 smev.JcpSignatureクラスが含まれていました 。 スタジオを使用して、このクラスをCachéにインポートします。



Studioでsmev.JcpUtilsクラスを開き、 CERTFILENAMEパラメーターの値を証明書ファイルへのフルパス(「A:\ SelfSigned.cer」)で編集します。 この証明書は、デジタル署名の形成に使用される秘密鍵に対応します。 クラスをコンパイルします。



Webサービスメソッドで返されたメッセージのデジタル署名を作成する機能を追加するには、このメソッドのコードに次の行を挿入する必要があります。



do ..SecurityOut.AddElement(##クラス(smev.JcpSignature)。%New())



これは、2009.1から2012.1までのCaché/ Ensembleのバージョンで機能します。 以下は、応答署名がecho()メソッドに追加されるWebサービスの例です。



クラスtest.TestService Extends%SOAP.WebService
 {
  パラメーターSERVICENAME = "TestService";

  パラメーターNAMESPACE = "http:// test / wsdl";

  メソッドecho(リクエストAs%文字列)As%文字列[ProcedureBlock = 1、SoapAction = "urn:echo"、
        SoapBindingStyle = document、SoapBodyUse = literal、WebMethod]
   {
      do ..SecurityOut.AddElement(##クラス(smev.JcpSignature)。%New())
     リクエストをやめる
   }

  メソッドOnPreSOAP(モードAs%文字列、アクションAs%文字列、要求)
   {
     do ## super(モード、アクション、リクエスト)

     #dim stream As%Stream.Object = request

     '$ isObject(ストリーム)の場合
     {
       // MIME添付ファイルの場合
       #dim index As%Integer =%request.NextMimeData( "")
       set stream = $ select(index = "": ""、1:%request.GetMimeData(index))
     }

     $ isObject(ストリーム)の場合
     {
       #dim fault As%SOAP.Fault = ## class(s​​mev.JcpUtils).verifySignatureOnPreSoap(ストリーム)
       $ isObject(fault)set ..SoapFault = faultの場合
     }
   }
 }


Webサービスのテスト



上記のソースコードが提供されているtest.TestService Webサービスによるデジタル署名のチェック/形成をテストするには、次のアクションを実行します。



  1. Studioを使用して、smev。*クラスがインポートされた同じ領域にtest.TestServiceクラスを作成します。 上記のリストから新しいクラスのソースコードをコピーします。



  2. メモ帳を使用して、test.TestServiceサービスの着信SOAPメッセージの本文を含むファイルC:\ Temp \ input.xmlを作成します。



     <SOAP-ENV:Body wsu:Id = "id1"
             xmlns:SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/"
             xmlns:wsu = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
       <s0:echo xmlns:s0 = "http:// test / wsdl">
         <s0:request> Hello world!</ s0:request>
       </ s0:エコー>
     </ SOAP-ENV:ボディ>
    


    ファイルはUTF-8エンコードで保存する必要があります。 Bodyのルート要素のwsu:Id属性に注意してください。



    完成したinput.xmlファイルは、 xmls.zipアーカイブで入手できます。



  3. Cachéターミナルでsmev.JcpUtilsクラスのsignFile()メソッドを実行します。

    write ## class(s​​mev.JcpUtils).signFile( "id1"、 "C:\ Temp \ input.xml"、 "C:\ Temp \ output.xml"



    メソッドの動作の結果、署名されたSOAPメッセージ(エンベロープ)を含むファイルC:\ Temp \ output.xmlが作成されたことを確認します。ヘッダー(ヘッダー)にはWS-Security形式のデジタル署名が含まれ、本文はinput.xmlファイルから取得したXMLドキュメント。



    完成したoutput.xmlファイルは、 xmls.zipアーカイブで入手できます。



  4. 受信したSOAPメッセージをデジタル署名からtest.TestServiceサービスの入力に向けましょう。 これを行うには、Cachéターミナルで次のコマンドを実行します(必要に応じて、Webサーバーのポート「57772」を正しいポートに置き換え、最後から2番目のコマンドの「ユーザー」エリアに置き換えます)



      set httprequest = ## class(%Net.HttpRequest)。%New()
     httprequest.Server = "localhost"を設定します
     httprequest.Port = "57772"を設定します
     httprequest.WriteRawMode = 1を設定します
     httprequest.ContentType = "text / xml"を設定します
     httprequest.SetHeader( "SOAPAction"、 "urn:echo")を実行します
     set fileStream = ## class(%Library.FileBinaryStream)。%New()
     set fileStream.Filename = "C:\ Temp \ output.xml"
     httprequest.EntityBody.CopyFrom(fileStream)を実行します
     httprequest.Post( "/ csp / user / test.TestService.cls")を実行します
     httprequest.HttpResponse.OutputToDevice()を行う
    


    着信メッセージのデジタル署名が正常に検証され、発信メッセージの電子デジタル署名が生成された場合、次のタイプのWebサービス応答がターミナルウィンドウに表示されます。



    HTTP / 1.1 200 OK

    キャッシュ制御:キャッシュなし

    接続:閉じる

    コンテンツの長さ:2352

    CONTENT-TYPE:text / xml; 文字セット= utf-8

    日付:2011年12月1日木曜日20:08:40 GMT

    有効期限:木、1998年10月29日17:04:19 GMT

    PRAGMA:キャッシュなし

    サーバー:Apache

    SET-COOKIE:CSPSESSIONID-SP-57774-UP-csp-user- = 0000000100001odLLhtp000000igxIuSVnd12z6BtrSIFFJA--; パス= / csp /ユーザー/;



    <?xml version = "1.0" encoding = "UTF-8"?>

    <SOAP-ENV:エンベロープxmlns:SOAP-ENV = 'http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi = 'http://www.w3.org/2001/XMLSchema-instance' xmlns :s = 'http://www.w3.org/2001/XMLSchema' 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 '>

    <SOAP-ENV:ヘッダー>

    <セキュリティxmlns = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <ds:署名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/2001/04/xmldsig-more#gostr34102001-gostr3411" />

    <ds:参照URI = "#Body-B290AFEC-9812-49E4-9177-6D617D30622C">

    <ds:変換>

    <ds:変換アルゴリズム= "http://www.w3.org/2001/10/xml-exc-c14n#" />

    </ ds:変換>

    <ds:DigestMethod Algorithm = "http://www.w3.org/2001/04/xmldsig-more#gostr3411" />

    <ds:DigestValue> vs42sfoxCX8naSV2NnBSoIoCvUb1ydvvyNnp5XC7nKQ = </ ds:DigestValue>

    </ ds:リファレンス>

    </ ds:SignedInfo>

    <ds:SignatureValue>

    ES4aVXFSkHr1cnXUcdZYJTPTa + e5 // ASQRYhrRMy46pWSwRW93VxgrW + GhATD2xwK3l + 8T1Dfsi2

    beVfrkQS0g ==

    </ ds:SignatureValue>

    <ds:KeyInfo>

    <ds:X509Data>

    <ds:X509Certificate>

    MIIB9TCCAaSgAwIBAgIIRdAY3dqebKUwCAYGKoUDAgIEMCkxJzAlBgNVBAMeHgB0AC4AZQAuAG0A

    LgBwAEAAbQBhAGkAbAAuAHIAdTAeFw0xMTExMjkxMzQwMTFaFw0xMjExMjkxMzQwMTFaMCkxJzAl

    BgNVBAMeHgB0AC4AZQAuAG0ALgBwAEAAbQBhAGkAbAAuAHIAdTBjMBwGBiqFAwICEzASBgcqhQMC

    AiMBBgcqhQMCAh4BA0MABECebxtl5EDpwaWKy2MeJQ7v + NCiIRHiXBeqaqJnNi5AS4aW + 14FKKHH

    Llu7jjggB06d + / 4U29OtDbjfIkPqRUcio4GtMIGqMB0GA1UdDgQWBBTZ0qujqn + CC0O9L1aSv39a

    ga3EhDALBgNVHQ8EBAMCAcYwEwYDVR0lBAwwCgYIKwYBBQUHAwMwDwYDVR0TBAgwBgEB / wIBATBW

    BgNVHQEETzBNgBTz0qujqn + CC0O9L1aSv39aga3EhKErMCkxJzAlBgNVBAMeHgB0AC4AZQAuAG0A

    LgBwAEAAbQBhAGkAbAAuAHIAdYIIRdAY3dqebKUwCAYGKoUDAgIEA0EANUalM3ag0xYJ7MqzmCzh

    w8ejPqUds37UXKadbyqogZ2yJBMbhWUCsQFyZZZzfc6gXQbRThBTAftfdXxjW8Yusg ==

    </ ds:X509Certificate>

    </ ds:X509Data>

    </ ds:KeyInfo>

    </ ds:署名>

    </セキュリティ> </ SOAP-ENV:ヘッダー>

    <SOAP-ENV:Body wsu:Id = "Body-B290AFEC-9812-49E4-9177-6D617D30622C"> <echoResponse xmlns = "http:// test / wsdl"> <echoResult> Hello world!</ echoResult> < / echoResponse> </ SOAP-ENV:Body>

    </ SOAP-ENV:エンベロープ>







この記事で説明されているすべてのアクションは、次のビデオで見ることができます。




All Articles