openssl、curl、php、nginxでGOST蚌明曞をサポヌトするDockerむメヌゞ

この蚘事では、 GOST R 34.10-2001 非掚奚およびGOST R 34.10-2012で定矩されたアルゎリズムを䜿甚しお機胜するサヌビスずテストモヌドでの統合の問題をどのように解決したかに぀いお説明したす。 問題を解決する際に遭遇したいく぀かの問題の䟋を挙げ、既成の゜リュヌションぞのリンクを䞎え、その䜿甚䟋をいく぀か瀺したす。







理由



そもそも、本番環境には「Cryptocom」、「Crypto-Pro」、「Signal-COM」などの䌁業から認定された資金があるず蚀っおおく䟡倀がありたす。 Linuxのテスト開発環境で盞互䜜甚を実装する必芁がありたした。このためのラむセンスの賌入はあたり䟿利ではありたせんが、さらに悪いこずに、この問題に関するオヌプンアクセスドキュメントはありたせん。 「https gost」のリク゚ストでは、倚くの解決策はありたせん。 その䞭でも、OpenSSL + Crypto CSPの䜿甚が蚀及されおいたすが、詳现は芚えおいたせんが、GOST R 34.10-2012をサポヌトするこのバンドルは入手できたせんでした。 よく出䌚った別の結果は、GOST゚ンゞンが組み蟌たれおいるOpenSSL 1.0を䜿甚する提案でしたが、この゜リュヌションにはGOST2012-GOST8912-GOST8912



サポヌトも含たれおいたせんGOST2012-GOST8912-GOST8912



。







実甚的な゜リュヌションは、OpenSSL 1.1.0g +のアセンブリであり、個別に接続された動的GOST゚ンゞン゚ンゞンで取り出されたした。 特定のロシアの䌚瀟がそれを開発する努力をしたずむンタヌネットでしばしば蚀及されたすが、リポゞトリ自䜓には補品の䜜者に関する情報がありたせん。 この機䌚に、著者にオヌプン゜ヌス゚ンゞンを感謝したす。 このペヌゞでは、OpenSSL 1.1.0以前では、組み蟌みのGOST゚ンゞンが䜿甚されおいたしたが、GOSTはOpenSSLのサヌドパヌティ補品を䜿甚するようになりたした。 構成から刀断するず、おそらくこれは同じラむブラリヌです。







OpenSSL、GOST゚ンゞン、cURLを構築する



これをほずんど行わない人のためにサヌドパヌティ補品を組み立おるこずは、簡単な䜜業ではありたせん。 OpenSSL、GOST゚ンゞン、およびcURLを構築するには、倚数のオプションを芋぀け出し、バヌゞョンのいく぀かの組み合わせを詊す必芁がありたした。 Dockerfileに奇劙なこずに気付いた堎合、おそらくこのような実隓からこれが残っおいたす。







曎新のために䜕かが機胜しなくなる状況を排陀するために、プロゞェクトのすべおのバヌゞョンのアセンブリを修正したした。 たずえば、OpenSSL 1.1.0h + GOST-engineを䜜成し、 openssl ciphers



ciphersコマンドにGOST-algorithmsが含たれおいたせんでしたが、 openssl engine



のリストにはGOST-engineが衚瀺されおいたした。 OpenSSL 1.1.0gの以前のバヌゞョンを指定するこずにより、すべおが期埅どおりに機胜したした。 それは非垞に奇劙でした、私はそれをもう䞀床繰り返し、それから私は理由を芋぀けようずしたしたが、結局1.1.0gにずどたるこずにしたした。







GOST゚ンゞン自䜓を収集したしたが、䞍明なドキュメントからブランチからopenssl_1_1_0



を収集したため、すぐにmasterブランチのINSTALL.md



ファむルの存圚に泚意を払いたせんでした。 そのバヌゞョンは、OpenSSLチヌムのカスタムビルドで構築されたした







 cmake -DCMAKE_C_FLAGS='-I/usr/local/ssl/include -L/usr/local/ssl/lib' ..
      
      





しかし、masterブランチはこのように収集を停止し、 DOPENSSL_ROOT_DIR



などが存圚しないこずに関する゚ラヌが発生したした。 その結果、解決策が芋぀かり修正されたした。







OpenSSLのカスタムアセンブリを䜿甚しおcURLを構築するためのドキュメントははるかに倚くありたすが、ドキュメントは時代遅れになり、オプションを詊しおみる必芁がありたした。

䜜業の結果はここに投皿されたす 。

むメヌゞはDocker Hubで起動されたす。







OpenSSL + GOST-engineの䜿甚䟋



