ããã«ã¡ã¯ãéçºæ¬éšã®å®®å
ã§ããä»åãHPKI ã«ãŒãã«ã€ããŠèª¿æ»ãè¡ããŸããã®ã§ãããã«ã€ããŠæžããŸãã JAHIS HPKI å¯Ÿå¿ IC ã«ãŒãã¬ã€ãã©ã€ã³ Ver.3.0 ãåèã«ããŠãHPKI ãã¹ãã«ãŒãããå®éã«å
¬ééµèšŒææžãååŸããŸããã ä»åŸã HPKI ã«ã€ããŠèª¿æ»ãç¶è¡ããŠãããããšæããŸãã HPKI ãšã¯ïŒ HPKI ãšã¯åçåŽåçãèªããå»ççŠç¥é¢ä¿è³æ ŒïŒå»åž«ã»è¬å€åž«ã»çè·åž«ãªã© 26 çš®é¡ã®ä¿å¥å»ççŠç¥åéã®åœå®¶è³æ Œãšãé¢é·ã»ç®¡çè¬å€åž«ãªã© 5 çš®é¡ã®ç®¡çè
è³æ ŒïŒãèªèšŒããããšãã§ãã PKI ã§ãã é
åžããã HPKI ã«ãŒãã«ã¯ãã«ãŒã CAãäžé CAãèšŒææžãæ ŒçŽãããŠããŸãã ãã®ã«ãŒãã¯ãé»å眲åãªã©ã«äœ¿çšããããšãã§ããä»åŸæ®åããŠããã°ãå»çææžïŒåŠæ¹ç®ãç
é¢ãžã®ç޹ä»ç¶ãªã©ïŒãå°å·ãæŒå°ãéä»ãããªã©ã®éå¹çãªæ¥åãããããšãªãããã¹ãŠããžã¿ã«åããããšãã§ããããã«ãªããŸãã ãŸããé»åèªèšŒçšã®èšŒææžãå«ãŸããŠãããããèªèšŒã»èªå¯åŠçã«ã䜿çšããããšãã§ããŸãã ä»åãHPKI ãã¹ãã«ãŒããçšããŠèª¿æ»ãè¡ããŸããã 調æ»ç°å¢ macOS v10.13.5 ACR39-NTTCom Ruby v2.5.1 smartcard v0.5.6 HPKI ãã¹ãçšã«ãŒã PC/SC HPKI ã«ãŒãã®ãã㪠IC ã«ãŒããšããåããè¡ãã«ã¯ã PC/SC ãšãã API 仿§ã䜿ãå¿
èŠããããŸãã PC/SC ã¯ããšããš Windows ç°å¢ã®ã¿ã§å©çšå¯èœã§ããããpcsc-lite ãšãã OSS å®è£
ããããçŸåšã§ã¯æ§ã
㪠UNIX like OS ã§ãå©çšã§ããŸãã macOS ã®å Žåã /System/Library/Frameworks/PCSC.framework/PCSC ã«ã©ã€ãã©ãªãçšæãããŠãããç¹ã«æºåããå¿
èŠãªãå©çšå¯èœã§ãã(2018 幎 07 æçŸåš) ãã ããIC ã«ãŒããªãŒããŒã®ãã©ã€ããŒãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã ä»åå©çšãã ACR39-NTTCom 㯠ããŠã³ããŒãããŒãž ã« macOS v10.13 ã«å¯Ÿå¿ãããã©ã€ããŒãé
åžãããŠããªãã£ããããIC ã«ãŒããªãŒããŒã®ãããã¡ãŒã«ãŒã§ãã ACS 瀟㮠ããŠã³ããŒãããŒãž ãããã©ã€ããŒãå
¥æããŸããã smartcard æ€èšŒããéã«äœ¿çšãã gem 㯠smartcard ã§ãã æ®éã® rubygem ãšåãã gem install ããŠå©çšããŸãã gem install smartcard IC ã«ãŒããªãŒããŒã PC ã«æ¥ç¶ãã ruby -rsmartcard -e 'pp Smartcard::PCSC::Context.new.readers' ãå®è¡ããIC ã«ãŒããªãŒããŒåã衚瀺ãããã°æ¥ç¶æåã§ãã ã¢ããªã±ãŒã·ã§ã³èå¥åã®ååŸ å®éã« HPKI ãã¹ãã«ãŒãããæ
å ±ãååŸããŠãããŸãã ã¬ã€ãã©ã€ã³ ã®ãé屿ž A(åè)PKI ã«ãŒãã¢ããªã±ãŒã·ã§ã³å©çšã®ã·ãŒã±ã³ã¹ãã«ãããA.2.2 JIS X 6320-15 ã«åŸã£ã PKI ã«ãŒããã¢ãããªã±ãŒã·ã§ã³ã®æ€çŽ¢ãšå©çšããå®è£
ããŠãããŸãã åŒçš ã¬ã€ãã©ã€ã³ prog01.rb # prog01.rb require "smartcard" def puts_response ( response ) puts "status = %04X" % response[ :status ] puts "data = %s" % response[ :data ]. map { | i | "%02X" % i }. join ( " " ) end context = Smartcard::PCSC::Context . new begin card = context. card context. readers . first # SELECT ã³ãã³ãã§`E8 28 BD 08 0F`ãããŒã·ã£ã«æå®ãã DF ãæå® apdu = [ 0x00 , 0xA4 , 0x04 , 0x00 , 0x05 , 0xE8 , 0x28 , 0xBD , 0x08 , 0x0F , 0x00 ] response = card. transmit apdu. pack ( "C*" ) response = Smartcard::Iso::IsoCardMixin . deserialize_response response. unpack ( "C*" ) puts_response response while response[ :status ] == 0x9000 # SELECT ã³ãã³ãã§æ¬¡ã® DF ãæ¢ã apdu = [ 0x00 , 0xA4 , 0x04 , 0x02 , 0x05 , 0xE8 , 0x28 , 0xBD , 0x08 , 0x0F , 0x00 ] response = card. transmit apdu. pack ( "C*" ) response = Smartcard::Iso::IsoCardMixin . deserialize_response response. unpack ( "C*" ) puts_response response end ensure context. release end äžèšã®ããã°ã©ã ãå®è¡ãããšã次ã®ãããªåºåãåŸãããŸãã status = 9000 data = 6F 12 84 10 E8 28 BD 08 0F A0 00 00 03 91 00 00 00 00 00 01 status = 9000 data = 6F 12 84 10 E8 28 BD 08 0F A0 00 00 03 91 00 00 00 00 00 02 status = 6A82 data = SELECT ã³ãã³ããçºè¡ãããš BER-TLV ã§ç¬Šå·åããã FCI(ãã¡ã€ã«å¶åŸ¡æ
å ±)ãååŸã§ããŸãã ïŒã€ç®ã®ããŒã¿ããèŠãŠãããŸãã ïŒãã€ãç®ã¯ 6F ãªã®ã§ããã®ããŒã¿ã¯ãã¡ã€ã«å¶åŸ¡ãã©ã¡ã¿åã³ãã¡ã€ã«ç®¡çããŒã¿ã®éåã衚ããŸãã åŒçš JIS X 6320-4 衚 8-ãã¡ã€ã«å¶åŸ¡æ
å ±çšã®ç£æ¥æå
±éå©çšãã³ãã¬ãŒã ïŒãã€ãç®ã¯ 12 ãªã®ã§ãåŸç¶ããããŒã¿ã®é·ãã 18 ãã€ãããããšã衚ããŸãã ïŒãã€ãç®ã¯ 84 ãªã®ã§ãããŒã¿èŠçŽ ã DF åã§ããããšã衚ããŸãã åŒçš JIS X 6320-4 衚 10-ãã¡ã€ã«å¶åŸ¡ãã©ã¡ã¿ããŒã¿ãªããžã§ã¯ã ïŒãã€ãç®ã¯ 10 ãªã®ã§ãåŸç¶ããããŒã¿ã®é·ãã 16 ãã€ãããããšã衚ããŸãã ïŒãã€ãç®ä»¥éã¯ãDF å(= ã¢ããªã±ãŒã·ã§ã³èå¥å)ã§ãã ïŒã€ç®ã®ããŒã¿ãããŒã¿æ§é ã¯åããªããçç¥ããŸãã ããã§ HPKI ãã¹ãã«ãŒãã«ã¯ã E8 28 BD 08 0F A0 00 00 03 91 00 00 00 00 00 01 E8 28 BD 08 0F A0 00 00 03 91 00 00 00 00 00 02 ãšããïŒã€ã®ã¢ããªã±ãŒã·ã§ã³èå¥åãå«ãŸããŠããããšãåãããŸãã å
¬ééµèšŒææžãååŸãã åæ®µã«ãŠ HPKI ãã¹ãã«ãŒãã«å«ãŸããŠããã¢ããªã±ãŒã·ã§ã³èå¥åãåãããŸããã®ã§ã次ã¯å
¬ééµèšŒææžãååŸããŠãããŸãã ã¬ã€ãã©ã€ã³ ã®ãA.3.2 èšŒææžã®èªã¿åºããã«ããã³ãã³ãã®éãã« APDU ãçºè¡ããŠããæ£ããããŒã¿ã¯è¿ã£ãŠããŸããã ããã¯ãHPKI ãã¹ãã«ãŒãã® EF èå¥åããã¬ã€ãã©ã€ã³ã«èšèŒãããŠãã EF èå¥åãšã¯ç°ãªãããã§ãã HPKI ã«ãŒã㯠JIS X 6320 ã«æºæ ããŠãããããåçš®æå·æ
å ±ãªããžã§ã¯ããžã®ãã¹æ
å ±ãå«ãã EF.OD ãååšããŠããŸãã ãã® EF.OD ã䜿ãå
¬ééµèšŒææžãžã®ãã¹ãååŸããŠãããå
¬ééµèšŒææžãååŸããŠãããŸãã åŒçš ã¬ã€ãã©ã€ã³ EF.OD ãèªã¿èŸŒã prog02.rb # prog02.rb require "smartcard" require "openssl" def puts_response ( response ) puts "status = %04X" % response[ :status ] puts "data = %s" % response[ :data ]. map { | i | "%02X" % i }. join ( " " ) end def decode_asn1 ( response ) data = response[ :data ]. reverse_each . drop_while { | i | i == 0xFF }. reverse return if data. empty? OpenSSL::ASN1 . decode_all data. pack ( "C*" ) end context = Smartcard::PCSC::Context . new begin card = context. card context. readers . first [ [ 0xE8 , 0x28 , 0xBD , 0x08 , 0x0F , 0xA0 , 0x00 , 0x00 , 0x03 , 0x91 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 ], [ 0xE8 , 0x28 , 0xBD , 0x08 , 0x0F , 0xA0 , 0x00 , 0x00 , 0x03 , 0x91 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02 ] ]. each do | aid | # SELECT ã³ãã³ãã§ã¢ããªã±ãŒã·ã§ã³ãéžæãã apdu = [ 0x00 , 0xA4 , 0x04 , 0x00 , 0x10 , *aid, 0x00 ] card. transmit apdu. pack ( "C*" ) # EF.OD ã®èªã¿åºã apdu = [ 0x00 , 0xB0 , 0x91 , 0x00 , 0x00 ] response = card. transmit apdu. pack ( "C*" ) response = Smartcard::Iso::IsoCardMixin . deserialize_response response. unpack ( "C*" ) pp decode_asn1 response end ensure context. release end EF.OD ãèªã¿èŸŒããš DER 笊å·åãããããŒã¿ãè¿ã£ãŠããŸãã ããã OpenSSL::ANS1 ã¢ãžã¥ãŒã«ã§åŸ©å·åãããšã次ã«ååŸããã¹ã EF èå¥åãåãããŸãã EF.OD ã® ASN.1 å®çŸ©ã¯ä»¥äžã®ããã«ãªã£ãŠãããããã¿ã°ã 4 ã§ããããŒã¿ãèªã¿èŸŒãã°è¯ãããã§ãã CIOChoice ::= CHOICE { privateKeys [0] PrivateKeys, publicKeys [1] PublicKeys, trustedPublicKeys [2] PublicKeys, secretKeys [3] SecretKeys, certificates [4] Certificates, trustedCertificates [5] Certificates, usefulCertificates [6] Certificates, dataContainerObjects [7] DataContainerObjects, authObjects [8] AuthObjects, } prog02.rb ãå®è¡ããŠå®éã«åŸãããããŒã¿ [ # äžç¥ #<OpenSSL::ASN1::ASN1Data:0x00007f8b8e0ef7b0 @indefinite_length= false , @tag=4, @tag_class=:CONTEXT_SPECIFIC, @value= [#<OpenSSL::ASN1::Sequence:0x00007f8b8e0ef7d8 @indefinite_length= false , @tag=16, @tag_class=:UNIVERSAL, @tagging=nil, @value= [#<OpenSSL::ASN1::OctetString:0x00007f8b8e0ef800 @indefinite_length= false , @tag=4, @tag_class=:UNIVERSAL, @tagging=nil, @value= "\x00\x04" >]>]> # äžç¥ ] [ # äžç¥ #<OpenSSL::ASN1::ASN1Data:0x00007f8b8d118df0 @indefinite_length= false , @tag=4, @tag_class=:CONTEXT_SPECIFIC, @value= [#<OpenSSL::ASN1::Sequence:0x00007f8b8d118e18 @indefinite_length= false , @tag=16, @tag_class=:UNIVERSAL, @tagging=nil, @value= [#<OpenSSL::ASN1::OctetString:0x00007f8b8d118e40 @indefinite_length= false , @tag=4, @tag_class=:UNIVERSAL, @tagging=nil, @value= "\x00\x04" >]>]>, # äžç¥ ] ã©ã¡ãã®ã¢ããªã±ãŒã·ã§ã³ã 00 04 ã EF.CD(èšŒææžãªããžã§ã¯ãæ
å ±)ã® EF èå¥åã ãšããããšãåãããŸãã EF.CD ãèªã¿èŸŒã prog03.rb # prog03.rb require "smartcard" require "openssl" def puts_response ( response ) puts "status = %04X" % response[ :status ] puts "data = %s" % response[ :data ]. map { | i | "%02X" % i }. join ( " " ) end def decode_asn1 ( response ) data = response[ :data ]. reverse_each . drop_while { | i | i == 0xFF }. reverse return if data. empty? OpenSSL::ASN1 . decode_all data. pack ( "C*" ) end context = Smartcard::PCSC::Context . new begin card = context. card context. readers . first [ [ 0xE8 , 0x28 , 0xBD , 0x08 , 0x0F , 0xA0 , 0x00 , 0x00 , 0x03 , 0x91 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 ], [ 0xE8 , 0x28 , 0xBD , 0x08 , 0x0F , 0xA0 , 0x00 , 0x00 , 0x03 , 0x91 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02 ] ]. each do | aid | # SELECT ã³ãã³ãã§ã¢ããªã±ãŒã·ã§ã³ã apdu éžæãã = [ 0x00 , 0xA4 , 0x04 , 0x00 , 0x10 , *aid, 0x00 ] card. transmit apdu. pack ( "C*" ) # SELECT ã³ãã³ãã§ EF èå¥å`00 04`ãéžæãã apdu = [ 0x00 , 0xA4 , 0x02 , 0x0C , 0x02 , 0x00 , 0x04 ] card. transmit apdu. pack ( "C*" ) # READ BINARY ã³ãã³ãã§ãã¡ã€ã«ãèªã¿èŸŒã data = [] offset = 0 loop do apdu = [ 0x00 , 0xB0 , (offset & 0x7FFF ) >> 8 , (offset & 0x00FF ), 0x00 ] response = card. transmit apdu. pack ( "C*" ) response = Smartcard::Iso::IsoCardMixin . deserialize_response response. unpack ( "C*" ) data. concat response[ :data ] break if response[ :data ]. all? { | e | e == 0xFF } break unless response[ :status ] == 0x9000 offset += response[ :data ]. size end pp decode_asn1 data: data end ensure context. release end prog03.rb ãå®è¡ããŠå®éã«åŸãããããŒã¿ [ # äžç¥ #<OpenSSL::ASN1::Sequence:0x00007ffdf99aaf70 @indefinite_length= false , @tag=16, @tag_class=:UNIVERSAL, @tagging=nil, @value= [#<OpenSSL::ASN1::OctetString:0x00007ffdf99ab038 @indefinite_length= false , @tag=4, @tag_class=:UNIVERSAL, @tagging=nil, @value= "\x00\x16" >, #<OpenSSL::ASN1::Integer:0x00007ffdf99aafe8 @indefinite_length= false , @tag=2, @tag_class=:UNIVERSAL, @tagging=nil, @value=#<OpenSSL::BN 0>>, #<OpenSSL::ASN1::ASN1Data:0x00007ffdf99aaf98 @indefinite_length= false , @tag=0, @tag_class=:CONTEXT_SPECIFIC, @value= "\x05\x17" >]> # äžç¥ ] [ # äžç¥ #<OpenSSL::ASN1::Sequence:0x00007ffdfa072308 @indefinite_length= false , @tag=16, @tag_class=:UNIVERSAL, @tagging=nil, @value= [#<OpenSSL::ASN1::OctetString:0x00007ffdfa072448 @indefinite_length= false , @tag=4, @tag_class=:UNIVERSAL, @tagging=nil, @value= "\x00\x16" >, #<OpenSSL::ASN1::Integer:0x00007ffdfa0723d0 @indefinite_length= false , @tag=2, @tag_class=:UNIVERSAL, @tagging=nil, @value=#<OpenSSL::BN 0>>, #<OpenSSL::ASN1::ASN1Data:0x00007ffdfa072380 @indefinite_length= false , @tag=0, @tag_class=:CONTEXT_SPECIFIC, @value= "\x05%" >]> ] # äžç¥ ããã§å
¬ééµèšŒææžãã¡ã€ã«ã® EF èå¥åã 00 16 ã§ããããšã倿ããŸããã å
¬ééµèšŒææžãèªã¿èŸŒã prog04.rb # prog04.rb require "smartcard" require "openssl" context = Smartcard::PCSC::Context . new begin card = context. card context. readers . first [ [ 0xE8 , 0x28 , 0xBD , 0x08 , 0x0F , 0xA0 , 0x00 , 0x00 , 0x03 , 0x91 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 ], [ 0xE8 , 0x28 , 0xBD , 0x08 , 0x0F , 0xA0 , 0x00 , 0x00 , 0x03 , 0x91 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02 ] ]. each do | aid | # SELECT ã³ãã³ãã§ã¢ããªã±ãŒã·ã§ã³ãéžæãã apdu = [ 0x00 , 0xA4 , 0x04 , 0x00 , 0x10 , *aid, 0x00 ] card. transmit apdu. pack ( "C*" ) # SELECT ã³ãã³ãã§ EF èå¥å`00 16`ãéžæãã apdu = [ 0x00 , 0xA4 , 0x02 , 0x0C , 0x02 , 0x00 , 0x16 ] card. transmit apdu. pack ( "C*" ) # READ BINARY ã³ãã³ãã§ãã¡ã€ã«ãèªã¿èŸŒã data = [] offset = 0 loop do apdu = [ 0x00 , 0xB0 , (offset & 0x7FFF ) >> 8 , (offset & 0x00FF ), 0x00 ] response = card. transmit apdu. pack ( "C*" ) response = Smartcard::Iso::IsoCardMixin . deserialize_response response. unpack ( "C*" ) data. concat response[ :data ] break if response[ :data ]. all? { | e | e == 0xFF } break unless response[ :status ] == 0x9000 offset += response[ :data ]. size end cert = OpenSSL::X509::Certificate . new (data. reverse_each . drop_while { | i | i == 0xFF }. reverse . pack ( "C*" )) puts cert. to_text end ensure context. release end HPKI ãã¹ãã«ãŒããã DER 笊å·åãããå
¬ééµèšŒææžããŒã¿ãååŸã§ããã®ã§ã OpenSSL::X509::Certificate.new ã§ã€ã³ã¹ã¿ã³ã¹åã§ããŸãã äžèšã® prog04.rb ãå®è¡ãããšäžèšã®ãããªåºåãåŸãããŸãã Certificate: Data: Version: 3 (0x2) Serial Number: 13023 (0x32df) Signature Algorithm: sha256WithRSAEncryption Issuer: C=JP, O=Japan Medical Association, OU=Digital Certificate Center, CN=HPKI-01-HPKI_JV2-forNonRepudiation Validity Not Before: Aug 15 15:00:00 2017 GMT Not After : Aug 15 14:59:59 2018 GMT Subject: C=JP, CN=JMACombi20413/serialNumber=TESTC20413 Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit ) Modulus: 00:94:dd:09:40:f4:58:f9:0f:ec:3a:ea:e3:47:33: # äžç¥ Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Authority Key Identifier: keyid:44:E9:20:05:4D:6D:C4:B7:FA:4B:F0:1B:C6:EA:C8:D6:5B:16:22:F4 DirName:/C =JP/O=Ministry of Health, Labour and Welfare/OU=Director-General for Policy Planning and Evaluation/OU=MHLW HPKI Root CA V2 serial:02 X509v3 Subject Key Identifier: 9E:E5:71:59:1E:A7:FC:1E:4A:31:F8:7B:30:0B:E3:7F:05:3D:9A:40 X509v3 Key Usage: critical Non Repudiation X509v3 CRL Distribution Points: Full Name: URI:https://crl.pki.med.or.jp/repository/crl/crl-sign2.crl X509v3 Subject Directory Attributes: 0402..(..B..1(1 & 0$. "1 ... *.............Medical Doctor X509v3 Certificate Policies: critical Policy: 1.2.392.100495.1.5.1.1.0.1 CPS: https://www.pki.med.or.jp/certpolicy/ Signature Algorithm: sha256WithRSAEncryption 84:ae:95:45:5e:e7:64:8b:0c:6e:20:5f:9f:1f:0d:5c:ae:4a: # äžç¥ Certificate: Data: Version: 3 (0x2) Serial Number: 12927 (0x327f) Signature Algorithm: sha256WithRSAEncryption Issuer: C=JP, O=Japan Medical Association, OU=Digital Certificate Center, CN=HPKI-01-HPKI_JV2-forAuthentication-forIndividual Validity Not Before: Aug 15 15:00:00 2017 GMT Not After : Aug 15 14:59:59 2018 GMT Subject: C=JP, CN=JMACombi20413/serialNumber=TESTC20413 Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:c6:f9:06:26:58:5e:11:b7:12:f2:8a:3e:97:0a: # äžç¥ Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Authority Key Identifier: keyid:62:12:93:82:DE:3C:D7:FF:A8:D3:63:01:D3:01:6A:AE:6C:3B:C0:D4 DirName:/C=JP/O=Ministry of Health, Labour and Welfare/OU=Director-General for Policy Planning and Evaluation/OU=MHLW HPKI Root CA V2 serial:03 X509v3 Subject Key Identifier: 45:2B:7B:B4:47:89:3D:6C:05:6D:82:4D:4C:C8:80:B8:B4:B0:89:81 X509v3 Key Usage: critical Digital Signature X509v3 CRL Distribution Points: Full Name: URI:https://crl.pki.med.or.jp/repository/crl/crl-auth2.crl X509v3 Subject Directory Attributes: 0402..(..B..1(1&0$." 1 ... *.............Medical Doctor X509v3 Certificate Policies: critical Policy: 1.2.392.100495.1.5.1.2.0.1 CPS: https://www.pki.med.or.jp/certpolicy/ Signature Algorithm: sha256WithRSAEncryption # äžç¥ ããããã®ã¢ããªã±ãŒã·ã§ã³ããæ£ããå
¬ééµèšŒææžãååŸã§ããŸããã é»åèªèšŒã¬ã€ãã©ã€ã³ ã«ãããšãé»åèªèšŒã«äœ¿çšããèšŒææžã¯ Issuer ã® CN(Common Name)ã HPKI-01-*-forAuthentication-forIndividual ã§ããããšãå®ããããŠããããã 䜿çšãã HPKI ãã¹ãã«ãŒãã§ã¯ãé»åèªèšŒã«äœ¿çšããã¢ããªã±ãŒã·ã§ã³èå¥å㯠E8 28 BD 08 0F A0 00 00 03 91 00 00 00 00 00 02 ã§ããããšãåãããŸãã ãŸããé»å眲åã«äœ¿çšããã¢ããªã±ãŒã·ã§ã³èå¥å㯠E8 28 BD 08 0F A0 00 00 03 91 00 00 00 00 00 01 ã§ããããšãåãããŸããã æåŸã« 以äžã§ ã¬ã€ãã©ã€ã³ ã®ãA.2.2 JIS X 6320-15 ã«åŸã£ã PKI ã«ãŒããã¢ãããªã±ãŒã·ã§ã³ã®æ€çŽ¢ãšå©çšãã«ãããPKI ã«ãŒããã¢ãããªã±ãŒã·ã§ã³ã®æ€çŽ¢ããŸã§å®è£
ã§ããŸããã ä»åŸã次ã®ã¹ãããã§ããæå·èšç®ãå®è£
ããŠãããããšæããŸãã