バージョン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 Logging 、
Santuario (別名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(smev.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(smev.JcpUtils).verifySignatureOnPreSoap(ストリーム)
$ isObject(fault)set ..SoapFault = faultの場合
}
}
}
Webサービスの送信SOAPメッセージのデジタル署名生成
次に、Webサービスのすべての応答に組織のEDSが署名する必要がある場合を検討します。 このような状況では、システムサーバーは、署名の生成に使用される秘密キーを含むリポジトリをホストします。 さらに、このキーに一致する証明書が利用可能でなければなりません。 iscjcp.jarライブラリーは、FloppyStoreタイプのストレージの処理を実装します。 したがって、EDSを形成するには、キーストアを備えた仮想ディスケットが必要です。
システムサーバー上の仮想ディスケットへの秘密鍵と証明書の配置
このようなディスケットを作成するには、次の手順を実行します。
- ImDDなど、FDDドライブをシミュレートするドライバーをインストールします。
- Windowsコントロールパネルから、「ImDisk Virtual Disk Driver」セットアッププログラムを実行し、次のパラメーターを使用してディスクを構成します。
- ドライブ文字:A、
- 仮想ディスクのサイズ:1メガバイト、
- デバイスタイプ:フロッピー。
- FATファイルシステムで仮想ディスケットをフォーマットします。
- 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(smev.JcpUtils).verifySignatureOnPreSoap(ストリーム)
$ isObject(fault)set ..SoapFault = faultの場合
}
}
}
Webサービスのテスト
上記のソースコードが提供されているtest.TestService Webサービスによるデジタル署名のチェック/形成をテストするには、次のアクションを実行します。
- Studioを使用して、smev。*クラスがインポートされた同じ領域にtest.TestServiceクラスを作成します。 上記のリストから新しいクラスのソースコードをコピーします。
- メモ帳を使用して、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アーカイブで入手できます。
- Cachéターミナルでsmev.JcpUtilsクラスのsignFile()メソッドを実行します。
write ## class(smev.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アーカイブで入手できます。
- 受信した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:エンベロープ>
この記事で説明されているすべてのアクションは、次のビデオで見ることができます。