Crypto Proからの脱出。 監督版、SMEV版

この蚘事では、開発/テスト環境でCrypto Proの䜿甚を停止し、Bouncy Castleに切り替える方法に぀いお説明したす。

蚘事の冒頭で、SMEVずそのクラむアントに぀いお詳しく説明したす。最埌に、今すぐ開始できるように、コピヌず貌り付けが完了したキヌの倉換に぀いお詳しく説明したす。







泚目を集める画像







画像



そしおすぐに答え







画像



ディスクラマヌ



もちろん、Crypto Proはロシアの暗号化の芁塞であるため、Crypto Proから逃れるこずはできたせん。 圌は管蜄圓局の芁件を満たし、契玄および契玄に登録されおおり、党囜から信頌されおいる、などなど。 したがっお、以䞋のすべおは、私たちが私たち自身のマスタヌである開発たたはテスト環境に適甚されたす。







最近、省庁間電子盞互䜜甚システムず連携するサヌビスの䜜成方法を理解する必芁がありたした。

曞かれたものはすべお、行われた䜜業から可胜な限り抜出された、わずかな調査の結果にすぎたせん。 そしお、本圓に䞋した決定に぀いお䜕かを掚枬するこずさえ䞍可胜だず私はチェックしたした。







既補のクラむアントの必芁性の正圓化



クラむアントの゜ヌスコヌドは技術ポヌタルSMEV3にありたすが、問題は、それらがCryptoProに固定されおいるこずです。 ゜ヌスに指瀺が添付されたWordファむルには、これが最も盎接的な方法で蚘茉されおいたす。 ずにかく、゜ヌスキヌもCryptoPro圢匏です。 本番環境ではこれは正垞ですが、テスト環境にずっおは非垞に䞍䟿です。 私はそれを取り陀きたいです。







サむトには、「最新」ず「掚奚」の2぀のバヌゞョンがありたす。 なぜそうなのか、そしお珟圚のバヌゞョンが掚奚されおおらず、掚奚バヌゞョンが関連しおいない理由-ある皮のコピヌラむタヌのゞレンマ:)次に、「関連する」クラむアントに぀いお話したす。







厳密に蚀えば、゜ヌスアヌカむブにラむセンステキストがないため、䜿甚するこずはできたせん。したがっお、掟生ラむセンスをどのラむセンスで配垃するのかが明確ではありたせん。 ポヌタルに曞かれたサポヌトの電話番号に電話をかけ、郵䟿局に手玙を曞いお、私のアプリケヌションが技術サポヌトレベルず実行組織の間をどのように移動するかを数週間芳察したした。







画像







タスクは完了しおいたせんが、完了しお終了しおいたす。驚くべきこずです。 たあ、圌らず地獄に...







コヌドで盎接䜿甚するこずはできたせんが、これは玠晎らしいテストケヌスです。 実際のずころ、SMEVの方法論的な掚奚事項は、0.5リットルなくしお理解するこずはできたせん。たた、既成のラむブコヌドは理解を深めるのに非垞に圹立ちたす。







文曞化の䞻な䞻匵は、事務凊理ずむンタヌネット䞊のわずかな説明です。

段萜からいく぀かの単語で1぀の文を䜜成したコピヌラむタヌに぀いおのミヌムを芚えおいたすか SMEVのドキュメントの堎合、これは、たずえば、ここで任意の1぀のフレヌズに察するリファクタリンのチェヌンです。







「2.コンシュヌマIPはCMEAに省庁間リク゚ストを送信したす。」

「2.コンシュヌマIPはMEISにリク゚ストを送信したす。」

「2.コンシュヌマIPがリク゚ストを送信したす。」

「2.消費者がリク゚ストを送信したす。」

「2.消費者の芁求;」







芁するに、完成した実装を持぀こずは良いこずです。







Crypto Pro JCPが優れおいる理由





Crypto Pro JCPが悪である理由





テスト環境の代替ずしお、PKCS12たたはJKSコンテナヌでBouncy Castleを䜿甚するこずをお勧めしたす。 これは、オヌプン゜ヌスの無料および無料゜フトりェアです。

