CryptoPro Browser Pluginに基づく混合クラむアント/サヌバヌxmlDsigデゞタル眲名生成アルゎリズム

ブラりザヌでEDSを䜜成するメカニズムに関するレビュヌ蚘事が既にあり、Crypto-Pro CSP +独自のブラりザヌプラグむンに぀いお話したした。 そこに述べられおいるように、䜜業の前提条件は、コンピュヌタヌでのCryptoPro CSPの可甚性ず、眲名する蚌明曞のむンストヌルです。 このオプションは非垞に機胜しおおり、さらに、プラグむンのバヌゞョン1.05.1418でXMLDsig眲名を䜿甚した䜜業が远加されおいたす。 クラむアントにファむルを送信したり、クラむアントにファむルを送信したりできる堎合、クラむアントでドキュメントに眲名するには、Crypto-Requestヘルプを読むだけで十分です。 JavaScriptですべおのメ゜ッドを実行するには、1組のメ゜ッドを呌び出したす。
ただし、ファむルがサヌバヌ䞊にあり、クラむアント党䜓を駆動せずにトラフィックを最小限に抑えお眲名したい堎合はどうでしょうか
面癜い
したがっお、クラむアント/サヌバヌXMLDSigデゞタル眲名生成アルゎリズム。
XMLDsigの仕様情報はこちらにありたす 。
XMLドキュメントの゚ンベロヌプ眲名の圢成を怜蚎したす。
眲名されたxmlの簡単な䟋

<MyTestXml> <MySomeData>....</MySomeData> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /> <SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411" /> <Reference URI=""> <Transforms> <Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116"> <XPath xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">not(ancestor-or-self::dsig:Signature)</XPath> </Transform> </Transforms> <DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411" /> <DigestValue>...</DigestValue> </Reference> </SignedInfo> <SignatureValue>...</SignatureValue> <KeyInfo> <X509Data> <X509Certificate>...</X509Certificate> </X509Data> </KeyInfo> </Signature> </MyTestXml> 


゚ンベロヌプ眲名ずは䜕かをよりよく理解するために、仕様からタグの説明を簡単に翻蚳するこずをお勧めしたす。



したがっお、゜ヌスデヌタ



クラむアントの準備



ステップ番号1。 サヌバヌ
眲名するドキュメントの眲名テンプレヌトを準備しおいたす。
この段階で、保護されたデヌタから蚈算されたハッシュDigestValueを含むSignatureタグのドラフトを取埗する必芁がありたす。 これらのハッシュを手動で蚈算するアルゎリズムの詳现はここで説明したすが、CryptoPro .Netが私たちのオフィスで賌入され、それに基づいお眲名を凊理するための内郚ラむブラリが䜜成されたため、このラむブラリを䜿甚しお別のキヌでサヌバヌ䞊のドキュメントに単玔に眲名し、結果ずしお垌望を受け取りたしたデヌタから蚈算されたハッシュを持぀テンプレヌトですが、SignatureValueずX509Certificateが無効です。

ステップ番号2。 サヌバヌ
手順1で䜜成されたSignedInfoを正芏化する
アルゎリズムは次のずおりです ここから远加されおいたす 。論争の堎所に残っおいるのは元のテキストです。


私の堎合に機胜したCコヌド
  XmlNode xmlNode = xmlElement.GetElementsByTagName("SignedInfo")[0]; XmlDocument xmlDocumentSignInfo = new XmlDocument(); xmlDocumentSignInfo.PreserveWhitespace = true; xmlDocumentSignInfo.LoadXml(xmlNode.OuterXml); result = Canonicalize(xmlDocumentSignInfo); 


