GISユーティリティとの相互作用を確立するという課題に直面しました。
文書によると、トンネルを暗号化し、GOSTに従ってEDSを形成するために、よく知られている国内のソフトウェアを使用することになっていますが、これは私たちの方法ではありません。 Googleとコンソールで武装し、私と
slavamは利用可能なツールで必要な機能を実装しました。
必要なソフトウェアはすべて、LinuxプラットフォームとWindowsプラットフォームの両方で利用できるため、この手法はマルチプラットフォームと呼ばれます。
- 準備する
- GOSTによる暗号トンネル
- XMLDSigの形成
- 参照資料
準備する
相互作用は、次の部分で構成されます。
- GISユーティリティサーバーへの暗号化されたトンネルのGOSTインストール。
- 署名されたXML要求の形成と送信。
- 応答を受信して確認します。
作業には、CentOS 6サーバー、Python 2.7.11、OpenSSL + GOSTエンジン、stunnelが使用されます。 GOSTをサポートするopensslのクイックインストールガイド
複雑なことは何もないはずで、すべてがすでに何百回も説明されていると思います。 また、最近のディストリビューションでは、
gostモジュールはすぐに使用できます。
OpenSSLは2つの方法で使用されます。stunnelはGSSLに従って構築されるため、GOSTに従って動作します。 また、
openssl
ユーティリティは、署名を生成および検証するためにPythonコードから呼び出されます。 opensslの呼び出しは、使用されている暗号モジュールを設定することがPythonコードから可能でなかったという事実によるものです。 必要なソフトウェアはすべて、LinuxプラットフォームとWindowsプラットフォームの両方で利用できるため、この手法はマルチプラットフォームと呼ばれます。
Pythonの場合、CentOS 6サーバーはlxmlライブラリを更新する必要があります。これを行うには、いくつかの追加パッケージをインストールします。
PKCS12(.pem)形式の証明書と秘密キーファイルも必要です。 P12FromGostCSPなどのユーティリティを使用して、または
手動で eTokenから取得できます。 何らかの理由でこれができない場合は、
「Rutoken EDS」キーを
直接操作するオプションです。 このサイトには、OpenSSLとstunnelを教える方法に関する詳細な手順があります。 したがって、タスクは前のタスクに削減されます。 そのような鍵は手元になかったので、確認できませんでした。
GOSTによる暗号トンネル
トンネルは、プロキシモードで動作する
Stunnelを使用して上がります。 あなたは彼にgostモジュールの使い方を教える必要があります。 ただし、少し時間がかかります。モジュールを正しく初期化するには、ソースをわずかに修正する必要があります。 私が理解しているように、問題はモジュールとメソッドの初期化順序に関連しています。 だから:
src / options.cファイルを編集し、関数「
NOEXPORT char *engine_init(void)
」の最後に
SSL_library_init()呼び出しを追加します
。 。
次のようになります。 NOEXPORT char *engine_init(void) { if(engine_initialized) return NULL; s_log(LOG_DEBUG, "Initializing engine #%d (%s)", current_engine+1, ENGINE_get_id(engines[current_engine])); if(!ENGINE_init(engines[current_engine])) { if(ERR_peek_last_error()) sslerror("ENGINE_init"); else s_log(LOG_ERR, "Engine #%d (%s) not initialized", current_engine+1, ENGINE_get_id(engines[current_engine])); return "Engine initialization failed"; } #if 0 if(!ENGINE_set_default(engines[current_engine], ENGINE_METHOD_ALL)) { sslerror("ENGINE_set_default"); return "Selecting default engine failed"; } #endif s_log(LOG_INFO, "Engine #%d (%s) initialized", current_engine+1, ENGINE_get_id(engines[current_engine])); SSL_library_init(); engine_initialized=1; return NULL; }
ここで解決策が
見つかりました 。
以前にアセンブルされたOpenSSLの接続でアセンブルします。
設定ファイル
/etc/stunnel.conf :
client=yes
証明書ファイルを
/ etc / crypto /ディレクトリに配置します。 一般に、stunnelはどのユーザーでも機能しますが、rootになりましょう。
たとえば、実行して確認することができます
出力が完全に異なる場合は、ログファイル
/var/log/stunnel.logを注意深く調べます。
XMLDSigの形成
GISハウジングおよび共同サービスサーバーへのトンネルが構成されて機能している場合、そこにあらゆる種類のリクエストを送信し、必要な回答を得ることができます。 要求はXMLDSigの形式で送信されます。XMLDSigには、要求自体、この要求のハッシュ、証明書ハッシュ、証明書自体、証明書ハッシュを含む要求ハッシュの署名、およびすべてを記述するフィールドの束が含まれます。 最も難しかったのは、チェーン全体を解き、XMLを取得することでした。これは、GISユーティリティによって正常にテストされます。 すべての署名済みブロックは標準形式で取得され、受信した署名とハッシュ量はBASE64でエンコードされます。
XMLDSig生成アルゴリズムは、便利なプログラミング言語を使用して実装できます。 python 2.7.11を使用しました。デモコードが添付されています。 例として、コンソールのアナログも提供します。
0.証明書から、発行者に関するシリアル番号と情報が取得され、必要なIDが生成され、現在の時間が記憶されます。
1.任意の石鹸クライアント(Pythonの泡など)を使用して、GISユーティリティサーバーに対してSOAP要求が生成されます。
SOAPリクエストの例: <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:ns0="http://dom.gosuslugi.ru/schema/integration/8.7.0.3/nsi/" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header> <RequestHeader xmlns="http://dom.gosuslugi.ru/schema/integration/8.7.0.4/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Date>2016-04-11T14:28:28</Date> <MessageGUID>29f93de1-25b6-21e5-24ae-2c6f65dfe2b2</MessageGUID> <SenderID>4eb0a7d6-6317-45cf-8974-10e75cbb0cbc</SenderID> </RequestHeader> </SOAP-ENV:Header> <ns1:Body> <ns0:exportDataProviderNsiItemRequest Id="signed-element"> <ns0:RegistryNumber>51</ns0:RegistryNumber></ns0:exportDataProviderNsiItemRequest> </ns1:Body> </SOAP-ENV:Envelope>
ここで、
SenderID
は、要求が行われた管理会社の識別子です。
MessageGUID
は、必要に応じて生成される一意のIDです。 本体
<ns1:Body>
は、追加フィールドを持つリクエスト自体です。
Id="signed-element"
-要求ID。要求に応じて指定し、要求に署名するときに焦点を合わせます。
2.
<ns1:Body>
タグの内容(より正確には、IDがあり、最初と最後の改行文字がない部分)が取得され、C14Nアルゴリズムによって正規化され(排他= True)、ハッシュ合計がGOSTに従って計算され、BASE64の形式で表示されます。
digest1
を
digest1
。 コンソールアナログ:
* GOSTサポート付きのopenssl。 エンジンは明示的に指定されますが、openssl.cnfをセットアップすることにより、これを停止できます。
3. x509の証明書が取得され、BASE64からデコードされ、そこからハッシュ量が考慮され、出力がBASE64でエンコードされます。
digest2
を
digest2
。
4.取得したデータを使用して、
<xades:SignedProperties>
タグのコンテンツが
<xades:SignedProperties>
(テンプレートを参照)、C14Nアルゴリズムによって正規化され(排他= False)、
digest3
(BASE64)がコンテンツと見なされます。
5.
<ds:SignedInfo>
ブロックが
<ds:SignedInfo>
れ、C14Nアルゴリズムによって正規化され(排他的= False)、BASE64で署名およびエンコードされます。
<ds:SignatureValue>
ブロックの値が判明します。 コンソールアナログ:
cat SignedInfo.xml | openssl dgst -sign private.key -engine gost -md_gost94 -binary | base64
ここで、SignedInfo.xmlはすでに最後の改行なしの正規化されたブロックです。
6.得られたすべての値は
XAdES-BES形式のXMLドキュメントテンプレート: <ds:Signature Id="xmldsig-{signature_id}" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:SignedInfo> <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"/> <ds:Reference Id="xmldsig-{signature_id}-ref0" URI="#{signed_id}"> <ds:Transforms> <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> </ds:Transforms> <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/> <ds:DigestValue>{digest1}</ds:DigestValue> </ds:Reference> <ds:Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#xmldsig-{signature_id}-signedprops"> <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/> <ds:DigestValue>{digest3}</ds:DigestValue> </ds:Reference> </ds:SignedInfo> <ds:SignatureValue Id="xmldsig-{signature_id}-sigvalue"> {signature_value} </ds:SignatureValue> <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:X509Data> <ds:X509Certificate> {x590_cert} </ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> <ds:Object><xades:QualifyingProperties Target="#xmldsig-{signature_id}" xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" xmlns:xades141="http://uri.etsi.org/01903/v1.4.1#"><xades:SignedProperties Id="xmldsig-{signature_id}-signedprops"><xades:SignedSignatureProperties><xades:SigningTime>{signing_time}</xades:SigningTime><xades:SigningCertificate><xades:Cert><xades:CertDigest><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/><ds:DigestValue>{digest2}</ds:DigestValue></xades:CertDigest><xades:IssuerSerial><ds:X509IssuerName>{x509_issuer_name}</ds:X509IssuerName><ds:X509SerialNumber>{x509_sn}</ds:X509SerialNumber></xades:IssuerSerial></xades:Cert></xades:SigningCertificate></xades:SignedSignatureProperties></xades:SignedProperties></xades:QualifyingProperties></ds:Object> </ds:Signature>
このテンプレートは、GISユーティリティの使用を推奨する
複合体を選択して分析することで作成できました。 それ自体は無料で入手できますが、CryptoPro CSP CIPとTrusted Java 2.0 CIPIが必要です。
7.このようにして作成された署名を検証するには、すべての操作を逆の順序で実行する必要があります。 コンソール署名検証オプション:
ここで、signature.sigはBASE64からデコードされた署名であり、SignedInfo.xmlはチェック済みブロック
<ds:SignedInfo>...</ds:SignedInfo>
です。 ハッシュ値は単純に比較されます。
Pythonのデモコードは
、ここから (独自の危険とリスクで)使用でき
ます 。 コードの作成者はVyacheslav(@ slavam、RO)です。 同様のアルゴリズムは、追加のツールやコンポーネントを購入することなく、便利な言語を使用して実装できます。 コードからOpenSSLユーティリティを呼び出すのは面倒ですが、LinuxとWindowsプラットフォームの両方で機能し、CryptoProと追加コンポーネントの使用を排除します。
GISハウジングおよび共同サービスとの対話システムはまだ作成段階ですが、結果のXMLDSigは必要なチェックに合格します。
この記事により、誰かがそのような自転車を簡単に実装できるようになることを願っています。
UPDGISユーティリティとの相互作用の順序で変更が発生しています。 現在の規則
はウェブサイトで見つけることができます。 主な変更:
- ここで、システムを使用するには、IPを登録する必要があります。
- リクエストを送信する前に、基本認証を実行する必要があります。
- テストベンチを使用するには、申請する必要もあります。
また、かなりのプログラミング例が登場しました(試してみれば)OpenSSLと友達になれます。
UPD2GOSTサポートのあるWindowsでOpenSSLを取得するには、次のものが必要です。
1.
ここから OpenSSL
をインストールします。すでにGOSTがサポートされています
gost.lib
フォルダーには、対応するライブラリ
gost.lib
ます。
2.構成ファイルで、その使用を明示的に示します。
openssl_conf = openssl_def [openssl_def] engines = engine_section [engine_section] gost = gost_section [gost_section] engine_id = gost dynamic_path = ./gost.dll default_algorithms = ALL
OpenSSLが構成を読み取る場所を正確に判断するには、環境変数を設定できます。
set OPENSSL_CONF=C:\OpenSSL-Win32\openssl.cnf
3.結果を確認します。
C:\OpenSSL-Win32\bin>openssl.exe ciphers -v | find /I "gost" GOST2001-GOST89-GOST89 SSLv3 Kx=GOST Au=GOST01 Enc=GOST89(256) Mac=GOST89 GOST94-GOST89-GOST89 SSLv3 Kx=GOST Au=GOST94 Enc=GOST89(256) Mac=GOST89
ご清聴ありがとうございました。
リンク集