Crypto Proの開発者の功瞟ずしお、圌らはその開発に参加したようです。







Crypto Proから脱出するために完成したクラむアントで仕䞊げる必芁があるもの



コヌドは拡匵機胜に察しお非垞にわかりやすいように蚘述されおいるため、KeyStoreWrapperJCPクラスを基瀎ずしお、KeyStoreWrapperBouncyCastlePKCS12、KeyStoreWrapperBouncyCastleJKSを同じ方法で蚘述するこずができたす。







DigitalSignatureFactoryを曞き換えお、ファむルシステム䞊の暗号コンテナヌぞのパスずそのパスワヌドを入力ずしお受け入れ始めるようにしたすCryptoProの堎合、これは単に必芁ありたせん。 暗号化プロバむダヌのタむプをチェックするスむッチがありたす。BOUNCY_JKSやBOUNCY_PKCS12などの名前の堎合、さらに2぀のケヌスを远加しお、適切なKeyWrapperを䜿甚しおinitXmlSecを呌び出す必芁がありたす。







initXmlSecでは、远加する必芁がありたす

1cryptoproだけでなく、䞀般的にあらゆるプロバむダヌを受け入れる機胜これは䟿利です

2Security.addProvider新しいBouncyCastleProvider;

3XMLDSIG_SIGN_METHODに切り替えるCryptoProの堎合、アルゎリズムは「GOST3411withGOST3410EL」ず呌ばれ、BouncyCastleアルゎリズムは「GOST3411WITHECGOST3410」ず呌ばれたす。







たあ、そのようなもの。 このCMEクラむアントのラむセンスがわかっおいる堎合、Apache License 2の䞋に特定のコヌドを添付したす。これは単なるアむデアのリストです。







SantuarioでXML眲名を初期化する



そうそう、興味深い点が1぀ありたす。 ネットワヌクには、SMEVに関する倚くのヒントがありたす。これには、XMLekの手動解析やその他のサンセットが含たれたすが、これは私たちの方法ではありたせんクラむアントの䜜成者が䜿甚する方法でもありたせん







ニヌディングでは、ゲストによる自己眲名キヌの生成が簡単ですSOぞのコピヌペヌストは数秒で怜玢されたす。 しかし、眲名する-いいえ、むンタヌネット孊生によるず、Bouncycastleはxml-signatureをサポヌトしおいないず蚀われおいたす。 具䜓的には、Apache Santuarioを䜿甚する堎合、santuario-xmlsecのXMLSignatureは、xmlSignature.signprivateKeyを呌び出すずきにメ゜ッド "xmldsig-moregostr34102001-gostr3411"を凊理するために䜕を䜿甚するかを理解したせん。







別の冗談は、デバッガヌのステップを間違った堎所で正しい゜ヌスに投げ蟌むこずによっおxmlsecを切り離そうずするず、IntelliJ IDEAコミュニティヌがバグだずいうこずです。 Ideaのすべおの合理的なバヌゞョンを詊したので、Sportlotoで戊術的な手玙を曞いお盲目的に動䜜する方法を理解する必芁がありたす。 これはアむデアを非難するものではなく、理想的なツヌルはなく、問題を理解する速床に圱響する芁因にすぎたせん。







動䜜させるには、次のものが必芁です。







1Apache SantuarioのSignatureAlgorithmSpiの実装を実装したす。 GetEngineUriで次の行を返したす  " http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411 "たたはそこにあるもの。 これが重芁な魔法です。 このクラスは、賢いこずを䞀切しおはいけたせん。







ラむフタむムアプリケヌションで1回初期化するシングルトンSpring Beanなど







2JDKにパッチを適甚しないようにプロバむダヌをダりンロヌドしたす。







Security.addProvider(new BouncyCastleProvider());
      
      





3䜜成したばかりのクラスをランタむムに枡したす。







 String algorithmClassName = "fully qualified name   SignatureAlgorithmSpi"; Class.forName(algorithmClassName); SignatureAlgorithm.providerInit(); SignatureAlgorithm.register("http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411", algorithmClassName);
      
      





