eToken-EPGUプラグインを使用して電子デジタル署名を作成する

これは、 状態サービスの統一ポータル (EPGU)およびeToken-GOSTデジタル署名のハードウェアキーに関する以前の投稿で取り上げたトピックの続きです。

まず、レーキの伝統的な説明。



クエスト番号1



トークンを受け取った後、私はそれから鍵証明書を抽出したかったので、その場合は、デジタル署名をチェックするために関係者にそれを与えることができました。

最初のレーキ-SDK 4.55もSDK 5.1も、eToken GOSTが初期化され、既存のキーであると認識したくありませんでした。

2番目のレーキ-CryptoPro 3.6-も。 奇妙なこと-証明書の形式では、キーがCryptoPro CSP 3.6によって生成されたことが示されました。

少なくともトークンのコンテンツへのアクセスに役立つ真実を探して、AladdinのJC-Webプラグインに出会いました。

プラグインはトークンを認識し、SNを発行しました。ID= 3で番号が1で、名前が「Certificate」の証明書のリストです。 しかし、もうありません。 PINをフィードしようとしたか、データを署名に転送しようとしたため、例外が発生しました。

最後の希望は残った-承認目的でEPGUによって使用されるプラグインを選択すること。 本質的に同じJC-Webで、はるかに単純です。

そして、私は州のサービスのウェブサイトに登りました。





クエスト番号2



クエスト番号2ははるかに簡単であることが判明しました。

パブリックサービスポータルのメインページを発見すると、プラグインには2つの基本的なJSメソッドがあることがわかりました。etgSignDataとetgGetCertificateです。 また、プロパティetgErrorCode、有効およびバージョンがありますが、後者の些細さのため、私はそれらを考慮しません。

EPGUの実装のこれらのメソッドは、Webページのコンテキストでプラグインへのアクセスを簡素化する関数でラップされています。

少し調整して、正直にコピーしました。

その結果、次のことができるシンプルなWebページが得られました。a)トークン所有者証明書(Base64で発行)を引き出して、データに署名します。 署名は、Base64エンコードでラップされたPKCS#7の形式でも形成されます。

EPGUプラグインを介してeToken GOSTを操作するためのサンプルページのコード
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <!--      --> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>  eToken    </title> </head> <body style="font-size: 11px; font-family: Verdana;"> <!--    --> <object id="etoken" type="application/x-csuser" width="0" height="0" style="overflow: hidden; float: left;"> <!--<param name="onload" value="pluginLoaded" />--> </object> <script type="text/javascript" language="javascript"> /** * Operations with eToken GOST using CSuser plugin * **/ //    .   -  ,  - -  //   1   (PKCS#7,   Base64),   5 -   window.SignDataByEToken = function(mess, pin) { var plugin = eTokenPlugin(); if (plugin.valid) { //  var return_array = new Object(); return_array[1] = ""; //cms(base64) return_array[5] = ""; //errorCode if (mess == "") { alert("   "); return return_array; } try { //  CMS return_array[1] = eTokenPlugin().etgSignData(1, 1, pin, mess, 0); if (eTokenPlugin().etgErrorCode == 28) return_array[1] = eTokenPlugin().etgSignData(1, 99, pin, mess, 0); } catch (e) { alert("  \r\n" + e.description); return return_array; } try { //    return_array[5] = eTokenPlugin().etgErrorCode; } catch (e) { alert(e.description); return return_array; } return return_array; } } //     .   - - .    Base64 window.GetCertificateByEToken = function(pin) { var cert = null; try { if (eTokenPlugin().valid) { cert = eTokenPlugin().etgGetCertificate(1, 1, pin); if (eTokenPlugin().etgErrorCode == 28) { cert = eTokenPlugin().etgGetCertificate(1, 99, pin); } } } catch (e) { alert(e.description); } return cert; } //     window.eTokenPlugin = function() { return document.getElementById("etoken"); }; //   .      window.checkPluginVersion = function(version) { if (!(eTokenPlugin() && eTokenPlugin().valid)) return false; var plugin_version = eTokenPlugin().version.split('.'); var portal_version = version.split('.'); if (isNaN(parseInt(plugin_version[0]))) return false; if (isNaN(parseInt(plugin_version[1]))) return false; if (isNaN(parseInt(plugin_version[2]))) return false; if (isNaN(parseInt(portal_version[0]))) return false; if (isNaN(parseInt(portal_version[1]))) return false; if (isNaN(parseInt(portal_version[2]))) return false; if (parseInt(plugin_version[0]) > parseInt(portal_version[0])) return true; if (parseInt(plugin_version[0]) < parseInt(portal_version[0])) return false; if (parseInt(plugin_version[1]) > parseInt(portal_version[1])) return true; if (parseInt(plugin_version[1]) < parseInt(portal_version[1])) return false; if (parseInt(plugin_version[2]) == 11 && parseInt(portal_version[2]) == 9) return false; //9>11 O_o if (parseInt(plugin_version[2]) > parseInt(portal_version[2])) return true; if (parseInt(plugin_version[2]) < parseInt(portal_version[2])) return false; return true; } // ,    function doLogin() { var PIN = document.getElementById("pin").value; var rd = document.getElementById("cleartext").value; var cert = GetCertificateByEToken(PIN); var ds = SignDataByEToken(rd, PIN); var dstext = ""; document.getElementById("cert").value = cert; for (name in ds) { dstext = dstext + name + " : " + ds[name] + "\r\n"; } document.getElementById("dsig").value = dstext; } </script> <!-- UI --> <div> <a id="btnLogin" onclick="doLogin();" style="border : solid 1px black; width : 140px; height : 40 px;" href="#"></a><br/><br/> <b>PIN-</b><br/> <input type="password" id="pin" style="width : 250px; border : solid 1px black;"/><br/><br/> <b></b><br/> <input type="text" id="cleartext" style="width : 250px; border : solid 1px black;"/><br/><br/> <b></b><br/> <input type="text" id="cert" style="width : 250px; border : solid 1px black;"/><br/><br/> <b></b><br/> <textarea id="dsig" style="width : 600px; height : 300px; border : solid 1px black;"></textarea><br/><br/> </div> </body> </html>
      
      










All Articles