æè¿ã APIèšèšã«ã€ããŠThunderbirdéçºè ãšãã£ããããŸãã ããã®äŒè©±ã®éã«ãç§ã¯äžã®ç§ã®èãã§å ±æ RNPã OpenPGPã®ã®æ°ããå®è£ Thunderbirdã¯æè¿ã®ä»£ããã«äœ¿çšãå§ããŠããããš ã¯GnuPGãã
察話è ã¯ãRNP APIãæ¹åããå¿ èŠããããšããç§ã®è«æã«æççã§ãã䞻芳çã§ã¯ãããŸããããã©ã¡ãã®APIãåªããŠããŠãã©ã¡ããæªãã®ã§ããïŒããšå°ããŸããã APIãè©äŸ¡ããããã®é©åãªææšããªãããšã«åæããŸããããããååãšããŠAPIã倿ã§ããªãããšã«åæããŸããã
å®éãçµéšè±å¯ãªããã°ã©ããŒã®ã»ãšãã©ã¯ãAPIãèŠããšãæªãAPIãèªèãããšæããŸãããã®èšäºã§ããã«ãåªãããã¥ãŒãªã¹ãã£ãã¯ãéçºããããšã倿ãããšæããŸããããã¯ãGnuPGãSequoiaã§ã®ïŒããã³ãã以äžã®ïŒèªåã®çµéšã«åºã¥ããŠæ§ç¯ããããšããŸãã ããã³RNPãæ¬¡ã«ãRNPAPIã«ã€ããŠèª¬æããŸããæ®å¿µãªããããã®APIã¯ç°¡åã«èª€çšãããå¯èœæ§ãããã ãã§ãªããæ¬ºççã§ãããããã»ãã¥ãªãã£ãéèŠãªã³ã³ããã¹ãã§ã¯ãŸã 䜿çšããªãã§ãã ããããããããµã³ããŒããŒãã®ã¿ãŒã²ãããªãŒãã£ãšã³ã¹ã¯ããžã£ãŒããªã¹ããæŽ»åå®¶ãåŒè·å£«ãããã³ãã®ã³ãã¥ãã±ãŒã·ã§ã³ããŒãããŒãªã©ãè匱ã§ããããšãç¥ãããŠãã人ã ã§ããããããã¹ãŠã®äººã ã¯ä¿è·ãå¿ èŠãšããŠããŸããç§ã®æèŠã§ã¯ãããã¯ThunderbirdãRNPã䜿çšãããã©ããã«ã€ããŠããäžåºŠèããã¹ãã§ããããšãæå³ããŸãã
泚ïŒãã®ã¡ãŒã«ãèªãããšããå§ãããŸãïŒ Thunderbirdã§GPLã©ã€ãã©ãªã䜿çšããŸãããïŒ ããã ThunderbirdDevelopmentPlanningã® æçš¿ã«éä¿¡ ããŸããã
æªãAPIã®ç¹åŸŽã¯äœã§ããïŒ
JustusãšKaiã§Sequoiaãéå§ããå㯠ã3人ã§GnuPGã«åãçµãã§ããŸãã ãç§ãã¡ã¯èªåãã¡ã§gpgãæãäžããã ãã§ãªãããã®åŸã®å€ãã®gpgãŠãŒã¶ãŒãšè©±ãåã£ããååãããããŸããã人ã ã¯GnuPGã«ã€ããŠå€ãã®è¯ãããšãèšãããšãã§ããŸãã ã
gpgã«å¯Ÿããæ¹å€ã«é¢ããéããæãéèŠãªã®ã¯APIã«é¢ãã2çš®é¡ã®æ¹å€ã§ãããæåã®èŠçŽã¯ããã§ãïŒgpgAPIã¯ããŸãã«ãç¬æçã§ããããšãã°ãgpgã¯ããŒãªã³ã°ã¢ãããŒãã䜿çšããŸãããããã£ãŠãOpenPGPèšŒææžã¯ãå人ããŒããŒã¹ã«ã€ã³ããŒããããŠããå Žåã«ã®ã¿è¡šç€ºãŸãã¯äœ¿çšã§ããŸãããã ããäžéšã®éçºè ã¯ãæåã«èšŒææžã確èªããŠããããããã€ã³ããŒãããããšèããŠããŸããããšãã°ãããŒãµãŒããŒã§ãã£ã³ã¬ãŒããªã³ãã䜿çšããŠèšŒææžãæ€çŽ¢ããå Žå ãè¿ãããèšŒææžãæ¬åœã«å¿ èŠãªãã®ã§ãããã©ããã確èªã§ããŸãããã®URLã¯èªå·±èªèšŒã§ããããã§ããããã¯gpgã䜿çšããŠå®è¡ã§ããŸãããåé¿çãšããŠã®ã¿ãããã«åã蟌ãŸããŠããããã°ã©ãã³ã°ã¢ãã«ã®ååããã€ãã¹ããŸããåºæ¬çãªèãæ¹ã¯æ¬¡ã®ãšããã§ããäžæãã£ã¬ã¯ããªãäœæããããã«æ§æãã¡ã€ã«ã远å ããgpgã«ä»£æ¿ãã£ã¬ã¯ããªã䜿çšããããã«æç€ºããããã«èšŒææžãã€ã³ããŒãããèšŒææžã確èªããŠãããäžæãã£ã¬ã¯ããªãã¯ãªã¢ããŸããããã¯ã åŸç¶ã®gpgãŠãŒã¶ãŒãšã®äŒè©±ã«åºã¥ããŠJustusã«ãã£ãŠè¿œå ãã ã å ¬åŒã®æšå¥šäºé ã§ããã¯ãããã®æ¹æ³ã¯æ©èœããŸãããã ãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«åºæã®ã³ãŒããäœæããå¿ èŠããããŸãããã®ã³ãŒãã¯é ãããã°ãé »ç¹ã«çºçããŸãã
ç§ãã¡ãäœåºŠãééããå¥ã®ã¯ã©ã¹ã®æèŠã¯ãgpgã䜿çšããã«ã¯ããã®ã¡ã«ããºã ãä¹±çšããªãããã«ãå€ãã®éèªæãªããšãç¥ãå¿ èŠããããšããããšã§ãããŸãã¯ãå¥ã®èšãæ¹ãããã°ãgpg APIã䜿çšãããšãã¯ãã³ãŒãã«äžæ³šæã§è匱æ§ãå°å ¥ãããªãããã«ååã«æ³šæããå¿ èŠããã ãŸãã
2çªç®ã®æžå¿µäºé ãããããçè§£ããããã«ãEFAILã®è匱æ§ãæ€èšã㊠ãã ãã..ã gpg埩å·åAPIã®äž»ãªåé¡ïŒã¡ãã»ãŒãžã埩å·åãããšããå ¥åãç ŽæããŠããå Žåã§ããgpgã¯ãã¬ãŒã³ããã¹ããåºåããŸãããã®å Žåãgpgã¯ãšã©ãŒãè¿ããŸãããäžéšã®ããã°ã©ã ã¯äŸç¶ãšããŠç Žæãã圢åŒã§ãã¬ãŒã³ããã¹ããåºåããŸããã§ã¯ããªãã§ããïŒäœã衚瀺ããªãããããã¡ãã»ãŒãžã®å°ãªããšãäžéšã衚瀺ããæ¹ãééããªãè¯ãã§ãããã EFAILã®è匱æ§ã¯ãæ»æè ããããå©çš ããŠæå·åãããã¡ãã»ãŒãžã«Webãã°ãæ¿å ¥ããæ¹æ³ã瀺ããŠã ãŸãããŠãŒã¶ãŒããã®æçš¿ã衚瀺ãããšãWebãã°ãæçš¿ããæŒããŸãããµã ã
ã§ã¯ããã®ãã°ã¯èª°ã®ããã§ããïŒGnuPG éçºè 㯠ããã䞻匵ããŸãã åé¡ã¯ãgpgã誀ã£ãŠäœ¿çšãããšããç¹ã§ãã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã«ãããŸãã
ã¡ãŒã«ãŠãŒã¶ãŒãšãŒãžã§ã³ãã¯ãã¹ããŒã¿ã¹ã³ãŒãDECRYPTION_FAILEDãå°éããããŒã¿ã衚瀺ããªãããå°ãªããšãããªã©ã¯ã«ãäœæããã«ç ŽæããŠããå¯èœæ§ã®ããã¡ãŒã«ã衚瀺ããé©åãªæ¹æ³ãéžæããããšããå§ãããŸããã¡ãŒã«ãèªä¿¡ãåºæ¿ããªãããšããŠãŒã¶ãŒã«éç¥ããŸãã
gpgã¯ãšã©ãŒãéç¥ããŸãããã¢ããªã±ãŒã·ã§ã³ã¯APIã³ã³ãã©ã¯ããå°éããŸãããç§ã¯GnuPGéçºè ã«åæãã远å ããå¿ èŠããããŸããgpgã€ã³ã¿ãŒãã§ãŒã¹ã¯ããŠãŒã¶ãŒã«ç¶è¡æ¹æ³ãæç€ºããªããããæéç匟ã§ããïŒãããŠä»ã§ãããã§ãïŒãããã©ããããç°¡åã§äžèŠæçãªè¡åã¯ééã£ãŠããŸãããã㊠ãã® çš®ã®APIæ®å¿µãªãããGnuPGã§ã¯äžè¬çã§ãã
è¯ãAPIãäœããã®ã¯äœã§ããïŒ
gpg APIãç¬æçãããŠé©åã«äœ¿çšããã®ãé£ãããšãããããã2ã€ã®ããšãèªèããŠãç§ã®èšç»ã圢äœããŸãããã»ã³ã€ã¢ãããžã§ã¯ããå§ãããšããç§ãã¡ã¯ãã®ãããªééããé¿ããããšåæããŸãããç§ãã¡ã®èгå¯ã«åºã¥ããŠãSequoiaAPIã®éçºã®åç §ãã€ã³ããšããŠåŒãç¶ã䜿çšãã2ã€ã®ãã¹ããå®è¡ããŸããããŸããé«ã¬ãã«ã®APIã« å ããŠãç¬æçã§ã¯ãªãäœã¬ãã«ã®APIãå¿ èŠã§ããããã¯ããŠãŒã¶ãŒãçŠæ¢ãããŠããªãããšãå®è¡ããããšã劚ããªããšããæå³ã§ããåæã«ã APIã¯ãŠãŒã¶ãŒãé©åãªïŒããŒãã³ãŒããããïŒãã®ã«å°ããé©åãªã¢ã¯ã·ã§ã³ãå®è¡ããããããã¢ã¯ã·ã§ã³ãéžæãããšãã«æãæçœã«ããå¿ èŠããããŸãã
ãã¹ãŠãå¯èœã«ããããšã©ãŒãé²ããšãããããã2ã€ã®ãããã«ççŸããç®æšãéæããããã«ãã¿ã€ããšäŸã®2ã€ã®ããŒã«ã«ç¹ã«å€§ããäŸåããŠããŸãããAPIã³ã³ãã©ã¯ãã¯ã³ã³ãã€ã«æã«åœ¢åŒåãããç¹å®ã®å€æã匷å¶ãããããåã䜿çšãããšãæå³ããªãæ¹æ³ã§ãªããžã§ã¯ãã䜿çšããããšãå°é£ã«ãªããŸã ãäŸïŒã³ãŒãã¹ããããïŒã ã³ããŒãããŸãããããã£ãŠãè¯ãäŸã¯ã颿°ãæ£ãã䜿çšããæ¹æ³ããŠãŒã¶ãŒã«æããã ãã§ãªãããŠãŒã¶ãŒã颿°ã䜿çšããæ¹æ³ã«ã倧ãã圱é¿ããŸãã
ã¿ã€ã
ã»ã³ã€ã¢ã§åã䜿çšããæ¹æ³ãšãããããåªããAPIã®äœæã«ã©ã®ããã«åœ¹ç«ã€ããäŸã§ç€ºããŸããäŸãããæç¢ºã«ããããã«ãOpenPGPã«é¢ããããã€ãã®ã³ã³ããã¹ããæãåºããšäŸ¿å©ã§ãã
OpenPGP
OpenPGPã«ã¯ãèšŒææžãã³ã³ããŒãã³ãïŒããŒããŠãŒã¶ãŒIDãªã©ïŒããã€ã³ãã£ã³ã°çœ²åãªã©ãããã€ãã®åºæ¬çãªããŒã¿åããããŸããèšŒææžã®ã«ãŒãã¯ãèšŒææžã®ãã£ã³ã¬ãŒããªã³ããå®å šã«èå¥ãããã©ã€ããªããŒã§ãïŒãã£ã³ã¬ãŒããªã³ã=ããã·ã¥ïŒãã©ã€ããªããŒïŒïŒãèšŒææžã«ã¯éåžžããµãããŒããŠãŒã¶ãŒIDãªã©ã®ã³ã³ããŒãã³ããå«ãŸããŠããŸãã OpenPGPã¯ããããããã€ã³ãã£ã³ã°çœ²åã䜿çšããŠã³ã³ããŒãã³ããèšŒææžã«ãã€ã³ãããŸããéåžžã®äž»ããŒããã·ã¥ããã£ã³ã¬ãŒããªã³ããšããŠäœ¿çšãã眲åã䜿çšããŠã³ã³ããŒãã³ããäž»ããŒã«ãã€ã³ããããšãåŸã§è¿œå ã®ã³ã³ããŒãã³ãã远å ã§ããããã«æ¡ä»¶ãäœæãããŸãããã€ã³ãã£ã³ã°çœ²åã«ã¯ããããã£ãå«ãŸããŸãããããã£ãŠãããšãã°ããµãããŒã®æå¹æéãå»¶é·ããããã«ãã³ã³ããŒãã³ãã倿Žããããšãã§ããŸããçµæãšããŠãè€æ°ã®æå¹ãªçœ²åãç¹å®ã®ã³ã³ããŒãã³ãã«é¢é£ä»ããããšãã§ããŸããã¢ã³ã«ãŒçœ²åã¯åºæ¬çãªã ãã§ãªããOpenPGPã»ãã¥ãªãã£ã¡ã«ããºã ã«äžå¯æ¬ ã§ãã
æå¹ãªãã€ã³ãã£ã³ã°çœ²åã¯å€æ°ååšããå¯èœæ§ããããããå¿ èŠãªãã®ãéžæããæ¹æ³ãå¿ èŠã§ããæåã®æŠç®ãšããŠãå¿ èŠãªçœ²åããå°æ¥å»¶æãããŠããªããææ°ã®ãæå¹æéãåããŠããªããåãæ¶ãããŠããªãæå¹ãªçœ²åã§ãããšæ³å®ããŸããããããæå¹ãªçœ²åãšã¯äœã§ããïŒã»ã³ã€ã¢ã§ã¯ã眲åã¯æ°åŠçãã§ãã¯ã«åæ Œããã ãã§ãªããããªã·ãŒãšäžèŽããŠããå¿ èŠããããŸããäŸãã°ãã«ããåœç€Ÿã®èœåã«ãã 劥åã®è¡çªã«èããæã ã¯å¯äž ã®ç¶æ³ã¯éåžžã«å°æ°ã®SHA-1ãå¯èœã ïŒ PGPainlessã«åãçµãã§ããPaul Schaub㯠ãæè¿ã ãããã®è€éãã«ã€ããŠè©³ããæžããŠããŸãããïŒAPIãŠãŒã¶ãŒã«ããããã¹ãŠã®èæ ®äºé ã念é ã«çœ®ãããã«åŒ·å¶ããããšã«ãããè匱æ§ã®æž©åºãäœæããŸããã»ã³ã€ã¢ã§ã¯ãæå¹æéãååŸããç°¡åãªæ¹æ³ãå®å šãªæ¹æ³ã§ããæåŸ ã©ããã«æ©èœããæ¬¡ã®ã³ãŒãã«ã€ããŠèããŠã¿ãŸãã
let p = &StandardPolicy::new();
let cert = Cert::from_str(CERT)?;
for k in cert.with_policy(p, None)?.keys().subkeys() {
println!("Key {}: expiry: {}",
k.fingerprint(),
if let Some(t) = k.key_expiration_time() {
DateTime::<Utc>::from(t).to_rfc3339()
} else {
"never".into()
});
}
cert
èšŒææžã§ããããªã·ãŒãé©çšããããšããå§ããŸãã ïŒããªã·ãŒã¯ãŠãŒã¶ãŒå®çŸ©ã§ãããååãšããŠã StandardPolicy ã§ååã§ããã ãã§ãªããæãé©åã§ãïŒãå®éãããã¯èšŒææžã®ãã¥ãŒãäœæãããå Žæã§ãããæå¹ãªãã€ã³ãã£ã³ã°çœ²åãæã€ã³ã³ããŒãã³ãã®ã¿ã衚瀺ãããŸããéèŠãªã®ã¯ãããã¯ãŸããå€ãã®æ°ããã¡ãœããã倿ŽããŠå°å ¥ããããšã§ããããšãã°ãkeysã¡ãœããã¯ãKeyAmalgamation ã§ã¯ãªãValidKeyAmalgamationãè¿ãããã«å€æŽãã ãŸããã ïŒçµæã«ã¯ããŒã ãã§ãªããããã«é¢é£ãããã¹ãŠã®çœ²åãå«ãŸãããããããã¯ããŒãžã§ãããã®ããã»ã¹ã¯å¡éãšåŒã°ããæ¹ããããš èãã人ãããŸãã..ã ¯\ _ïŒãïŒ_ /¯ïŒValidKeyAmalgamationã«ã¯ãäžèšã®åºæºã«åŸã£ãŠæå¹ãªã¢ã³ã«ãŒçœ²åããããŸãããŸããkey_expiration_timeã®ãããªã¡ãœãããæäŸããŸããããã¯ãæå¹ãªããŒã§ã®ã¿æå³ããããŸãããŸããkey_expiration_timeã§äœ¿çšãããæ»ãã¿ã€ãã¯äººéå·¥åŠçã§ããããšã«æ³šæããŠãã ããã key_expiration_timeã¯ãçã®å€ãè¿ã代ããã«ãå®å šã§äœ¿ããããSystemTimeãè¿ããŸã ã
æåã®ããã¹ãŠèš±å¯ãã®ååã«æ²¿ã£ãŠãéçºè ã¯åŒãç¶ãåäžã®çœ²åãžã®ã¢ã¯ã»ã¹ãä¿æ ãããµãããã±ãŒãž ã 調æ»ããŸãããŒã®æå¹æéãåãããšãã«ãå¥ã®çœ²åãã€ã³ãã£ã³ã°ããæ€çŽ¢ããŸãããã ããSequoia APIãããŒã®æå¹æéãæ£ããèªèããŠãããšæ³å®ãããæ¹æ³ãšæ¯èŒãããšãä»ã®ã¢ãããŒãã¯APIãšççŸããŸããããã¯ç§ãã¡ã®æèŠã§ã¯è¯ãAPIã§ãã
ã®äŸ
Sequoiaã©ã€ãã©ãªã®1.0ãªãªãŒã¹ã¯ã2020幎12æã«è¡ãããŸããããã®9ãæåã«ããã£ãŒãã£ãŒã³ã³ããªãŒãã®ç¶æ³ã«å ¥ãããªãªãŒã¹ã®æºåãæŽããŸããããããã圌ãã¯åŸ ã£ãŠ ããŸãããããã¥ã¡ã³ããšäŸããããªãã¯APIã«è¿œå ããã®ã«æ¬¡ã®9ãæããããŸããã äŸã«ã€ããŠã¯ãCertããŒã¿æ§é ã®ããã¥ã¡ã³ãã åç §ããŠãã ãããäœãåŸããããã確èªããŠãã ãããç§ãã¡ã®æçš¿ã§ææãããŠããããã«ããã¹ãŠã®æ©èœã®äŸã1ã€ãŸã§æäŸããããšã¯ã§ããŸããã§ããããããªãã®ããšãè¡ããŸãããäŸãæžãããšãžã®ããŒãã¹ãšããŠãç§ãã¡ã¯ãŸããããã€ãã®ç²ããšããžãèŠã€ããããšãã§ããŸããããããŠãããã¯ç§ãã¡ããã®éçšã§ç£šããŸããã
ãªãªãŒã¹åŸãã³ãŒãã«Sequoiaãå«ããå€ãã®éçºè ãšè©±ãããããšãã§ããŸããã圌ãã®ãã£ãŒãããã¯ã«å ±éããã¹ã¬ããã¯ãããã¥ã¡ã³ããšäŸã®äž¡æ¹ãã©ãã»ã©æçšã§ããããèªèããããšã§ãããããã¯ç§ãã¡ã®ã³ãŒãã§ãããã»ãŒæ¯æ¥ããã¥ã¡ã³ãã調ã¹ãŠãç¬èªã®äŸãã³ããŒããŠããããšã確èªã§ããŸããç°¡åã§ããäŸã¯ç¹å®ã®æ©èœãæ£ãã䜿çšããæ¹æ³ã瀺ããŠããã®ã§ããªãæåããããçŽãã®ã§ããïŒ
RNP API
RNP ã¯ãäž»ã«Riboseã«ãã£ãŠéçºãããOpenPGPã®æ°ããå®è£ ã§ã ãçŽ 2幎åãThunderbirdã¯Enigmail ãThunderbirdã«çµ±åãããšåæã«ãGnuPGãRNPã«çœ®ãæããããšã決å®ã ãŸãã ããµã³ããŒããŒããRNPãéžãã ãšããäºå®ã¯ãRNPãåã°ããã ãã§ã¯ãããŸãããããã¯ãŸããRNPãã¡ãŒã«ãæå·åããããã®OpenPGPã®æãèŠæ±ãããå®è£ ã«ãªã£ãããšãæå³ããŸãã
æ¹å€ã¯åŠå®çãªãã®ãšããŠèªèãããããã§ããã¯ã£ãããããŠããããã®ã§ããããªããŒã¹ãè¡ã£ãŠããäœæ¥ã¯è¯ããŠéèŠã ãšæããŸããOpenPGPã®æ°ããå®è£ ã«æéãšåŽåãè²»ãããŠããã圌ãã«æè¬ããŠããŸããOpenPGPãšã³ã·ã¹ãã ã¯å¿ æ»ã«å€æ§æ§ã远å ããå¿ èŠããããŸããããããããã¯ãã»ãã¥ãªãã£ãéèŠãªç¶æ³ã§äœ¿çšããããã®æªçãªè£œåããªãªãŒã¹ããããã®èšãèš³ã«ã¯ãªããŸããã
ã»ãã¥ãªãã£ãéèŠãªã€ã³ãã©ã¹ãã©ã¯ãã£
æ®å¿µãªãããRNPã¯ãç§ã®æèŠã§ã¯ãå®å šã«å±éã§ããç¶æ ã«ã¯ãŸã éããŠããŸããã Enigmailã¯ãããŒã¿ã®ãã©ã€ãã·ãŒãæžå¿µãã人ã ã ãã§ãªããèªåèªèº«ã®å®å šãšå¯Ÿè©±è ã®å®å šãæ°ã«ãããžã£ãŒããªã¹ããæŽ»åå®¶ãåŒè·å£«ã«ãã£ãŠã䜿çšãããŠããŸããã 2017幎ã®ã€ã³ã¿ãã¥ãŒã§ããã³ãžã£ãã³ã»ã€ã¹ãã€ã«ãã¢ãžã¢å€ªå¹³æŽå°åã®ç« ã®é åœå¢ãªãèšè å£ã¯ãèšã£ãïŒ
ç§ãã¡ã¯ãäž»ã«ãåœç€Ÿã®ãœãŒã¹ãšèªç±ã«éä¿¡ããããã«GPGã䜿çšããŠããŸãã圌ãã人暩ãšãããã®æš©å©ã®äŸµå®³ã«ã€ããŠç§ãã¡ã«æäŸããæ å ±ã¯åœŒãã«ãšã£ãŠå®å šã§ã¯ãªãã®ã§ãç§ãã¡ã®äŒè©±ã®å®å šæ§ãä¿è·ããå¿ èŠããããŸãã çµç¹ããã®
ãã³ãžã£ãã³ã»ã€ã¹ãã€ã«ãžã®ã€ã³ã¿ãã¥ãŒåœå¢ãªãèšè å£
ãµã³ããŒããŒãã¯ããã®ç§»è¡æéäžã§ãã£ãŠãããããã®ãŠãŒã¶ãŒã«å¯èœãªéãå®å šãªäœéšãæäŸãç¶ããããšãéèŠã§ãã
RNPããã³ãµãããŒãã€ã³ãã£ã³ã°çœ²å
ã»ã³ã€ã¢ã§åã䜿çšããŠAPIã®èª€çšãå°é£ã«ããæ¹æ³ã«ã€ããŠèª¬æããéã«ããããæ°è¡ã®ã³ãŒãã§ããŒã®æå¹æéã確èªããæ¹æ³ã瀺ããŸããããŸããOpenPGPãŸãã¯RNPã«äžæ £ããªäººã«ãRNPã䜿çšããŠåãæ©èœãå®è£ ããæ¹æ³ã瀺ãäŸããå§ããããšæããŸãããæ¬¡ã®ã³ãŒãã¯ãèšŒææžãµãããŒïŒããŒïŒãç¹°ãè¿ãåŠçããåãµãããŒã®æå¹æéã衚瀺ããŸããæ³šæãšããŠãæå¹æéã¯ãµãããŒãã€ã³ãã£ã³ã°çœ²åã«ä¿åãããå€0ã¯ãããŒãç¡æéã«ãªãããšã¯ãªãããšã瀺ããŸãã
int i;
for (i = 0; i < sk_count; i ++) {
rnp_key_handle_t sk;
err = rnp_key_get_subkey_at(key, i, &sk);
if (err) {
printf("rnp_key_get_subkey_at(%d): %x\n", i, err);
return 1;
}
uint32_t expiration_time;
err = rnp_key_get_expiration(sk, &expiration_time);
if (err) {
printf("#%d (%s). rnp_key_get_expiration: %x\n",
i + 1, desc[i], err);
} else {
printf("#%d (%s) expires %"PRIu32" seconds after key's creation time.\n",
i + 1, desc[i],
expiration_time);
}
}
ãã®ã³ãŒããã5ã€ã®ãµãããŒãæã€èšŒææžã§ãã¹ãããŸãããæåã®ãµãããŒã«ã¯æå¹ãªãã€ã³ãã£ã³ã°çœ²åããããæå¹æéã¯ãããŸããã2ã€ç®ã¯æå¹ãªãã€ã³ãã£ã³ã°çœ²åãæã¡ãå°æ¥æéåãã«ãªããŸãã3çªç®ã¯æå¹ãªãã€ã³ãã£ã³ã°çœ²åãæã£ãŠããŸããããã§ã«æå¹æéãåããŠããŸãã4çªç®ã«ã¯ç¡å¹ãªãã€ã³ãã£ã³ã°çœ²åããããããã«åŸã£ãŠãµãããŒã¯å°æ¥æéåãã«ãªããŸãã5çªç®ã®çœ²åã«ã¯ã¢ã³ã«ãŒããŸã£ãããããŸãããåºåã¯æ¬¡ã®ãšããã§ãã
#1 (doesn't expire) expires 0 seconds after key's creation time.
#2 (expires) expires 94670781 seconds after key's creation time.
#3 (expired) expires 86400 seconds after key's creation time.
#4 (invalid sig) expires 0 seconds after key's creation time.
#5 (no sig) expires 0 seconds after key's creation time.
ãŸãããµãããŒã«æå¹ãªãã€ã³ãã£ã³ã°ã·ã°ããã£ãããããç¡å¹ãªãã€ã³ãã£ã³ã°ã·ã°ããã£ããããããŸãã¯ãã€ã³ãã£ã³ã°ã·ã°ããã£ããŸã£ãããªããã«é¢ä¿ãªããrnp_key_get_expirationåŒã³åºããæåããããšã«æ³šæããŠãã ãããããã¥ã¡ã³ããèªããš ããã®åäœã¯å°ãæå€ã«æããŸããããã¯èšãïŒ
.
: 0 , .
ããŒã®æå¹æéã¯ãã€ã³ãã£ã³ã°çœ²åã«æ ŒçŽãããŠãããããOpenPGPã®å°éå®¶ãšããŠãç§ã¯ãããæ¬¡ã®ããã«çè§£ããŠããŸããrnp_key_get_expirationã®åŒã³åºãã¯ããµãããŒã«æå¹ãªãã€ã³ãã£ã³ã°çœ²åãããå Žåã«ã®ã¿æåããŸããå®éãæå¹ãªãã€ã³ãã£ã³ã°çœ²åããªãå Žåã颿°ã¯ããã©ã«ãã§0ã«ãªããŸããããã¯ãäžèšã®ã³ã¡ã³ããåæãšããŠãAPIãŠãŒã¶ãŒã¯æ¬¡ã®ããã«è§£éããããšãæåŸ ããŸãããã®ããŒã¯ç¡æéã«æå¹ã§ãã
ãã®ã³ãŒããæ¹åããã«ã¯ãæåã«ãããŒã«æå¹ãªãã€ã³ãã£ã³ã°çœ²åããããã©ããã確èªããå¿ èŠããããŸããæè¿ãCVE-2021-23991ã«å¯ŸåŠããããã«ããããå®è¡ããããã®ããã€ãã®é¢æ°ãRNPã«è¿œå ãããŸãã ãç¹ã«ãRNPéçºè ããŒãæå¹ãã©ããã«é¢ããæ å ±ãè¿ãrnp_key_is_valid颿°ã远å ãããŸããããã®ã¢ããªã³ã¯ç¶æ³ãæ¹åããŸãããéçºè ã¯ãããã®ã»ãã¥ãªãã£ã¯ãªãã£ã«ã«ãã§ãã¯ãå®è¡ãããã©ãããæç€ºçã«éžæããå¿ èŠããããŸãïŒSequoiaã®å Žåã®ããã«ããã§ã«èšå®ãããŠãããã§ãã¯ãæç€ºçã«æŸæ£ããã®ã§ã¯ãããŸããïŒãã»ãã¥ãªãã£ãã§ãã¯ã¯æçšãªäœæ¥ãè¡ãããšã§ã¯ãªããããå¿ããã¡ã§ããã»ãã¥ãªãã£ãã§ãã¯ãå®è¡ãããŠããªããŠãã³ãŒãã¯æ©èœããŸãããŸããäœããã§ãã¯ããããæ£ããéžæããã«ã¯å°éç¥èãå¿ èŠãªããããã§ãã¯ã¯å¿ããããŸãã
次ã®ã³ãŒãã¯ã»ãã¥ãªãã£ãã§ãã¯ãæäŸããrnp_key_is_validãç¡å¹ãšèŠãªãããŒãã¹ãããããŸãã
int i;
for (i = 0; i < sk_count; i ++) {
rnp_key_handle_t sk;
err = rnp_key_get_subkey_at(key, i, &sk);
if (err) {
printf("rnp_key_get_subkey_at(%d): %x\n", i, err);
return 1;
}
bool is_valid = false;
err = rnp_key_is_valid(sk, &is_valid);
if (err) {
printf("rnp_key_is_valid: %x\n", err);
return 1;
}
if (! is_valid) {
printf("#%d (%s) is invalid, skipping.\n",
i + 1, desc[i]);
continue;
}
uint32_t expiration_time;
err = rnp_key_get_expiration(sk, &expiration_time);
if (err) {
printf("#%d (%s). rnp_key_get_expiration: %x\n",
i + 1, desc[i], err);
} else {
printf("#%d (%s) expires %"PRIu32" seconds after key's creation time.\n",
i + 1, desc[i],
expiration_time);
}
}
åºåïŒ
#1 (doesn't expire) expires 0 seconds after key's creation time.
#2 (expires) expires 94670781 seconds after key's creation time.
#3 (expired) is invalid, skipping.
#4 (invalid sig) is invalid, skipping.
#5 (no sig) is invalid, skipping.
ãã®ã³ãŒãã¯ãæå¹ãªãã€ã³ãã£ã³ã°çœ²åãæããªã2ã€ã®ããŒãæ£ããã¹ãããããŸãããæéåãã®ããŒãã¹ãããããŸããããã¯ããã®é¢æ°ãã...æå¹æéããã§ãã¯ããããšããã¥ã¡ã³ãã§èŠåãããŠããå Žåã§ããããããç§ãã¡ãæãã§ãããã®ã§ã¯ãããŸããã
æéåãã®ããŒãèšŒææžã䜿çšããããªãå ŽåããããŸããããããã«é ŒãããšããããŸããããšãã°ããŠãŒã¶ãŒãããŒã®æŽæ°ãå¿ããå ŽåããŠãŒã¶ãŒã¯ããŒã®æå¹æéãåããŠããããšã確èªããŠããèšŒææžã確èªãããã®å Žåã¯ããŒãæŽæ°ã§ããå¿ èŠããããŸãã
gpg --list-keys
æéåãã®ããŒã¯è¡šç€ºãã ãŸããããèšŒææžãç·šéãããšãã«ãæéåãã®ãµãããŒã¯åŒãç¶ã衚瀺ãããããããŠãŒã¶ãŒã¯æå¹æ§ãæŽæ°ã§ããŸãã
$ gpg --edit-key 93D3A2B8DF67CE4B674999B807A5D8589F2492F9
Secret key is available.
sec ed25519/07A5D8589F2492F9
created: 2021-04-26 expires: 2024-04-26 usage: C
trust: unknown validity: unknown
ssb ed25519/1E2F512A0FE99515
created: 2021-04-27 expires: never usage: S
ssb cv25519/8CDDC2BC5EEB61A3
created: 2021-04-26 expires: 2024-04-26 usage: E
ssb ed25519/142D550E6E6DF02E
created: 2021-04-26 expired: 2021-04-27 usage: S
[ unknown] (1). Alice <alice@example.org>
æéåãã®ããŒãç¡å¹ã«ãã¹ãã§ãªãç¶æ³ã¯ä»ã«ããããŸããããšãã°ãã¢ãªã¹ãããã«ã1幎é100ãŠãŒããæ¯æããŸãããšãã眲åä»ãã¡ãã»ãŒãžãéä¿¡ãã眲åããŒã®æå¹æéã6ãæã§ãããšããŸãã 1幎ãçµãããšãã¢ãªã¹ã¯ãã®çœ²åã«åºã¥ããŠããã«åãããããŸããïŒã¯ããããæããŸãã眲åã¯ãæ·»ä»ããããšãã«æå¹ã§ãããããŒããã§ã«æéåãã«ãªã£ãŠãããšããäºå®ã¯é¢ä¿ãããŸããããã¡ãããããŒã®æå¹æéãåããå Žåãæå¹æéãåããæç¹ã§ããŒã«ãã£ãŠå°å°ããã眲åã¯ç¡å¹ãšèŠãªãããŸããåæ§ã«ãã¡ãã»ãŒãžã¯æéåãã®ããŒã§æå·åããªãã§ãã ããã
ã€ãŸããããŒãæå¹ãšèŠãªãå¿ èŠããããã©ããã¯ãç¶æ³äŸåã§ããrnp_key_is_validã¯äœããªãããã¯ãŸãã§ãããååã«ããããããããã®é¢æ°ã¯ããŒãæå¹ãã©ããã倿ããäžã§éåžžã«åŸ®åŠãªéãããããŸãã
ãã®ã³ãããã®äžéšãšããŠã2çªç®ã®é¢æ°ã远å ãããŸãã
rnp_key_valid_till
ããã®é¢æ°ã¯ããããŒãæå¹ã§ãããšèŠãªãããåã®ã¿ã€ã ã¹ã¿ã³ã...ããŒãæå¹ã§ãªãã£ãå Žåãå€ãšããŠãŒããè¿ãããŸãããè¿ããŸãããã®é¢æ°ã䜿çšãããšãããŒãæå¹ã§ãã£ããã©ããã倿ã§ããŸãããã®ããããã®é¢æ°ããŒã以å€ã®å€ãè¿ããã©ããã確èªããå¿ èŠããããŸãã
int i;
for (i = 0; i < sk_count; i ++) {
rnp_key_handle_t sk;
err = rnp_key_get_subkey_at(key, i, &sk);
if (err) {
printf("rnp_key_get_subkey_at(%d): %x\n", i, err);
return 1;
}
uint32_t valid_till;
err = rnp_key_valid_till(sk, &valid_till);
if (err) {
printf("rnp_key_valid_till: %x\n", err);
return 1;
}
printf("#%d (%s) valid till %"PRIu32" seconds after epoch; ",
i + 1, desc[i], valid_till);
if (valid_till == 0) {
printf("invalid, skipping.\n");
continue;
}
uint32_t expiration_time;
err = rnp_key_get_expiration(sk, &expiration_time);
if (err) {
printf("rnp_key_get_expiration: %x\n", err);
} else {
printf("expires %"PRIu32" seconds after key's creation time.\n",
expiration_time);
}
}
çµæïŒ
#1 (doesn't expire) valid till 1714111110 seconds after epoch; expires 0 seconds after key's creation time.
#2 (expires) valid till 1714111110 seconds after epoch; expires 94670781 seconds after key's creation time.
#3 (expired) valid till 1619527593 seconds after epoch; expires 86400 seconds after key's creation time.
#4 (invalid sig) valid till 0 seconds after epoch; invalid, skipping.
#5 (no sig) valid till 0 seconds after epoch; invalid, skipping.
ä»ãç§ãã¡ã¯ç§ãã¡ãæãçµæãåŸãŸããïŒæåã®3ã€ã®ãµãããŒã®æ£ããæå¹æéã衚瀺ããæåŸã®2ã€ã®ãµãããŒãç¡å¹ã§ããããšã瀺ããŸãã
ãããã詳ããèŠãŠã¿ãŸããã
rnp_key_valid_till
ããŸããOpenPGPã§ã¯ãããŒã®æå¹æéã¯ãããŒãäœæããããšãããã®ç¬Šå·ãªã32ãããã€ã³ãã³ããšããŠãããã笊å·ãªã32ããã圢åŒã§æ ŒçŽãããŸãããããã£ãŠã颿°ã¯ããåºãåã䜿çšããããå°ãªããšãã³ãŒãã®ãªãŒããŒãããŒããã§ãã¯ããå¿ èŠããããŸãã ïŒç§ã¯ãã®åé¡ã å ±åããŸãããããã§ã«ä¿®æ£ãããŠããŸããïŒ
ãããããã®ããæ±ãç¡èŠããŠããæ©èœã¯ãŸã å¥åŠã§ãã OpenPGPã§ã¯ãããŒã¯æ°æéæå¹ã§ããå¯èœæ§ããããŸããããŒã®æå¹æéã7æ1æ¥ã§ããŠãŒã¶ãŒã7æ10æ¥ããã®ã¿æŽæ°ãããšããŸãã 7æ1æ¥ãã7æ10æ¥ãŸã§ã®æéäžãããŒã¯ç¡å¹ã§ããããã®éã«çæããã眲åãç¡å¹ãšèŠãªãå¿ èŠããããŸããã§ã¯ãèæ ®ããã颿°ã¯ãã®ãããªããŒã«å¯ŸããŠäœãè¿ãå¿ èŠããããŸããïŒããã«éèŠãªããšã«ããã®ãããªAPIã®ãŠãŒã¶ãŒã¯çµæãã©ã®ããã«è§£éããå¿ èŠããããŸããïŒãã®ãããªAPIã䜿çšããããšã¯ãŸã£ããé©åã§ããïŒ ïŒ ã¯ããç§ã¯å°ããŸãããïŒ
ã»ã³ã€ã¢ã§ã¯ãç§ãã¡ã¯åå¯Ÿã®æ¹åã«é²ã¿ãŸãããããŒãæå¹ã§ãããšããæ å ±ãè¿ã代ããã«ãç¶æ³ãå転ãããŸãã APIãŠãŒã¶ãŒã¯æ¬¡ã®ããã«å°ããå¯èœæ§ããããŸãã ãã®ããŒã¯æå»tã§æå¹ã§ãããç§ãã¡ã®çµéšã§ã¯ãããã¯ç§ãã¡ãç¥ã£ãŠãããã¹ãŠã®å Žåã«å®éã«å¿ èŠãšããããã¹ãŠã§ãã
RNPAPIã§ãã®ç¹å®ã®åé¡ãå ·äœçã«åãäžããŠãããšã¯æããªãã§ãã ãããããã¯ç§ãæè¿èããŠãã å䜵çã§ãã Thunderbirdçšã®ä»£æ¿OpenPGPããã¯ãšã³ããäœæããããã«RNPAPIãåå®è£ ãããšã ãå€ãã®åæ§ã®åé¡ã«çŽé¢ã ãŸããã
çµè«
RNPéçºè ãç¯ããééãã¯çè§£ã§ããèšãèš³ã«ãªããŸãã OpenPGPã¯ãä»ã®å€ãã®ãããã³ã«ãšåæ§ã«è€éã§ãããã ãããã¡ã€ã«æå·åããŒã«ã ãã§ãªããæè»æ§ãšä¿¡é Œæ§ã®é«ãPKIãç¶æããããšããã°ãå€§å¹ ã«ç°¡çŽ åã§ã ãŸãã
ãã ããRNPAPIã¯å±éºã§ãã Thunderbird㯠ãã»ãã¥ãªãã£ãéèŠãªç¶æ³ã§äœ¿çšãããŸãã 2017幎ã®ã€ã³ã¿ãã¥ãŒã§ã çµç¹ç¯çœªãšè æç ç©¶ã»ã³ã¿ãŒïŒOCCRPïŒã®Michal'Rysiek 'Wozniakã¯ã誰ãã®åœã屿©ã«çããŠããããšãæããã«ããŸããã
ç§ã¯æ¬åœã«åŒ·ããæã ã¯GnuPGã®ã«ãã¹ãŠã®ãã®æéãå©çšããŠããªãã£ãå Žåãåœç€Ÿã®æ å ±æäŸè ãšãžã£ãŒããªã¹ãã®å€ããå±éºã«ãããããããããŒã®åŸãã§ããããšä¿¡ããŠãã...
ã€ã³ã¿ãã¥ãŒ ãš ããã«ãRysiekããŠã©ãºãã¢ãã¯æ±è·ãçµç¹ã®ç ç©¶ã»ã³ã¿ãŒããç¯çœª
ããã¯Thunderbirdã«ã©ã®ããã«åœ±é¿ããŸããïŒ 3ã€ã®éžæè¢ããããŸãããŸããThunderbirdã¯Enigmailã«æ»ãå¯èœæ§ããããŸãã EnigmailãThunderbird78ã«ç§»æ€ããã®ã¯é£ãããšæããããããŸããããå€ãã®Thunderbirdéçºè ãããããã¯ãªããã§æè¡çã«å®çŸå¯èœã§ãããšèããŠããŸããããããThunderbirdãEnigmailããé¢ããããšãéžãã çç±ã®1ã€ã¯ãEnigmailéçºè ããŠãŒã¶ãŒãGnuPGãæ£ããã€ã³ã¹ããŒã«ããŠæ§æããã®ãæ¯æŽããããã«èšå€§ãªæéãè²»ãããªããã°ãªããªãã£ãããšã§ãããããã£ãŠããã®ãã¹ã¯çæ³çã§ã¯ãããŸããã
次ã«ãThunderbirdã¯å¥ã®OpenPGPå®è£ ã«åãæ¿ããããšãã§ããŸããæè¿ã¯ãããããããŸãã ããéžæããŸããå人çã«ã¯ããµã³ããŒããŒãã¯ã»ã³ã€ã¢ã«åãæ¿ããã¹ãã ã£ããšæããŸãããã¡ãããç§ã¯ã»ã³ã€ã¢ã®éçºè ãªã®ã§ãåèŠããããŸããããããããã¯ãéã®åé¡ã§ã¯ãããŸãããè³éã¯ç§ã«æ¯æããŸããèªç±åžå Žã§ã¯ãããããä»ã®åå ¥ã®2åã®éé¡ãæäŸãããŸããç§ã¯ãŠãŒã¶ãŒã®ä¿è·ã«åãçµãã§ããŸãããã ããSequoia APIãšå®è£ ã®å©ç¹ã¯å¥ãšããŠããã®å ŽåãThunderbirdããã1ã€ã®ç¹ã§åã¡ãŸããã€ãŸãããã®å®è£ ã¯ãã§ã«æ©èœããŠããŸããæ°é±éåãThunderbirdã®ä»£æ¿OpenPGPããã¯ãšã³ãã§ããOctopusããªãªãŒã¹ããŸãã ã RNPãšæ©èœçã«åçã§ããã ãã§ãªããgpgãšã®çµ±åãªã©ã以åã¯æ¬ èœããŠããå€ãã®æ©èœããããããã€ãã®ã»ãã¥ãªãã£ããŒã«ã«ããããé©çšããããã€ãã®éæ©èœèŠä»¶ãæºãããŸããã
第äžã«ãThunderbirdã¯OpenPGPã®äœ¿çšãå®å šã«åæ¢ã§ããå¯èœæ§ããããŸãããã®æ±ºå®ã¯ç§ã«ã¯åããŸãããããããThunderbirdã®æãè匱ãªãŠãŒã¶ãŒã®ã»ãã¥ãªãã£ã«ã€ããŠäœåºŠãæžå¿µããŠãããOpenPGPãµããŒãããŸã£ããæäŸããªãæ¹ãçŸç¶ãããå®å šã§ãããšèããŠããŸãã
MacleodVPSã¯APIéçºã«çæ³çã§ãã
äžèšã®ãªã³ã¯ã䜿çšãããããããŒãã¯ãªãã¯ããŠç»é²ãããšãä»»æã®æ§æã®ãµãŒããŒãã¬ã³ã¿ã«ããæåã®æã10ïŒ å²åŒã«ãªããŸãã