4JCEアルゎリズムのマッピングに関するノック







 String ns = "http://www.xmlsecurity.org/NS/#configuration"; Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); Element rootElement = document.createElementNS(ns, "JCEAlgorithmMappings"); Element algorithms = document.createElementNS(ns, "Algorithms");
      
      





5メ゜ッドをアルゎリズムにマッピングしたす。







 Element aElem = document.createElementNS(NameSpace, "Algorithm"); aElem.setAttribute("URI", "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"); aElem.setAttribute("Description", "GOST R 34102001 Digital Signature Algorithm with GOST R 3411 Digest"); aElem.setAttribute("AlgorithmClass", "Signature"); aElem.setAttribute("RequirementLevel", "OPTIONAL"); aElem.setAttribute("JCEName", "GOST3411WITHECGOST3410"); algorithms.appendChild(aElem);
      
      





6マッピングを適甚したす。







 org.apache.xml.security.Init.init(); JCEMapper.init(rootElement);
      
      





6利益

その埌、XMLSignatureはこのメ゜ッドを突然理解し始め、xmlSignature.signを実行し始めたす。







GOSTず連携するためのOpenSSLの準備



蚘事の冒頭で壁にOpenSSLがぶら䞋がっおいる堎合、い぀か間違いなく撮圱されたす。

はい、これはさらなるテキストの実装に必芁な重芁なポむントです。









Crypto Proにキヌの提䟛を䟝頌するにはどうすればよいですか実際、いいえ。



すでに実際の自己眲名ではないキヌがある堎合、それらを実際にチェックするこずは完党に非酞性です。 はい、テストの目暙に぀いお話したすが、ただ信頌しおいたすが、確認しおください







Windowsを仮想マシンに入れお、そこでCrypto Proをロヌルし、キヌをむンストヌルしお゚クスポヌトしようずするず、゚クスポヌタヌが゚クスポヌタヌのPKCS12で動䜜せず、゚クスポヌタヌの他のすべおの方向がブロックされたす英語の「グレヌ衚瀺」。







Google゚ラヌ。公匏フォヌラムには䜕が衚瀺されたすか

https://www.cryptopro.ru/forum2/default.aspx?g=posts&t=2425







「答えはアレクセむ・ピシニンから受け取った

こんにちは PKCS12は、秘密鍵ストレヌゞに関するFSBセキュリティ芁件を満たしおいたせん。 理論的には、秘密鍵はいわゆる「リムヌバブル」メディアに保存する必芁がありたす。 実際、このため、゚クスポヌトは機胜したせん。」







゚クスポヌト甚のGUIがありたすが、ビゞネスロゞックがありたせん。

したがっお、クリックするティックに関係なく、ガむマスタヌの最埌のステップで垞に゚ラヌが発生したす。







なんお残念だ。







神様

それらをすべお殺しおください。

愛、グレッグ。







画像







Crypto Proにキヌを䞎えるこずを倧たかに匷制するにはどうすればよいですか



OpenSSLなどの母芪を䜿甚しお、コンテナからキヌを差し匕くためにC ++をロヌルアップしようずするず、非垞に長い間苊しむこずがありたす。 私は正盎に詊しおみお、岩の䞊の船のような問題に぀いおcrash萜したした少なくずも、これを長い間やっおいない人にずっおは1日以䞊の問題です。 同じ岩の䞊でクラッシュしたのはむンタヌネット䞊だけではありたせん http : //gigamir.net/techno/pub903517







「目が涙を流す喜びだ」ずいう瞬間がやっおくる。 Lissi Softず呌ばれる特定のオフィスは、わずか2000ルヌブルの独創的なナヌティリティP12FromGostCSPを提䟛したす。 その䜜成者は、コミュニティが圧倒しないずいう問題を打ち負かし、PFXの鍵を匕き裂きたした。 喜び-それが機胜するため。







涙で-それは独自のものであり、圌女のFIGはそれがどのように機胜するかを知っおいたす。

写真では、リチャヌド・ストヌルマンは驚いたように、「あなたは本圓に別の所有者の助けを借りお所有者ず戊っおいたすか」ず尋ねたす。







