ãã¹ãŠã®éçºè
ã®ç掻ã®äžã§ãæ¿åºã®ã·ã¹ãã ãšããåãããªããã°ãªããªãæãæ¥ãŸãã ãããŠããããã®ããã€ãã¯ãç¹ã«ãã·ã¢ã®åœå®¶ã·ã¹ãã ãšå¯Ÿè©±ããå¿
èŠããããŸãã ãããŠæãã§ããã®ã§ãç§ã¯ãããã®ã幞éãªäººãã®äžäººã§ããã
ãã·ã¢ã®äž»æš©ITã®ç¹åŸŽã¯ãæ
å ±ã®ã»ãã¥ãªãã£ïŒæå·åïŒãšæŽåæ§ïŒçœ²åïŒã確ä¿ããå¿
èŠãããå Žåã¯ã©ãã§ããåœå
ã®æå·åã¢ã«ãŽãªãºã ïŒæšæºåãããå€æ°ã®å·ã®æšæºãšRFCã§èšè¿°ãããŠããïŒã®ã¿ã䜿çšããå¿
èŠãããããšã§ãã ããã¯ãåœå®¶å®å
šä¿éã®èŠ³ç¹ããã¯éåžžã«è«ççã§ãããããŸã人æ°ã®ãªãèšèªã®éçºã®èŠ³ç¹ããã¯éåžžã«èŠçã§ãïŒãžã£ãã¹ãã¯ããããé¢ããéåžžã«èŠªåã«æ³šæãæã£ãŠããŸãïŒã
ãããŠä»ããããã®ã·ã¹ãã ã®1ã€ããã®GOSTé»å眲åã䜿çšããéåžžã«å¯ãªã¡ãã»ãŒãžã³ã°ã®ã¿ã¹ã¯ã«çŽé¢ãããšãããå®å
šã«ãïŒSOAPãã©ããããïŒã®ãªã¯ãšã¹ãïŒããã³åçïŒã«çœ²åãããããã¯ãŒã¯SOAPãµãŒãã¹ã®åœ¢ã§ææ¡ããããœãªã¥ãŒã·ã§ã³ã奜ãã§ã¯ãããŸããSOAPã§ã¯ãããçš®ã®æªå€¢ã®ãããªãã®ã§ãã 5æã®é·ãé±æ«ãæ¥ãŠã圌ããçµãã£ããšã-ç§ã¯ããè¯ã決æãããŸãã...
ãããŠãããã¯GOSTæå·åã¢ã«ãŽãªãºã ã
ãã€ãã£ãã«ãµããŒãããRubyã§ãã æ°ããå€éšäŸåé¢ä¿ã¯ãããŸããã è©ŠããŠã¿ãŸãããïŒ è¡ããïŒ
èšçœ®
OpenSSLãæ§æãã
GOSTã¢ã«ãŽãªãºã ã«é¢é£ãããã¹ãŠãæ©èœããããã«ã¯ãã«ã¹ã¿ãã€ãºãããOpenSSLããŒãžã§ã³1.0.0以éãå¿
èŠã§ãã Linuxã«ã¯ãããã«äœ¿ãããæ©èœããããOS Xã§ã¯HomeBrewããã€ã³ã¹ããŒã«ããå¿
èŠããããŸãïŒAppleã¯é
ãããïŒïŒ
brew install openssl brew link --force openssl
圌ããäœåºŠãäœåºŠãæžããã€ã³ã¿ãŒãããäžã§GOSTçšã«OpenSSLãæ§æããæ¹æ³ãç§ã¯ãªãªãžãã«ã®ããã¥ã¢ã«ã䜿çšããããšããå§ãããŸãïŒ
README.gostããã«èªãã§ããµãŒãããŒãã£ã®ãªã³ã¯ããã©ããªãã§ãã ããïŒUbuntu Linuxã§ã¯ãæ§æãã¡ã€ã«ã¯ãã¹
/etc/ssl/openssl.cnf
Xã§ã¯ãã¹
/usr/local/etc/openssl/openssl.cnf
ãŸãã
ãã¡ã€ã«ã®æåã«æ¬¡ã®è¡ãè¿œå ããå¿
èŠããããŸãã
openssl_conf = openssl_def
ãããŠããã¡ã€ã«ã®æåŸã®æ¬¡ã®ã»ã¯ã·ã§ã³ïŒ
[openssl_def] engines = engine_section [engine_section] gost = gost_section [gost_section] default_algorithms = ALL engine_id = gost CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet
æåŸã®ã»ã¯ã·ã§ã³ã§ã¯ã
dynamic_path
ãã©ã¡ãŒã¿ãŒãå¿
èŠãªå ŽåããããŸãããLinuxããã³Mac OS Xã®æ°ããããŒãžã§ã³ã§ã¯å¿
èŠãããŸããã å¿
èŠã«å¿ããŠã
locate libgost.so
ã§ãã®å€ã
locate libgost.so
ããšãã§ããŸãã
ãããã®æé ã®åŸã
openssl ciphers | tr ":" "\n" | grep GOST
openssl ciphers | tr ":" "\n" | grep GOST
openssl ciphers | tr ":" "\n" | grep GOST
ã¯æ¬¡ã®è¡ãè¿ããŸãããã¹ãŠãæ£ããæ§æãããŠããŸãã
GOST2001-GOST89-GOST89 GOST94-GOST89-GOST89
ã«ããŒ
Rubyããã¹ãŠã®GOSTãç解ã§ããããã«ããã«ã¯ããã°ã¬ããŒã
ïŒ9022ããã³
ïŒ9030ã®ããããããã€ãé©çšããå¿
èŠããããŸãã ãããã®ãããã¯RubyããŒãžã§ã³2.0.0ããã³2.1.xã«æ£åžžã«é©çšãããŸãããä»ã®ããŒãžã§ã³ã§ã¯ãã¹ããããŠããŸããã
ãããã®ãããã¯äœã§ããïŒããŠãèªåã§Cã³ãŒããèŠãããšããªãããŸãã¯äœãèŠãŠãã ããã
æåã®ãã®ã¯ãRubyãOpenSSLãåæåããå Žæã«ãéæ³ã®OpenSSLé¢æ°
OPENSSL_config
åŒã³åºããæ¿å
¥ããŸãã ããã«ãããOpenSSLã¯ããªããšç§ãä¿®æ£ããŠé©çšããã°ããã®æ§æã«èå³ãæã¡ãŸãã
xtronã«æè¬ã
ãŸã ã
圌ã®èšäºã§ã¯åãããšãããŸããããPHPã䜿çšããŠããŸããïŒã¡ãªã¿ã«ãç§ãã¡ãšåãåé¡ã«èŠåŽããŸããïŒã ãã®ãããã«ãããRubyã¯GOSTæå·åã䜿çšããHTTPSãã¹ãã«ã¢ã¯ã»ã¹ã§ããããã«ãªããŸãïŒãã ãã蚌ææžã®æ¿èªã¯äžèŠã§ãïŒã
2çªç®ã®ãããã¯ãæ¡ä»¶ãåœé ãããã§ãã¯ãäžæ£ã«åé€ããããšã§ãGOSTããŒãæ¥åæ²ç·ïŒæ¥åæ²ç·ãECïŒã®ããŒã§ãããšåçŽã«ä¿¡ããŠããŸãããããã¯çå®ã®ããã§ããã解決çã¯æŸèæã§ã¯ãããŸããæ£åœåããã ãã®ãããã«ãããRubyã¯GOSTã®ç§å¯éµãšå
¬ééµããèªèãããé»å眲åãšæå·åãéå§ããŸãã äžè¬çã«ããã¹ãŠãããŸããããŸãã
RVMã䜿çšãããšã次ã®ã³ãã³ãã§ã€ã³ã¹ããŒã«ãè¡ãããŸãã
rvm install ruby-2.1.2-gost --patch https://bugs.ruby-lang.org/attachments/download/4420/respect_system_openssl_settings.patch --patch https://bugs.ruby-lang.org/attachments/download/4415/gost_keys_support_draft.patch
RbenvïŒruby-buildïŒã®å Žåããã¹ãŠãããè€éã§ã2ã€ã®ã³ãã³ããå®è¡ããå¿
èŠããããŸãïŒãã®æ¹æ³ã¯ç¹ã«ãã¹ãããŸããã§ããïŒã
cp ~/.rbenv/plugins/ruby-build/share/ruby-build/{2.1.2,ruby-2.1.2-gost}
ã§ããïŒ
ãã®çµæã
ruby-2.1.2-gost
ãšããååã®å¥ã®Rubyãã€ã³ã¹ããŒã«ãããŸãã ãã®ååã¯
.ruby-version
ãã¡ã€ã«ã«æžã蟌ãããšãã§ãããã®åœä»€ã¯
README
ã§æžã蟌ãããšãã§ããŸããããããã°ããããžã§ã¯ãã«çããRubyãå¿
èŠã§ããããšãåžžã«æããã«ãªããŸã...
Puppetã䜿çšããŠãµãŒããŒã«ã€ã³ã¹ããŒã«ããããšãã°ããµãŒããŒã«Rubyãé
眮ãããšããæ¥ããšãPuppetã®Rbenvã¢ãžã¥ãŒã«ã圹ç«ã¡ãŸãããåçŽã§ã¯ãªããããããé©çšãããŸãã github.com/alup/puppet-rbenv/pull/95ã«ããgitHubãŠãŒã¶ãŒgsamokovarovããã®ããããå¿
èŠ
ã§ã ã èŠãã¿ãããªãããã«ããµãŒããŒã«ã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ããæé ã次ã«ç€ºããŸãã
git clone git@github.com:Envek/puppet-rbenv.git
ããã§ã
pkg
ãã£ã¬ã¯ããªããã¢ãžã¥ãŒã«ã䜿çšããŠçŒãããŠã®ã¢ãŒã«ã€ããååŸãããµãŒããŒã«ã¢ããããŒãããŠã
puppet module install /path/to/alup-rbenv-1.2.1.tar.gz
ã³ãã³ãã§
puppet module install /path/to/alup-rbenv-1.2.1.tar.gz
ã§ããŸãïŒ
--force
ãå¿
èŠãªå ŽåããããŸãïŒã -masterïŒäººåœ¢ã¯äœ¿çšãããã¢ãžã¥ãŒã«ã®ã«ãã³ãŒãããã£ãã·ã¥ããã®ã奜ãã§ãïŒã
ããŒãã¢ãOpenSSLãç解ã§ãã圢åŒã«å€æãã
éµãšèªå·±çœ²å蚌ææžã¯ã
å
¬åŒããã¥ã¢ã«ã䜿çšããŠçæã§ã
ãŸã ã
ãã ããããŒã¯ã³ã®å
ã®ããŒãã¢ã¯ã6ãã¡ã€ã«ã®ãããŸãã¯ãããããŒãã£ã¹ã¯ã®ã€ã¡ãŒãžã®ããããã§ããå¯èœæ§ãæãé«ãã®ã¯ãã¡ããã§ãã
æ®å¿µãªããããããŸã§ã®ãšãããããŒãç®çã®åœ¢åŒã«ãšã¯ã¹ããŒãããå¯äžã®æå¹ãªãªãã·ã§ã³ã¯ãLissy-softã®
P12fromCSPãŠãŒãã£ãªãã£ã§ãã æ®å¿µãªãããWindowsã§ã®ã¿ææã§ãã 賌å
¥ããå¿
èŠããããŸãããããã°ã©ã ã®ãã®ãã¢ããŒãžã§ã³ã®åã«ããããååçã«åœ¹ç«ã€ãã©ããã確èªã§ããŸãã ããã°ã©ã ã¯éè¡æ¯èŸŒã§è³Œå
¥ãããããšã«æ³šæããŠãã ããïŒãªã³ã©ã€ã³ãã³ãã³ã°ã§è³Œå
¥ã§ããŸãïŒãããã¯èãé£ãã»ã©é·ã-3ã4æ¥ã§ãã
WindowsãšCrypto ProãæèŒãããã·ã³ãå¿
èŠã§ãã Crypto Proã䜿çšããŠãããŒã¡ãã£ã¢ããã·ã¹ãã ã«èšŒææžãã€ã³ã¹ããŒã«ããŸãã ããŒããã¡ã€ã«ãå«ããã©ã«ããŒã®åœ¢åŒã§ããå Žåãä»®æ³ãã£ã¹ã±ãããäœæããŠããã«ã³ããŒãããšãCrypto Proã¯ãã®ãã£ã¹ã±ãããããŒã¡ãã£ã¢ãšããŠèªèããŸãã 蚌ææžãã€ã³ã¹ããŒã«ããåŸããããã·ã¹ãã ã«ããããšã確èªããŸãïŒã蚌ææžãã©ãã«ã¯Crypto Proãã©ã«ããŒã®ãéå§ããã©ã«ããŒã«ãããŸãïŒã ãããŠããŠãŒãã£ãªãã£ãå®è¡ãããšããªã¹ãã衚瀺ããã蚌ææžå
ã§ãããéžæããŠãã¡ã€ã«ã«ä¿åããå¿
èŠããããŸãïŒãã®æç¹ã§ããŠãŒãã£ãªãã£ã¯é£ã¹ãããã«èŠæ±ããŸãïŒã
ãã¹ãŠæ£ããè¡ã£ããã蚌ææžããŠãŒãã£ãªãã£ã«è¡šç€ºãããªãã£ãå Žåãèããããçç±ã¯2ã€ãããŸãã
- ã¹ããŒãã«ãŒãããŒã¯ã³ããããŸãã ç§å¯éµã¯ç©ççã«ãšã¯ã¹ããŒãã§ããŸããã ããã
- ããŒã¯ãšã¯ã¹ããŒãäžå¯ãšããŠããŒã¯ããããŠãŒãã£ãªãã£ã¯ãšã¯ã¹ããŒããæåŠããŸãã ãããåé¿ããæ¹æ³ã¯ãããŸããïŒããããŸããã
æ¡åŒµåã.p12ãŸãã¯.pfxã®ãã¡ã€ã«ãOpenSSLãã€ã³ã¹ããŒã«ãããŠãããã·ã³ã«ãã©ãã°ãã次ã®ã³ãã³ãã䜿çšããŠèšŒææžãšç§å¯ããŒãæœåºããŸãã
蚌ææžïŒ
openssl pkcs12 -engine gost -in gost.pfx -clcerts -nokeys -out gost.crt
ç§å¯éµïŒ
openssl pkcs12 -engine gost -in gost.pfx -nocerts -nodes -out gost.pem
ä»ãããªãã¯åãããšãã§ããŸãïŒ
ããã«ã€ããŠã©ãããã°ããã§ããïŒ
èå³ããããªããããã¯ããªãããã§ã«äœããããå¿
èŠãããããšãæå³ããŸãã ã芧ãã ãããããã¯çŸåšå¯èœãã€å©çšå¯èœãªãã®ã®ã»ãã®äžéšã§ãã
å
šè¬
GOSTã¢ã«ãŽãªãºã ã«é¢é£ãããã¹ãŠãRubyã§æ©èœããããã«ã¯ããŸã次ã®ããã«OpenSSL gostãšã³ãžã³ããååŸãããå¿
èŠããããŸãã
require 'openssl' OpenSSL::Engine.load @gost_engine = OpenSSL::Engine.by_id('gost') @gost_engine.set_default(0xFFFF)
ãã®éæ³ã®ã³ãŒããå®è¡ãããšãããã«ãã¹ãŠã®äŸãæ©èœãå§ããŸãã
@gost_engine
å€æ°ã¯ãŸã å¿
èŠã§ãã
ããŒã¿ã®ããžã¿ã«çœ²åãšãã®æ€èšŒ
ã·ã³ãã«ãªçœ²åïŒ
pkey = OpenSSL::PKey.read(File.read('gost.pem')) data = 'Same message' digester = @gost_engine.digest('md_gost94') signature = privkey.sign(digester, data)
åçŽãªçœ²åã®æ€èšŒïŒ
cert = OpenSSL::X509::Certificate.new(File.read('gost.crt')) digester = @gost_engine.digest('md_gost94') data = 'Same message' cert.public_key.verify(dgst94, signature, data)
åé¢ããã眲åã®äœæïŒçŠæ¢ãµã€ãã®ã¬ãžã¹ããªã«ããã«ã¡ã¯ïŒïŒ
cert = OpenSSL::X509::Certificate.new(File.read('gost.crt')) pkey = OpenSSL::PKey.read(File.read('gost.pem')) data = 'Some message' signed = OpenSSL::PKCS7::sign(crt, key, data, [], OpenSSL::PKCS7::DETACHED)
蚌ææžãããã·æ€èšŒã«ããåé¢çœ²åã®æ€èšŒïŒ
cert_store = OpenSSL::X509::Store.new cert_store.set_default_paths
XMLïŒSOAPãå«ãïŒã¡ãã»ãŒãžã«ããžã¿ã«çœ²åãã
gem
眲åè
ã¯ããã§åé¡ãªãåäœããæ°åã®ãã«èŠæ±ã®åŸããGOSTã«åŸã£ãŠãå®å
šã«çœ²åããŸãã å®ç³ãäœæããŠãããEdgars Beigartsã«æè¬ããŸãããŸãããã«ãªã¯ãšã¹ãã®åä¿¡ã«å¯Ÿããå¿èãšæ¯æŽã«æè¬ããŸãã
ããšãã°ãSMEVã®XML眲åè
ã䜿çšããŠçœ²åããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
def sign_for_smev(xml) signer = Signer.new(xml) signer.cert = OpenSSL::X509::Certificate.new(File.read(Settings.smev.cert_path)) signer.private_key = OpenSSL::PKey.read(File.read(Settings.smev.pkey_path)) signer.digest_algorithm = :gostr3411 namespaces = { 'soap' => 'http://schemas.xmlsoap.org/soap/envelope/', }
ãããŠãèŠä»¶ãããå³ããå¥ã®ã·ã¹ãã ã®å¥ã®äŸã§ã def sign_for_system_name(xml) signer = Signer.new(xml) signer.cert = OpenSSL::X509::Certificate.new(File.read(Settings.smev.cert_path)) signer.private_key = OpenSSL::PKey.read(File.read(Settings.smev.pkey_path)) signer.digest_algorithm = :gostr3411 namespaces = { wsa: 'http://www.w3.org/2005/08/addressing', soap: 'http://www.w3.org/2003/05/soap-envelope', }
ãã®ãããªã¡ãã»ãŒãžã確èªããã«ã¯ã
Akami::WSSE::VerifySignature
masterãã©ã³ãã®
Akami::WSSE::VerifySignature
ã圹ç«ã€å ŽåããããŸãã 圌ã¯çœ²åãæ£ããããšã確èªããŸããã蚌ææžãšå¿
èŠãªãã¹ãŠã®ã¿ã°ã眲åãããŠãããã©ããã確èªããŸãïŒ
def verify(signed_xml) verifier = Akami::WSSE::VerifySignature.new(signed_xml) verifier.verify!
GOSTæå·åãšèšŒææžèªèšŒã䜿çšããHTTPSãŠã©ãŒãã³ã°
éãã¯ãŸã£ãããããŸããã ããªãã奜ããããããªãå¯äžã®ãã®ã¯ãããªããã·ã¹ãã ã«è¡ããµãŒãããã«ãŒã蚌ææžãè¿œå ããããšã§ãïŒãã ããããã§ã¯ãMac OS Xã«åé¡ããããŸãïŒã
ãæ°ã«å
¥ãã®ã©ã€ãã©ãªïŒ
Net::HTTP
ã
HTTPI
ãïŒãååŸããhttpsã¢ãã¬ã¹ãããŒã蚌ææžãäžããŠã
HTTPI
ãŸãããïŒ
ãã¹ããšããŠã
ssl-gost.envek.nameã® Webãµã€ãã«
ã¢ã¯ã»ã¹ããŠã¿ãŠãã ãã
ã泚æãéåžžã®ãã©ãŠã¶ãŒïŒããã³ããããé©çšããŠããªãRubyïŒã¯ã¢ã¯ã»ã¹ã§ãããGOSTæå·åã¢ã«ãŽãªãºã ãç解ããŠããªããããããŒãžã衚瀺ããããFirefoxã®ã¿ãæ確ãªãšã©ãŒã¡ãã»ãŒãžã衚瀺ããŸãã
ãããŠãã¯ããã«
äžè¬ã«ãGOSTã¢ã«ãŽãªãºã ã®äœ¿çšã¯ãããšãã°RSAã®äœ¿çšãšå€ãããŸããã ãããã£ãŠã
Ruby OpenSSL Cheat Sheetãªã©ãã€ã³ã¿ãŒãããäžã®ãã¹ãŠã®è³æã圹ç«ã¡ãŸãã ç§ã¯ãç§ãç¥ã£ãŠãããã¹ãŠãèšã£ãããã§ãã
OpenSSLïŒããã³ãããã«å¿ããŠRubyïŒã¯ããããŸã§ã®å€ãã¢ã«ãŽãªãºã ã®ã¿ããµããŒãããŠããããšã«æ³šæããããšãéèŠã§ãïŒ** GOST 28147-89 **ïŒå¯Ÿç§°æå·åïŒã** GOST R 34.11-94 **ïŒããã·ã¥ã¢ã«ãŽãªãºã ïŒã** GOST R 10/34/2001 **ïŒé察称æå·åãšããžã¿ã«çœ²åïŒã æ°ããã¢ã«ãŽãªãºã ããµããŒãããããã®ãããã¯ãDmitry Olshanskyãšããååã§OpenSSLã«ãã§ã«éä¿¡ãããŠãããGitHubã§ããããèŠãããšãã§ããŸãïŒ
openssl / opensslïŒ68ããã³
openssl / opensslïŒ75 ã ã
çµè«ãšããŠ
ããã«ãããGOST EDSãªã©ãå¿«é©ãã€ããã€ãã£ãã«ãæäœã§ããŸãã ããã¯æ¬åœã«ã·ã³ãã«ã§ã¯ãŒã«ã§ãïŒãããŠé«éã§ã-Rubyã§OpenSSLãæäœããæ¹æ³ã¯ãCã©ã€ãã©ãªã®ãã©ãããŒãã«ãããªãããã§ãïŒã
è¿œå ãä¿®æ£ã質åãããå Žå-ããã楜ãã¿ã«ããŠããŸãïŒ