CryptoProã䜿çšãã
ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã§ã®ãã®ãããªã¬ãã«ã®ä¿è·ãšæ©èœã®å®è£ ã¯ãååãšããŠãããŒãžã¬ã€ã¢ãŠãããµãŒããŒãžã®ãªã¯ãšã¹ãã®éä¿¡ã»ã©ç°¡åã§ã¯ãªãããšãããã«èšããããšæããŸãã æå·åãšTLSãä»ããå®å šãªæ¥ç¶ã§äœæ¥ããããšããªãå Žåã¯ç¹ã«ããããã®å Žåãèªãã§åŠã¶å¿ èŠããããŸãã
CryptoProã¯ãã¢ãã€ã«éçºè ã«ãã®ãããªè€éãªæ©èœãã¢ããªã±ãŒã·ã§ã³ã«ç¡æã§å°å ¥ããããã®åŒ·åãªããŒã«ãæäŸããŸãããè»èã«ãããšããããŸãã æ®å¿µãªãããé·ãéäŒç€Ÿã¯ååšããŠããã䟿å©ã§ç解ããããææžã¯äœæãããŠããŸããã ãããšã¯å¥ã«ãã¢ãã€ã«éçºè ã«ãšã£ãŠã¯ååãšããŠããã§ã¯ãããŸããã
é ããæ©ãããéçºã¯ãã©ãŒã©ã ã«ããªããå°ããããªãã¯çããèŠã€ããããã«ãããã·ã£ãã«ã§æãå¿ èŠããããŸãã æ倧ã®é£ç¹ã¯ãäœãã©ã®ããã«è¡ããã«é¢ããæ å ±ãäžè¶³ããŠããããšã§ããããã¯ããã®èšäºã§ä¿®æ£ããããšãããã®ã§ãã 圹ç«ã€å¯èœæ§ã®ãããªãœãŒã¹ãžã®ãã¹ãŠã®ãªã³ã¯ã¯ãèšäºã®æåŸã«æ®ãããŸãã
ãŸããC ++ã§äœæ¥ããã¡ã¢ãªã®å²ãåœãŠãšã¯ãªãŒãã³ã°ãèªåã§è¡ãå¿ èŠããããŸãã
ãã®èšäºã¯CryptoPro CSP 4.0ã®çŸåšã®ããŒãžã§ã³ã§æžãããŠãããããä»åŸéçºè åãã«ä»¥äžã§èª¬æããããã±ãŒãžã¯ç°ãªãå¯èœæ§ããããŸãã
CryptoProãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã«ã€ã³ããŒããã
ã¢ããªã±ãŒã·ã§ã³ã§CryptoProã䜿çšããããã®æåã®ã¹ãããã¯ãäŒç€Ÿã®Webãµã€ãããããŠã³ããŒããããã¬ãŒã ã¯ãŒã¯ãå®è£ ããããšã§ãã ãã¬ãŒã ã¯ãŒã¯èªäœã«å ããŠãiOSããã±ãŒãžã«ã¯3ã€ã®äŸãå«ãŸããŠããŸã-é»å眲åïŒEDSïŒã®äœæãsslãã³ãã«ã®äœæãããã³WebããŒãžã§EDSãäœæããã³æ€èšŒããæ©èœãåãããã©ãŠã¶ãŒãäœæã§ããäŸã§ãã 詳现ãªèª¬æã¯ãReadmeãã¡ã€ã«ã®äŸã«å«ãŸããŠããŸãã ãããã«åºã¥ããŠãã¢ã¯ã·ã§ã³ã®ã¢ã«ãŽãªãºã ãç解ããã®ãç°¡åã§ãã MacOSããã±ãŒãžã¯éåžžã«åœ¹ç«ã¡ãŸãã詳现ãªã³ã¡ã³ãä»ãã®å€ãã®æçšãªäŸãå«ãŸããŠããŸãã ã€ã³ã¹ããŒã«åŸããã¹ãŠã®äŸã¯ãã£ã¹ã¯ã®opt / cprocsp / src / doxygen / CSPã»ã¯ã·ã§ã³ã«é 眮ãããŸãã
ãã¬ãŒã ã¯ãŒã¯èªäœãã€ã³ããŒãããæé ã¯ãReadMeãã¡ã€ã«ã®CPROCSP.frameworkã«ãããŸãããã€ã³ãããšã«åæããŸãã
1.ã³ã³ãœãŒã«ã«ã¢ã¯ã»ã¹ããŠãããŠã³ããŒããããã¬ãŒã ã¯ãŒã¯ãžã®ãã¹ãç»é²ãã次ã«èª¬æããããã«ãŠãŒãã£ãªãã£ãå®è¡ããå¿ èŠããããŸãã
cd /Users/agima//ios-uni/CPROCSP.framework/ ./ SetApplicationLicense 40400-W0037-EKVQK-9YDNG-D3F67 license.enc
ïŒæå®ãããããŒããã¡ã€ã«ã«æ·»ä»ããããšãlicense.encã©ã€ã»ã³ã¹ãã¡ã€ã«ãåããã£ã¬ã¯ããªã«äœæãããŸãïŒã
2.ãã¬ãŒã ã¯ãŒã¯ãã€ã³ããŒãããåã«ãCPROCSP.frameworkãã¡ã€ã«ããããžã§ã¯ããã©ã«ããŒã«ç§»åããããšããå§ãããŸãã ãã®ããã誀ã£ãŠãã¬ãŒã ã¯ãŒã¯ãå¥ã®ãã©ã«ããŒã«è»¢éããããšãã身ãå®ãããšãã§ããŸãããã®ãããXcodeãžã®ãã¹ããé£ã¶ãããšã«ãªããŸãã
ã€ã³ããŒãããã«ã¯ïŒXcodeãéããå·ŠåŽã®ãµã€ãããŒã§ãããžã§ã¯ããéžæããã¿ãŒã²ãããªã¹ãã§ã¢ã»ã³ããªã¿ãŒã²ãããéžæããŸã
次ã«ã[ãã«ããã§ãŒãº]ã¿ãã§ã[ãã€ããªãšã©ã€ãã©ãªããªã³ã¯]ãéžæãã[+]ãã¯ãªãã¯ããŠãã[ãã®ä»ã®è¿œå ]ãã¯ãªãã¯ããŠããã¬ãŒã ã¯ãŒã¯ãžã®ãã¹ãæåã§æå®ããŸãã ãããèŠã€ããŠã[éã]ãéžæããŸãã ãã¬ãŒã ã¯ãŒã¯ã¯ã€ã³ããŒããããŸãããããŸã 䜿çšã§ããŸããã
3.ãããžã§ã¯ãã«Resourcesãã©ã«ããŒãäœæããCPROCSP.frameworkãã¡ã€ã«ãéããResourcesãã©ã«ããŒã«ç§»åããŠãããŒã«ã©ã€ãºïŒru.lrojãšen.lprojïŒãé€ããã¹ãŠã®ãã¡ã€ã«ãšãã©ã«ããŒãã次ã®èšå®ã§äœæãããã©ã«ããŒã«ãã©ãã°ããŸãã
4.æåã®æ®µèœã§äœæããã©ã€ã»ã³ã¹ãã¡ã€ã«ããäžèšã®ã¹ã¯ãªãŒã³ã·ã§ããã®èšå®ãšåããã©ã«ããŒã«ãã©ãã°ã¢ã³ãããããããŸãã
5.次ã«ãæ®ãã®ããŒã«ã©ã€ãºãã©ã«ããŒãã¢ããªã±ãŒã·ã§ã³ãªãœãŒã¹ã«ã転éããŸãããèšå®ã¯ç°ãªããŸãã
ãã¹ãŠãæ£ããè¡ããããšããã©ã«ããŒã¯æ¬¡ã®ããã«ãªããŸãã
6.次ã®é ç®ã¯ããšãã¥ã¬ãŒã¿ã§ãããã°ããããã®ãããžã§ã¯ãã®èšå®ã§ãã ãããè¡ãããªãå Žåãã¢ããªã±ãŒã·ã§ã³ã¯ããã€ã¹äžã§ã®ã¿èµ·åã§ããŸãã ãããžã§ã¯ãã®[ãã«ãèšå®]ã¿ãã®[æå¹ãªã¢ãŒããã¯ãã£]ãã£ãŒã«ãã«ã¯ãarmv7ã®ã¿ãæ®ãããŠããŸãã 64ãããã¢ãŒããã¯ãã£ã®ãµããŒãã¯æ¢ã«é²è¡äžã§ãããçŸåšã¯32ãããã䜿çšããŠããŸãã ãŸããã¢ãŒããã¯ãã£ã§æé©åïŒarmv7ïŒãäœæããŸãã 以äžãååŸããå¿ èŠããããŸãã
ããã§æ·»ä»ã®æé ã¯å®äºããŸãããã¢ããªã±ãŒã·ã§ã³ãèµ·åããããšã¯ã§ããŸãããã³ã³ãã€ã«ãããšã次ã®ãããªãã®ã衚瀺ãããŸãã
éçºè ãããã€ãã®ãã€ã³ããè¿œå ããªãã£ãçç±ã¯äžæã§ãããæ£ãããªã³ã¯ãäœæããã«ã¯ãããã«ã©ã€ãã©ãªãšãããžãã¯ãã©ã°ããè¿œå ããå¿ èŠããããŸãã ãã詳现ã«ã
ãã©ã°ã©ã2ã§èª¬æããã¹ããŒã ãšåæ§ã«ãCPROCSP.frameworkãã¡ã€ã«ãååŸãããã®äžã®ãªãŒããŒãã©ã«ããŒã«ç§»åããŠãããã«åã£ãœãlibrdrpcsc_empty.oã©ã€ãã©ãªãã€ã³ããŒãããŸãã Xcodeã«åã蟌ãŸããã©ã€ãã©ãªãã次ã®ã©ã€ãã©ãªãè¿œå ããŸãããã®ãããåããŠã£ã³ããŠã§ãæ€çŽ¢ã§libzãšå ¥åããŸã
[è¿œå ]ãã¿ã³ã§è¿œå ããŸãã
ãã ããããã§ãååã§ã¯ãããŸããããã1ã€ãšã©ãŒãæ®ããŸãã
ããã解決ããã«ã¯ããããžã§ã¯ãå ã®ã©ããã«ãã©ã°ãé 眮ããŸãã
extern bool USE_CACHE_DIR; bool USE_CACHE_DIR = false;
ãã®åŸãåé¡ã¯è§£æ±ºãããã¢ããªã±ãŒã·ã§ã³ã¯æ£åžžã«ãã«ããããŸãã ãã®ãã©ã°ã¯ãããŒãšãšãã«ãã©ã«ããä¿åããå Žæã瀺ããŸãã falseã®å ŽåïŒäœ¿çšããããã«ãçç±ã¯åŸã§é瀺ãããŸãïŒããã©ã«ããŒã䜿çšãããŸã
/private/var/root/Documents/cprocsp/keys
trueã®å Žåããããã¯éããå Žæã«ä¿åãããŸãã
/private/var/root/Library/Caches/cprocsp/keys/
ããã§ãã¬ãŒã ã¯ãŒã¯ã®ã€ã³ããŒããå®äºãããšãã¥ã¬ãŒã¿ãŒã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ã§ããŸãã
CryptoProãæäœããããã®ç§å¯éµã³ã³ãããŒ
å·çæç¹ã§ã¯ããCryptoPro CSP 4.0ãã¯å ¬ééµãšç§å¯éµã®äž¡æ¹ãå«ã* .pfx蚌ææžã®äœ¿çšããµããŒãããŠããŸããã CryptoProã䜿çšããŠã®ã¿ååŸã§ãã* .000ã³ã³ãããŒã䜿çšããå¿ èŠããããŸãã ãããã®åœ¢åŒã¯ã©ãã«ãèšè¿°ãããŠããããååãšããŠãããŒã¡ãã£ã¢ãããŒã¯ã³ïŒãã©ãã·ã¥ãã©ã€ãããããããŒãã£ã¹ã¯ïŒã«æžã蟌ãŸããŸãã Explorerã§ã¯ããããã¯header.keyãmasks.keyãname.keyããã³primary.keyãã¡ã€ã«ã«åå²ããã1ã€ã®ããŒãå«ããã©ã«ããŒã®ããã«èŠããŸãã
å瀟ã«ã¯ãã¹ãèªèšŒã»ã³ã¿ãŒ ïŒCAïŒããããããã§ããŒãçæããŠCA蚌ææžãååŸã§ããŸãã ããã§ã蚌ææžèŠæ±ç»é²ããŒãžãæ£ããåäœãããã«ã¯ãInternet ExplorerïŒãŸãã¯ãã¹ãCAã«ããŠã³ããŒãã§ãããã©ã°ã€ã³ãã€ã³ã¹ããŒã«ãããŠããä»ã®ãã©ãŠã¶ãŒïŒã䜿çšããå¿ èŠããããCSPã¯ã³ã³ãã¥ãŒã¿ãŒã«ã€ã³ã¹ããŒã«ããå¿ èŠããããŸããå¿ èŠãªããã·ã¥ã¢ã«ãŽãªãºã ã¯å©çšã§ããŸããGOST R 34.10-2012ã
ã¢ããªã±ãŒã·ã§ã³ãžã®ç§å¯éµã³ã³ããã®ã€ã³ã¹ããŒã«
CryptoProã®åŸæ¥å¡èªèº«ãæžããŠããããã«ãããã€ã¹ã«ã³ã³ãããã€ã³ã¹ããŒã«ããããã®3ã€ã®ãªãã·ã§ã³ããããŸãã
â¢iTunesãã¡ã€ã«å ±æçµç±ã
â¢iExplorerãªã©ãiOSã§ãã¡ã€ã«ãèšé²ããããã®å¥ã®ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŸãã
â¢ç¬èªã®ããŒãšã¯ã¹ããŒããblobïŒPRIVATEKEYBLOBïŒã«èšè¿°ããã¢ããªã±ãŒã·ã§ã³ã³ãŒãã«ã€ã³ããŒãããŸãã ãã®ãããªã¡ãœããã®äŸã¯ãEncryptKey / DecryptKeyãšåŒã°ããåè¿°ã®MacOSããã±ãŒãžã«ãããŸãã
æåã®ãªãã·ã§ã³ã䜿çšããŸãã-æãéããæãæºè¶³ã§ãã顧客ã®èŠä»¶ãšããŠã ãã®å®è£ ã®ããã«ãã€ã³ããŒãäžã«USE_CACHE_DIR = falseãã©ã°ãéžæãããŸããã iTunesãã¡ã€ã«å ±æã䜿çšãããªãå ŽåããŸãã¯ããŒã䜿çšããŠãã©ã«ããŒãèŠãæ©èœããŠãŒã¶ãŒããé衚瀺ã«ããå Žåã¯ããã©ã°ãtrueã«èšå®ããŠé衚瀺ã«ããããšããå§ãããŸãã
ãã¬ãŒã ã¯ãŒã¯ãã€ã³ã¹ããŒã«ãããæåã®èµ·ååŸãã¢ããªã±ãŒã·ã§ã³ã®Documentsãã©ã«ããŒã«cprocspãã©ã«ããŒãäœæãããŸãã
ãã®ãã©ã«ããŒå ã«ã¯ããã¹ãŠã®ããŒã³ã³ãããŒãæ ŒçŽãããŸãã ã€ã³ã¹ããŒã«ããã蚌ææžãšã³ã³ããã¯ä¿åãããããã€ã¹ã®ããŒã¹ãã¬ãŒãžã§ã¯ãªãã¢ããªã±ãŒã·ã§ã³ã«é¢é£ãããããåé€åŸã¯ããããåã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
ããã«ã2ã€ã®æ¹æ³ããããŸãããã¹ãŠã®æ©èœãèªåã§èšè¿°ããããæ¢è£œã®ã³ã³ãããŒã©ãŒã䜿çšããããã»ãšãã©ã®åé¡ã解決ããã®ã«ååãªã®ã§ãããã«ã€ããŠèª¬æããŸãã
ãã¬ãŒã ã¯ãŒã¯ã«ã¯ãPaneViewController.hãšããããããŒãã¡ã€ã«ãå«ãŸããŠããŸãã èšèšã®å³å¯ãã«æ©ãŸãããŠããªãå Žåã¯ãææ¡ãããxibãã¡ã€ã«ïŒCPROCSP.framework / Resourcesã«ãããŸãïŒãã€ã³ããŒããããããã䜿çšããŠæå·ããã«ãåæåã§ããŸããããšãã°ã次ã®ããã«ãªããŸãã
<code>#import âCPROCSP/PaneViewControler.hâ ⊠PaneViewController *CPROPane; if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) CPROPane = [[PaneViewController alloc] initWithNibName:@"PaneViewController" bundle:nil]; else CPROPane = [[PaneViewController alloc] initWithNibName:@"PaneViewControllerIPhone" bundle: nil]; UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:CPROPane]; [navController setModalPresentationStyle:UIModalPresentationFullScreen]; [self presentViewController:navController animated:true completion:nil];</code>
ãã ãããã¹ãŠã®xibãã¡ã€ã«ã¯ããŒãã«ãæã€éåžžã®UIViewã§ããããããã¶ã€ã³ã«åãããŠç°¡åã«ã«ã¹ã¿ãã€ãºã§ããŸãã
ããã«ãéããåŸãæåã«è¡ãããšã¯ãCAãšã®çžäºäœçšãã¿ãã«ç§»åããCA蚌ææžïŒèšŒææ©é¢ã®ã«ãŒã蚌ææžïŒãã€ã³ã¹ããŒã«ããç»é²æé ãå®è¡ãã蚌ææžèŠæ±ãéä¿¡ããŠåä¿¡ïŒã€ã³ã¹ããŒã«ïŒããããšã§ãã
CAã«ãŒã蚌ææžãã€ã³ã¹ããŒã«ãããšãã¢ãã€ã«ãã©ã«ããŒãcprocsp / keysãã©ã«ããŒã«è¡šç€ºãããŸãã ã³ã³ãã* .000ãããã«é 眮ãããŸãã ããããã€ã³ã¹ããŒã«ããã«ã¯ããCryptoProãããã«ã«æ»ããã¡ã€ã³ç»é¢ã§ãInstall Certificates and ContainersããéžæããŸãã cprocsp / keys / mobileãã©ã«ããŒã«å«ãŸããã³ã³ãããŒã¯CryptoProæå·ãããã€ããŒããã®ãã®ã§ããå¿ èŠããããŸãïŒå°ãªããšã1ã€ãç ŽæãŸãã¯ç ŽæããŠããªãå Žåãé¢æ°ã¯ããããã€ã³ã¹ããŒã«ããã«ãšã©ãŒãè¿ããŸãïŒã
ããã§ã€ã³ã¹ããŒã«ã¯å®äºã§ãã
ç§å¯éµã®çœ²åãšæ€èšŒ
CAã«ãŒã蚌ææžãšã³ã³ãããã€ã³ã¹ããŒã«ããããããã¥ã¡ã³ããžã®çœ²åãéå§ã§ããŸãã 眲åã®äœæããã³æ€èšŒæ©èœã¯ãåè¿°ã®CryptMsgSignãšåŒã°ããMacOSããã±ãŒãžã«ãããŸãã 䜿çšãããåé¢æ°ã«é¢ããã³ã¡ã³ããå«ãŸããŠããŸãã åæ§ã®äŸã¯ãiOSã®ããã±ãŒãžã®CreateFile / Classes / SignFie.cppã«ãããŸãã ããã§ã¯ã以åã®çœ²åã®å®è£ ãšã¯ç°ãªãã眲åããããã¡ã€ã«ãžã®ãã¹ãæäŸãããŸãã å€æ°ã®æ©èœãããããããããããåå¥ã«åæããŸããã ããã»ã©æçœã§ã¯ãªãããã€ãã®ç¹ãèæ ®ããŠãã ããã
眲åæ©èœã¯ã次ã䜿çšããŠèšŒææžã¹ãã¢ãéãããšããå§ãŸããŸã
CertOpenSystemStoreïŒ
<code>hCertStore = CertOpenSystemStore(0, "My"); if(!hCertStore) { ret = CSP_GetLastError(); fprintf (stderr, "CertOpenSystemStore failed."); }</code>
ããã¯ãããã€ã¹ã®ããŒã¹ãã¬ãŒãžã§ã¯ãªããcprocsp / users / mobile / storesãã©ã«ãå ã®ã¢ããªã±ãŒã·ã§ã³ã«å«ãŸããã¹ãã¬ãŒãžãæå³ããŸãã ãã®æ©èœã¯ããã®ãããªã¹ãã¬ãŒãžãèŠã€ãããªãå Žåã«äœæãããããã«æ©èœãããããå¿é ããå¿ èŠã¯ãããŸããã PaneViewControllerããã«ã䜿çšããŠãMY.stoãªããžããªãäœæããã³äœ¿çšãããŸãã
蚌ææžãžã®ãã€ã³ã¿ãåãåããç§å¯éµãæœåºãããã®ä»ã®åæåãè¡ã£ãåŸã眲åæé ã¯CryptMsgOpenToEncodeé¢æ°ã§å§ãŸããŸãããã®é¢æ°ã¯ããšã³ã³ãŒãã®ããã«ã¡ãã»ãŒãžãéããéããŠããã¡ãã»ãŒãžãžã®ãã³ãã«ãè¿ããŸãã
if(hMsg = CryptMsgOpenToEncode(TYPE_DER, // Encoding type 0, // Flags CMSG_SIGNED, // Message type &SignedMsgEncodeInfo, // Pointer to structure NULL, // Inner content object ID NULL)) // Stream information (not used) { printf("The message to be encoded has been opened. \n"); } else { ret = CSP_GetLastError(); fprintf (stderr, "OpenToEncode failed"); } ⊠if(hMsg) CryptMsgClose(hMsg);</code>
ã¡ãã»ãŒãžã¯ãCryptMsgCloseãåŒã³åºããããŸã§éãããŸãŸã§ãã ããã§ã¯ã䜿çšãããã©ã°ïŒ2çªç®ã®ãã©ã¡ãŒã¿ãŒïŒã«æ³šæãã䟡å€ããããŸããäŸã®ããã«0ãèšå®ãããšã眲åãä»å ãããŸãã ãã¿ããããã眲åãååŸããã«ã¯ãCMSG_DETACHED_FLAGãã©ã°ãèšå®ããå¿ èŠããããŸãã ãã®åŸã眲åãããããŒã¿ãã¡ãã»ãŒãžã«é 眮ãããçµæã®BLOBãå¥ã®ãã¡ã€ã«ã«è¡šç€ºã§ããŸãã
眲åã®æ€èšŒã¯ãããã€ãã®äŸå€ãé€ããŠäœæãšäŒŒãŠããŸãã æåã«ããã³ãŒãçšã®ã¡ãã»ãŒãžãéããã次ã«çœ²åã«æ·»ä»ããã蚌ææžãåãåºãããŸãã ã¹ãã¢ãéããæ·»ä»ããã蚌ææžãæ€çŽ¢ããŸãã 蚌ææžãèŠã€ãã£ãåŸã眲åã¯CryptMsgControlé¢æ°ã«ãã£ãŠæ€èšŒãããæ€èšŒãæåããå Žåã¯trueãè¿ãããšã©ãŒãçºçããå Žåã¯falseãè¿ããŸãã
if(CryptMsgControl(hMsg, // Handle to the message 0, // Flags CMSG_CTRL_VERIFY_SIGNATURE, // Control type pSignerCertificateInfo)) // Pointer to the CERT_INFO { printf("\nSignature was VERIFIED.\n"); } else { printf("\nThe signature was NOT VERIFIED.\n"); ret = CSP_GetLastError(); }</code>
CSP_GetLastErrorïŒïŒé¢æ°ã¯ããšã©ãŒã³ãŒããšç°¡åãªèª¬æãè¿ããŸãã
ç§å¯éµèªèšŒ
ç§å¯ããŒã䜿çšããèªèšŒã«ã¯ãäžèšã®æ¹æ³ã§ã€ã³ã¹ããŒã«ãããããŒèªäœãã€ã³ã¹ããŒã«ãããCAã«ãŒã蚌ææžããCryptoProãã§æ§æããããµãŒããŒãããã³ä¿¡é Œã§ããããŒã«è¿œå ãããããŒãå¿ èŠã§ãã ãµãŒããŒã¯ãiOS 9以éãæèŒãããã¹ãŠã®ããã€ã¹ã§TLSããŒãžã§ã³1.2ããµããŒãããå¿ èŠããããCryptoProã®GOSTæå·ã¹ã€ãŒããå¿ èŠã§ãã
ãµãŒããŒã«æ¥ç¶ããããã«ãå¥ã®ãããŒãžã£ãŒãäœæããNSURLSessionDataTaskã®åéæ©èœãæžãçŽããŸããã ã¢ããªã±ãŒã·ã§ã³ã«ã¯httpãšhttpsã®äž¡æ¹ã䜿çšããŠãã°ã€ã³ããæ©èœããããããç°ãªãæ¥ç¶ãæ åœãã2ã€ã®ãããŒãžã£ãŒãåãæ¿ããŸããã CryptoProã®æå·ã¹ã€ãŒãã䜿çšããã«ã¯ãå¥ã®ãããŒãžã£ãŒãäœæããå¿ èŠããããŸãã Client Helloã§ãã³ãã·ã§ã€ã¯äžã«ããããé 眮ããªãå ŽåããµãŒããŒããããã«ã¡ã¯ããšèšã£ããšãã«ãééã£ãæå·ã¹ã€ãŒããéžæããããããTLSæ¥ç¶ã¯å€±æããŸãã
WireSharkãªã©ã®ããã°ã©ã ã¯ããšã©ãŒã®åå ãç¹å®ãã詳现ãªæ¥ç¶æ å ±ãååŸããã®ã«åœ¹ç«ã¡ãŸãã TLSæ¥ç¶ã®ãã¹ãŠã®æ®µéãšåæã«ååãªæ å ±ãèŠãæ©äŒããããŸãã ãŸããéä¿¡ããæå·ã¹ã€ãŒããšãµãŒããŒããµããŒãããŠããæå·ã¹ã€ãŒãã確èªã§ããŸãã
å¿ èŠãªæå·ã¹ã€ãŒããéä¿¡ãããããŒãžã£ãŒãšããŠããã¬ãŒã ã¯ãŒã¯ã®äžéšã§ããUrlRetrieverã䜿çšãããŸãã ããããŒãéããšããªã¯ãšã¹ããéä¿¡ããããã®å€ãã®ç解ã§ããæ©èœã衚瀺ãããŸãããç¹ã«ãµã€ããŸãã¯ãã©ãŒã©ã ã§ããã¥ã¡ã³ããèŠã€ãããªãããã䜿çšæ¹æ³ãšäœ¿çšæ¹æ³ã¯ããã«ã¯ããããŸããã ãããŠãéçºè ãæ®ãã1ã€ã®TODOãé€ããŠããã¡ã€ã«èªäœã«ã³ã¡ã³ãã¯ãããŸãã:)
ã¯ã©ã¹å ã調ã¹ãããšã¯ã§ããªãããããã¹ãŠãæåã§ãã¹ãããã©ã®ããã«æ©èœãããã確èªããå¿ èŠããããŸããã
æåã«ãã¬ããªãŒããŒèªäœãäœæããŸãããªã¯ãšã¹ãããšã«ãã®æ å ±ãã¯ãªã¢ããå¿ èŠãããããã§ãã æåã«ãåéæ©èœã¯ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã
#import <CPROCSP/CPROCSP.h> #import <CPROCSP/UrlRetriever.h> UrlRetriever *retriever = new UrlRetriever(); : retriever->set_verify_host(true); retriever->set_verify_server(true);</code>
ãã®åŸãããããŒãæžã蟌ã¿ãŸãã ãããã¯ãã§ã«NSUrlRequestã«å«ãŸããŠãããããããããååŸããŠãã¬ããªãŒããŒã«å¿ èŠãªãã©ãŒã ã«å€æããŸãã
__block UrlHeaders headers; [self.request.allHTTPHeaderFields enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSString * _Nonnull obj, BOOL * _Nonnull stop) { NSString *result = [NSString stringWithFormat:@"%@: %@", key, obj]; std::string *string = new std::string([result cStringUsingEncoding:[NSString defaultCStringEncoding]]); headers.push_back(*string); }]; retriever->set_headers(headers); : BYTE *requestBytes = (BYTE *)[self.request.HTTPBody bytes]; retriever->set_postmessage(requestBytes, self.request.HTTPBody.length);</code>
蚌ææžãªãã§ãã°ã€ã³ããå Žåã¯ããã§ã«ãªã¯ãšã¹ããéä¿¡ã§ããŸãã
retriever->retrieve_url([self.request.URL.absoluteString cStringUsingEncoding:[NSString defaultCStringEncoding]]); </code>
ãããŠãå®äºãããã¯ã«å¿çãè¿ããŸãã
NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.request.URL statusCode:retriever->get_code() HTTPVersion:@"HTTP/1.1" headerFields:self.request.allHTTPHeaderFields]; self.requestCompletion(response, [NSData dataWithBytes:retriever->get_data() length:retriever->get_data_len()], nil); </code>
ãããŠããšã©ãŒã®å Žåããšã©ãŒãè¿ããŸãïŒ
self.requestCompletion(response, [[NSData alloc] init], [[NSError alloc] initWithDomain:NSURLErrorDomain code:retriever->get_error() userInfo:nil]);</code>
ãã®ã·ããªãªã¯ã蚌ææžã®æ¿èªã«ã€ããŠãåæ§ã§ãããªããªãŒããŒã«èŠæ±ãéä¿¡ããåã«ã®ã¿ã蚌ææžã®printå°ãäœæããå¿ èŠããããŸãã æçŽãååŸããããã®å€ãã®ãªãã·ã§ã³ããããŸã-æãæ£ãããã®ã衚瀺ããŸãïŒç§ãã¡ã®æèŠã§ã¯ïŒã
眲åã®äŸããããªããžããªãéãããã®CertOpenStoreã蚌ææžèšè¿°åPCCERT_CONTEXTãåä¿¡ããããã®CertEnumCertificatesInStoreãªã©ã®ããã€ãã®é¢æ°ã®å®è£ ãåãäžããŸãããã ãã®åŸãNSStingã§ãã£ã³ã¬ãŒããªã³ããååŸããé¢æ°ãäœæããŸãã
- (NSString *)getCertificateHashFromCert:(PCCERT_CONTEXT)certContext { BYTE *pvData = NULL; DWORD cbSize = 0; DWORD cbHash = 0; if(!CertGetCertificateContextProperty(certContext, CERT_SHA1_HASH_PROP_ID, NULL, &cbSize)) NSLog(@"CertGetCertificateContextProperty error %u", CSP_GetLastError()); if (pvData) { free(pvData); } pvData = malloc(cbSize); cbHash = cbSize; if(!CertGetCertificateContextProperty(certContext, CERT_SHA1_HASH_PROP_ID, pvData, &cbSize)) NSLog(@"CertGetCertificateContextProperty error %u", CSP_GetLastError()); DWORD dest; if (!CryptBinaryToString(pvData, cbHash, 0, NULL, &dest)) NSLog(@"CryptBinaryToString error: %u", CSP_GetLastError()); LPWSTR buf = malloc(dest * sizeof(TCHAR)); if (!CryptBinaryToString(pvData, cbHash, 0, buf, &dest)) NSLog(@"CryptBinaryToString error: %u", CSP_GetLastError()); return [[NSString alloc] initWithData:[NSData dataWithBytes:buf length:dest] encoding:[NSString defaultCStringEncoding]]; } </code>
1ã€ç®ã¯ãCERT_SHA1_HASH_PROP_IDãã©ã¡ãŒã¿ãŒãæã€CertGetCertificateContextPropertyé¢æ°ã§ãããã®é¢æ°ã¯ã蚌ææžããååŸããå¿ èŠããããã©ã¡ãŒã¿ãŒïŒãã®å Žåã¯SHA1ããã·ã¥ïŒãé¢æ°ã«äŒããŸãã ãã®é¢æ°ã¯2ååŒã³åºãããŸãããæåã¯ãããã¡ãŒçœ®æãªãã§ã代ããã«NULLãèšå®ãããŸãã ããã¯ãå¿ èŠãªã¡ã¢ãªãµã€ãºãååŸããããã«è¡ãããŸããå¿ èŠãªã¡ã¢ãªãµã€ãºã¯ããããã¡ã«å²ãåœãŠãå¿ èŠããããŸãã 2çªç®ã®äœ¿çšæ³ã§ã¯ãçŸåšæ¢ç¥ã®ãµã€ãºã®ãããã¡ãŒã眮ãæããããŸãã åä¿¡ããããŒã¿ããã€ãé åããæååã«å€æããããã«ãCryptBinaryToStringé¢æ°ã䜿çšãããŸã-åãçç±ã§2åã ãã®åŸããã©ãŒã ã®çŸããã³ã³ãã³ããååŸããŸãã
â----BEGIN CERTIFICATE----- â---- END CERTIFICATE-----</code>
ããããæ€çŽ¢æ©èœã«ã¯å¥ã®åœ¢åŒãå¿ èŠã§ãã CryptBinaryToStringã§å¿ èŠãªãã£ã³ã¬ãŒããªã³ããååŸããã«ã¯ãCRYPT_STRING_HEXãã©ã°ããã©ã°ã«æžã蟌ãå¿ èŠããããŸãïŒ3çªç®ã®ãã©ã¡ãŒã¿ãŒïŒã çµæã®æååã¯æçŽã«ãªãããããã¬ããªãŒããŒã«çœ®ãããŸãã
retriever->set_client_cert([thumbPrint cStringUsingEncoding:[NSString defaultCStringEncoding]]);</code>
ãã¹ãŠãæ£ããè¡ããããšãGOSTæå·åã¢ã«ãŽãªãºã ã䜿çšããŠæ¥ç¶ãæ£åžžã«ç¢ºç«ãããŸãã
䟿å©ãªãªã³ã¯
MSDN-ãã©ã¡ãŒã¿ãŒã«å«ãŸãããã¹ãŠã®é¢æ°ã®è©³çŽ°ãªèª¬æãããã³å®äŸã
ãã©ãŒã©ã -åŸæ¥å¡ãæ¯æ¥è³ªåã«çããCryptoProãã©ãŒã©ã ã 質åãžã®å€ãã®åçããã§ã«äžããããŠããã圌ãã®åŠæ¹ç®ïŒæã«ã¯çŽ6幎ïŒã«ããããããã圌ãã¯ããªããå©ããããšãã§ããŸãã
éçºè ã¬ã€ã -æå·ãããã€ããŒã«å«ãŸããæ©èœã®ãªã¹ããšãç°¡åãªèª¬æãšäŸãèšèŒããããäŒç€Ÿãäœæããã¬ã€ãã
ãšã©ãŒã®èª¬æ -C ++é¢æ°ã§çºçããå¯èœæ§ã®ãããšã©ãŒã®å€§èŠæš¡ãªãªã¹ããããã³ãã®ã³ãŒããšç°¡åãªèª¬æã ãšã©ãŒã³ãŒããååŸããã«ã¯ããã¬ãŒã ã¯ãŒã¯ã®äžéšã§ããã¢ããªã±ãŒã·ã§ã³ã³ãŒãã§CSP_GetLastErroré¢æ°ã䜿çšããŸãã æåŸã«åä¿¡ãããšã©ãŒã®ã³ãŒããä¿åããŸãã