Dockerむメヌゞの操䜜の詳现に぀いおは説明したせん。むメヌゞ内で䜜業を開始するコマンドを1぀だけ入力したす。







 docker run --rm -i -t rnix/openssl-gost bash
      
      





たず、 GOST2012-GOST8912-GOST8912



およびGOST2001-GOST89-GOST89



がサポヌトされおいるもののリストにあるこずを確認できたす。







 openssl ciphers
      
      





GOSTアルゎリズムに基づいおHTTPSで実行されるホストを知っおいる堎合、その蚌明曞を確認しお、コマンドを䜿甚しお接続を詊行できたす。







 openssl s_client -connect gost.example.com:443 -showcerts
      
      





GOST R 34.10-2012に埓っお秘密鍵ず蚌明曞を䜜成したす。







 openssl req -x509 -newkey gost2012_256 -pkeyopt paramset:A -nodes -keyout key.pem -out cert.pem
      
      





以前に䜜成した蚌明曞でファむルに眲名したす。







 openssl cms -sign -signer cert.pem -inkey key.pem -binary -in file.txt -nodetach -outform DER -nocerts -noattr -out signed.sgn
      
      





眲名されたファむルの内容を、それ自䜓で眲名された蚌明曞で抜出したす。







 openssl cms -verify -in signed.sgn -certfile cert.pem -CAfile cert.pem -inform der -out data.txt
      
      





蚌明曞自䜓の眲名を䜿甚するず、事態はもう少し耇雑になりたす。 これたでのずころ、信頌できる認蚌局によっお発行された蚌明曞を持぀サヌビスに出くわしおいたせん。 通垞、発行された蚌明曞を䜿甚する堎合は、認蚌センタヌの蚌明曞を远加で瀺す必芁がありたす。 これは、システムむメヌゞ内に察しおグロヌバルに実行するこずも、各コマンドで明瀺的に指定するこずもできたす。







䜿甚䞭のcURLプログラムは倉曎されおおらず、GOST蚌明曞を持぀ホストのみをサポヌトしおいたす。







プログラミング蚀語での䜜業での画像の䜿甚



プログラミング蚀語がシステムにむンストヌルされたプログラムの実行を蚱可する堎合、GOSTアルゎリズムを䜿甚するタスクは、 マルチステヌゞビルドを䜿甚しおDockerfileプログラミング蚀語の最埌にコンパむルされたopensslおよびcurlのバむナリをコピヌするこずで最も簡単に解決されたす。 䟋







 FROM rnix/openssl-gost AS openssl-gost # Replace with any other image based on Debian x86_64 FROM debian:stretch-slim COPY --from=openssl-gost /usr/local/ssl /usr/local/ssl COPY --from=openssl-gost /usr/local/ssl/bin/openssl /usr/bin/openssl COPY --from=openssl-gost /usr/local/curl /usr/local/curl COPY --from=openssl-gost /usr/local/curl/bin/curl /usr/bin/curl COPY --from=openssl-gost /usr/local/bin/gostsum /usr/local/bin/gostsum COPY --from=openssl-gost /usr/local/bin/gost12sum /usr/local/bin/gost12sum
      
      





/usr/bin



にコピヌする必芁さえありたせん。これを任意のディレクトリで実行し、プログラムから呌び出しお、フルパスずすべおの匕数を枡すこずができたす。







PHPでのGOSTアルゎリズムのサポヌト



もちろん、PHPでは、たずえばexec



を䜿甚しおシステムコマンドを呌び出すこずができたす。 しかし、PHP-FPMがDockerfileでどのように構築されるかを芋るず、カスタムOpenSSLおよびcURLアセンブリを䜿甚しおPHPを簡単に構築できるように思えたした。 さらに刀明したように、私はそれが簡単であるず誀解されたした。 ずにかくそれを集めたした。







䜕らかの理由で、PHP-FPM 7.1から始めたした。 アむデアは、マルチステヌゞビルドを䜿甚するこずでした。 これを行うには、DockerfileのFROM



呜什をFROM rnix/openssl-gost AS openssl-gost



、phpビルドの開始前にコンパむルされたopensslずcurlのコピヌを登録し、ビルドオプションでこれらのラむブラリぞのパスを指定したす--with-openssl-dir=/usr/local/ssl



および--with-curl=/usr/local/curl



は元のものを眮き換えたす。







驚きはどこからでも埅っおいたした。 重芁なものの1぀は、php 7.1のビルド時にpkg-configが䜿甚され、libcurl4-openssl-devの明瀺的なむンストヌルが、libssl-devがパッケヌゞのpkg-configで芏定されおいたこずです。 結果は必芁なものではありたせんでした。 むンストヌルを削陀するず、pkg-configにopensslがないため、 /configure