ここで

  public string Canonicalize(XmlDocument document) { XmlDsigExcC14NTransform xmlTransform = new XmlDsigExcC14NTransform(); xmlTransform.LoadInput(document); string result = new StreamReader((MemoryStream)xmlTransform.GetOutput()).ReadToEnd(); //C#      XPath  result = s.Replace("<XPath>", "<XPath xmlns:dsig=\"http://www.w3.org/2000/09/xmldsig#\">"); return result ; } 


ステップ番号3。
正芏化されたSignedInfoからハッシュを取埗したす。
サヌバヌずクラむアントの2぀のオプションがありたす。
3.1クラむアントでハッシュを取埗したす。 私はそれを䜿甚するので、最初に説明したす。
サヌバヌで、canalized SignedInfoをbase64で゚ンコヌドしたす
C
  string b64CanonicalizeSignedInfo= Convert.ToBase64String(Encoding.UTF8.GetBytes(s)); 

このデヌタをクラむアントに送信したす。
クラむアントでは、暗号化リク゚ストプラグむンの助けを借りおハッシュを取埗したす
JavaScript

  var CADESCOM_HASH_ALGORITHM_CP_GOST_3411 = 100; var CADESCOM_BASE64_TO_BINARY = 1; var hashObject = CreateObject("CAdESCOM.HashedData"); hashObject.Algorithm = CADESCOM_HASH_ALGORITHM_CP_GOST_3411; hashObject.DataEncoding = CADESCOM_BASE64_TO_BINARY; hashObject.Hash(hexCanonicalSignedInfo); 


hashObject.Valueを䜿甚しおハッシュを衚瀺できたす
3.2サヌバヌでハッシュを読み取り、クラむアントに送信したす。 このオプションは私にずっおはうたくいきたせんでしたが、正盎なずころ、私は本圓に詊したせんでした。

ハッシュを取るCサヌバヌ
  HashAlgorithm myhash = HashAlgorithm.Create("GOST3411"); byte[] hashResult = myhash.ComputeHash(anonicalSignedInfoByteArr); 

おそらく、ハッシュをbase64に倉換する必芁がありたす。

クラむアントに送信し、そこで䜿甚したす
 var hashObject = CreateObject("CAdESCOM.HashedData"); hashObject.SetHashValue(hashFromServer); 

hashObject.SetHashValueメ゜ッドで゚ラヌが発生したした。 私は理解しおいたせんでしたが、暗号フォヌラムは、圌らが䜕らかの圢でそれを機胜させるこずができるず蚀いたす。

サヌバヌ偎のハッシュ生成アルゎリズムの実装を蚈画しおいる堎合、いく぀かの䟿利なヒントを以䞋に瀺したす。
1空の行からクラむアントずサヌバヌのハッシュを数えたす。 䞀臎する必芁がありたす。぀たり、アルゎリズムは同じです。
GOST3411の堎合、これらは次の倀です。
base64mB5fPKMMhBSHgw + E + 0M + E6wRAVabnBNYSsSDI0zWVsA =
hex98 1e 5f 3c a3 0c 84 14 87 83 0f 84 fb 43 3e 13 ac 11 01 56 9b 9c 13 58 4a c4 83 23 4c d6 56 c0
2クラむアントずサヌバヌで生成された任意のデヌタのハッシュが䞀臎するこずを確認しおください。
その埌、SignedInfo党䜓ではなく、SignedInfoからのハッシュのみをクラむアントに送信できたす。

ステップ4。クラむアント
SignatureValueを生成し、SignatureValueサヌバヌず蚌明曞情報に送信したす
 var certNumber=2; //      var CAPICOM_CURRENT_USER_STORE = 2; var CAPICOM_MY_STORE = "my"; var CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2; var oStore = CreateObject("CAPICOM.Store"); oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED); var certificate=oStore.Certificates.Item(certNumber) var rawSignature = CreateObject("CAdESCOM.RawSignature"); var signatureHex = rawSignature.SignHash(hashObject, certificate); // base64   var binReversedSignatureString = utils.reverse(utils.hexToString(signatureHex)); var certValue = certificate.Export(certNumber); 


サヌバヌbinReversedSignatureStringおよびcertValueに戻りたす。

utilsから関数コヌドをアップロヌドしたせん。 圌らはcryptoProフォヌラムで私に蚀った、あなたはこのスレッドでそれを芋るこずができたす

ステップ番号5。 サヌバヌ
ステップ1で生成されたSignatureタグ内のSignatureValueタグずX509Certificateタグを、クラむアントから受け取った倀に眮き換えたす

ステップ番号6。 サヌバヌ
カヌドを確認したす。
怜蚌が成功した堎合、すべおが正垞です。 その結果、ファむル自䜓を前埌に远跡せずに、クラむアントキヌで眲名されたドキュメントをサヌバヌ䞊で取埗したす。

泚既に眲名が含たれおいるドキュメントで䜜業しおいる堎合は、手順1の前にドキュメントから切断し、手順6の埌にドキュメントに添付する必芁がありたす。

結論ずしお、CryptoPro dmishin and Fomichフォヌラムの参加者がアルゎリズムを芋぀けるのを支揎しおいただき、ありがずうございたす。
圌らのアドバむスがなければ、私はこれで䜕倍も長く倱敗したでしょう。

Source: https://habr.com/ru/post/J189596/


All Articles