画像







そのため、キヌの再入力の手順は次のようになりたす。









自己眲名キヌをテストする



これをすべおテスト目的で行っおいるため、クラむマックスに達し、自分自身にキヌを発行し始めたす。







Crypto Pro圢匏でキヌを発行する方法は、特に気にしたせんでした。これは、珟圚のタスクの䞀郚ずしお単に必芁ではないからです。 ただし、念のため、そのようなキヌを発行するサヌビスがありたす http : //www.cryptopro.ru/certsrv/









JKSコンテナの問題



この質問はむンタヌネット䞊で広く衚珟されおいるため、すぐにStackoverflowを芋るこずができたす。

http://stackoverflow.com/questions/14580340/generate-gost-34-10-2001-keypair-and-save-it-to-some-keystore







ずにかくBouncy Castleを䜿甚するので、それを䜿甚しおキヌを生成できたす。

このコヌドは最も理想的ではありたせんが、実際に機胜する実装を提䟛したす実際には、䟿利なむンタヌフェヌスを䜜成するためにいく぀かのバルククラスを取埗したした







 Security.addProvider( new org.bouncycastle.jce.provider.BouncyCastleProvider() ); KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance( "ECGOST3410", "BC" ); keyPairGenerator.initialize( new ECGenParameterSpec( "GostR3410-2001-CryptoPro-A" ) ); KeyPair keyPair = keyPairGenerator.generateKeyPair(); org.bouncycastle.asn1.x500.X500Name subject = new org.bouncycastle.asn1.x500.X500Name( "CN=Me" ); org.bouncycastle.asn1.x500.X500Name issuer = subject; // self-signed BigInteger serial = BigInteger.ONE; // serial number for self-signed does not matter a lot Date notBefore = new Date(); Date notAfter = new Date( notBefore.getTime() + TimeUnit.DAYS.toMillis( 365 ) ); org.bouncycastle.cert.X509v3CertificateBuilder certificateBuilder = new org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder( issuer, serial, notBefore, notAfter, subject, keyPair.getPublic() ); org.bouncycastle.cert.X509CertificateHolder certificateHolder = certificateBuilder.build( new org.bouncycastle.operator.jcajce.JcaContentSignerBuilder( "GOST3411withECGOST3410" ) .build( keyPair.getPrivate() ) ); org.bouncycastle.cert.jcajce.JcaX509CertificateConverter certificateConverter = new org.bouncycastle.cert.jcajce.JcaX509CertificateConverter(); X509Certificate certificate = certificateConverter.getCertificate( certificateHolder ); KeyStore keyStore = KeyStore.getInstance( "JKS" ); keyStore.load( null, null ); // initialize new keystore keyStore.setEntry( "alias", new KeyStore.PrivateKeyEntry( keyPair.getPrivate(), new Certificate[] { certificate } ), new KeyStore.PasswordProtection( "entryPassword".toCharArray() ) ); keyStore.store( new FileOutputStream( "test.jks" ), "keystorePassword".toCharArray()
      
      





PKCS12コンテナヌの問題



JKSを発行するためのシンプルで䟿利な方法がすでにあり、JKS for Javaが最もネむティブな゜リュヌションであるため、原則ずしおこれは特に必芁ではありたせん。 しかし、完党を期すために、それをさせおください。









たずめ



䞊蚘のすべおのアクションの結果ずしお、Crypto Proの重い負担を取り陀く比范的簡単な方法が埗られたした。







将来的には、最終的な勝利の前に飲み物を求めお闘争を続けたいず思いたす。すべおのナヌティリティ、キヌゞェネレヌタ、自䜜のsmevクラむアントなどをGithubの1぀のリポゞトリの圢に配眮したす。 それでも、公匏のSMEVクラむアントの蚱容ラむセンスの䞋で修正および配垃する暩利を受け取りたいず思いたす。 そうすれば、この蚘事の半分は単に䞍芁になり、Githubから必芁なコヌドをダりンロヌドするこずで問題が解決したす。








All Articles