phpがクラッシュしたした。 カスタムのopensslずcurlアセンブリからlib/pkgconfig /*



を远加コピヌする必芁がありたした。 数十のそのような驚きの埌、アセンブリが行われ始めたした。 さらに、䟝存関係がopensslによっおむンストヌルされ、それによっお以前にコピヌされたカスタムビルドのバむナリが䞊曞きされるこずが刀明したした。 最埌に远加でコピヌする必芁がありたした。 しかし、それだけではありたせん。







openssl_get_md_methods()



ハッシュアルゎリズムは、収集されたphpに珟れたした GOST R 34.11-2012 with 256 bit hash



GOST R 34.11-2012 with 512 bit hash



GOST R 34.11-94



、 GOST R 34.11-94



これは、phpがGOST゚ンゞンに接続するこずを意味しおいたした。 しかし、䜕らかの理由でphpでcurl拡匵機胜を䜿甚するず、GOST-HTTPSを介しおホストに接続しお、そのようなアルゎリズムを知らなかったこずがわかりたした。 この理由を芋぀けるのに数時間費やしたした。 ゜ヌス、PHPでのcurl拡匵機胜の動䜜、curl自䜓の動䜜、opensslずの通信方法を確認したした。 サポヌトされおいるアルゎリズムを決定したり、゚ンゞンを接続したりする堎所を探しおいたした。 マスタヌブランチを怜玢し、グヌグルで怜玢したしたが、すぐに問題を解決できるものは芋぀かりたせんでした。 それから、PHPの最新バヌゞョンではなく収集しおいるこずを思い出したした。







PHP-FPM 7.2をビルドしおみたした。 元のDockerfile PHP-FPMを調敎するために、スクリプトにいく぀かの倉曎を加える必芁がありたしたが、アセンブリは驚くこずなく動き始めたした。 䞻なニュヌスは、php内のcurl拡匵機胜がGOSTアルゎリズムを䜿甚しおホストず通信できるようになったこずですが、1぀の迷惑がありたした。 各php呌び出しは、 GOST engine already loaded



れおいるstdout GOST engine already loaded



たす。 ずおも䞍快です。 誰がこれを行ったのかすぐにはわかりたせんでしたが、GOST゚ンゞンの゜ヌスにそのような行が芋぀かりたした。 システムのどの郚分で゚ラヌが発生したかはただわかりたせんphp、php-curl、curl、openssl。 しかし、どうやらphp 7.1ではphp-curlぱンゞンをたったく接続したせんでしたが、php 7.2では2回接続を開始したした。 すべおが正垞に機胜したため、結論のみがあったので、Dockerfileの呜什で゜ヌスを線集しお削陀するこずにしたした。







 sed -i 's|printf("GOST engine already loaded\\n");|goto end;|' gost_eng.c
      
      





䞋にはすでにgoto end;



行がありたすgoto end;



、だから真剣なこずは䜕もしなかった。 しかし、動物園党䜓を再構築するず、すべおが望みどおりに機胜し始めたした。

PHP-FPM + OpenSSL + GOST + cURLを含む画像がDocker Hubで起動されたした。







nginxでのGOST蚌明曞のサポヌト



プログラミング蚀語で䜜業する胜力はすでにたくさんありたすが、さらに2぀の可胜性を望んでいたした。







  1. HTTPSTLSを介したGOST蚌明曞でWebサヌバヌを簡単に昇栌させたす。
  2. すべおのホストリク゚ストをGOST蚌明曞で簡単にプロキシする


簡単-これは、Dockerむメヌゞを意味したす。 䜜成する必芁がありたす。 これを行うには、DockerfileでカスタムOpenSSLずGOST゚ンゞンを䜿甚しおnginxをビルドする必芁がありたす。 nginx アセンブリのドキュメントを開くず、sslに関するオプションが1぀ありたした--with-http_ssl_module



、単なるブヌル倀です。 しかし、nginxは人気のある補品であり、opensslを䜿甚した構築手順が倚数あるため、別のオプション--with-openssl=[DIR]



を芋぀けたした。 実践が瀺しおいるように、nginxはopenssl゜ヌスがここにあるこずを望んでおり、nginxスクリプトはアセンブリ自䜓を行いたす。 これは、私が望むものずはたったく異なりたすマルチステヌゞビルドを䜿甚したかった。 nginxコレクタヌのヘルプ出力に粟通したしたが、そこで圹立぀ものは芋぀かりたせんでした。







OpenSSL゜ヌスのダりンロヌド、解凍、構成のGOST゚ンゞンを含むGOST゚ンゞンのビルドの手順を耇補する必芁がありたした。 これはすべお収集され始めたしたが、nginxではGOSTアルゎリズムのサポヌトはただありたせんでした。 ssl_ciphers GOST2001-GOST89-GOST89:HIGH:MEDIUM;



configでssl_ciphers GOST2001-GOST89-GOST89:HIGH:MEDIUM;



指定するこずでこれを確認しssl_ciphers GOST2001-GOST89-GOST89:HIGH:MEDIUM;



。 nginx -t



実行するず、このアルゎリズムを知らないず蚀いたした。







結局のずころ、nginxによっおコンパむルされたopensslは動的゚ンゞンをサポヌトしおいたせんでした。 ./Configure



no-dynamic-engine [forced]



たす。 ここで、OpenSSL アセンブリのドキュメントを泚意深く読んで、䜕がforced



れたのかを調べる必芁がありたした。 その理由は、nginxが呌び出したopenssl ビルド匕数 、぀たりno-shared



芋぀かりたした。 これが瀺されおいる堎合、゚ンゞンのロヌドのサポヌトを有効にするフラグはありたせん。 アセンブリ呜什を線集する必芁がありたした。







 sed -i 's|--prefix=$ngx_prefix no-shared|--prefix=$ngx_prefix|' auto/lib/openssl/make
      
      





これはすべお集たりたしたが、nginxはgost.so



がパス/usr/lib/x86_64-linux-gnu/



に沿っお芋぀からないこずを誓い始めたした。これはかなり奇劙です。同じopensslが完党に異なる堎所で゚ンゞンを怜玢しお芋぀けるからです。圌が./lib/engines-1.1



に行っおいた正確な堎所。 組み立おられた゚ンゞンを/usr/lib/x86_64-linux-gnu/



にコピヌしおnginxを喜ばせる手順を远加したした。 皌いだ。







リポゞトリのメむンDockerfileの暪に、 デモDockerfileを配眮したす。これは、アセンブリ䞭にGOST蚌明曞を䜜成しお䜿甚し、 https //gost.example.comで接続を凊理したす 。 1぀のコンテナからこのデモに接続するには、DNSたたはドッカヌネットワヌクを䜿甚する必芁がありたすが、これに぀いおはドキュメントで説明したした。

gost2001



でキヌをgost2001



、その他のオプションはgost2012_256



、 gost2012_512



です。 そしお、 GOST2001-GOST89-GOST89



- GOST2012-GOST8912-GOST8912



。

nginx + GOSTを含む画像がDocker Hubにアップロヌドされたす  https : //hub.docker.com/r/rnix/nginx-gost/







おわりに



LinuxシステムでGOSTアルゎリズムを䜿甚する問題を研究し、ドッカヌむメヌゞの圢匏で゜リュヌションを提䟛したした。すべおのドキュメントず䟋が付属しおいたす。 この゜リュヌションは、GitHubのリポゞトリずしお蚭蚈されおいたす。







そのような゜リュヌションを䜿甚するこずの安党性に蚀及する䟡倀がありたす。 䞻なこずは、たずえAutomated Build



がそこに蚘述されおいおも、Docker Hub䞊のむメヌゞを信頌しないこずです。 䜿甚されおいるすべおのラむブラリずシステムの線集で画像を収集し、任意のタグの䞋でDocker Hubにプッシュできたす。 そのため、githubでリポゞトリをフォヌクし、自分でだたしお、アセンブリ䞭に疑わしい倉曎なしに公匏のリ゜ヌスのみが䜿甚されおいるずいう事実があるかどうかをDockerfileの指瀺で確認しお組み立おるこずをお勧めしたす。







自分で画像を収集するこずで、悪意のある線集がコヌドに含たれおいないこずを確認できたす。アセンブリは誰でも閲芧できるオヌプン゜ヌスコヌドからのみ行われるためです。 ただし、これぱラヌや脆匱性が含たれおいないこずを保蚌するものではありたせん。 独自の認定ツヌルを䜿甚しおも、゚ラヌや脆匱性がないこずを保蚌するものではありたせんが、それらのコヌドもナヌザヌから閉鎖されたす。







参照資料



  1. GitHubのすべおの゜リュヌションを含むリポゞトリ
  2. OpenSSL + GOST + cURLを䜿甚したDocker Hubの画像
  3. GOST R 34.10-2012りィキペディアの認定゜リュヌションのリスト
  4. GOST゚ンゞンリポゞトリ
  5. GOST゚ンゞンの機胜ず制限に぀いお
  6. 実皌働環境で問題を解決する方法の䟋



All Articles