ãPHPã®ã»ãã¥ãªãã£ããšããæ¬ïŒããŒã1ïŒ
ãPHPã®ã»ãã¥ãªãã£ããšããæ¬ïŒããŒã2ïŒ
ãPHPã®ã»ãã¥ãªãã£ããšããæ¬ïŒããŒã3ïŒ
ããã»ã¹åå è éã®ã€ã³ã¿ãŒããããä»ããéä¿¡ã«ã¯ãªã¹ã¯ã䌎ããŸãã ãªã³ã©ã€ã³ãµãŒãã¹ã䜿çšããŠæ¯æã泚æãã¹ãã¢ã«éä¿¡ããå Žåãæ»æè ããªã³ã©ã€ã³ã¢ããªã±ãŒã·ã§ã³ãžã®HTTPèŠæ±ãååãèªã¿åããå€æŽããŸãã¯åè©Šè¡ã§ããããã«ããããšã¯çµ¶å¯Ÿã«æãŸãããããŸããã æ»æè ãã»ãã·ã§ã³ã®Cookieãæ€èšããããåå人ãååãè«æ±å äœæãå€æŽããçµæãæ³åããŠãã ããã ãŸãã¯ããŠãŒã¶ãŒã®ãªã¯ãšã¹ããHTMLãŸãã¯JavaScriptãžã®å¿çãšããŠã¹ãã¢ããéä¿¡ãããããŒã¯ã¢ããã«åã蟌ã¿ãŸãã
éèŠãªå人ããŒã¿ã®ä¿è·ã¯æ·±å»ãªããžãã¹ã§ãã ãã©ãŠã¶ãšã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒã¯ãã»ãã¥ãªãã£ã«é¢ããŠéåžžã«é«ãæåŸ ãæã£ãŠããŸãã ç¹ã«éèŠãªã®ã¯ãéè¡ã«ãŒãååŒã®å®å šæ§ããã©ã€ãã·ãŒãããã³èå¥æ å ±ã§ãã ãããã®åé¡ã解決ããã«ã¯ãããã»ã¹ã®2人ã®åå è éã®ããŒã¿è»¢éãä¿è·ããããã«ãéåžžHTTPSãTLSãSSLãå«ããã©ã³ã¹ããŒãã¬ãã«ã®ã»ãã¥ãªãã£ãå¿ èŠã§ãã
ä¿è·å¯Ÿçã®äž»ãªç®çïŒ
- 転éãããããŒã¿ã®å®å šãªæå·åã
- æ å ±äº€æã®çåŽãŸãã¯äž¡åŽã®ä¿èšŒãããèå¥ã
- ããŒã¿ç Žæä¿è·ã
- ãªãã¬ã€æ»æã«å¯Ÿããä¿è·ã
æãéèŠãªãã€ã³ãïŒãã©ã³ã¹ããŒãã¬ãã«ã§ä¿è·ãæåãããã«ã¯ã4ã€ã®åé¡ãã¹ãŠã解決ããå¿ èŠããããŸãã å°ãªããšãäœããã®æ¹æ³ã§æåããªããã°ãæ·±å»ãªåé¡ãåŸ ã£ãŠããŸãã
å€ãã®äººããæå·åãéèŠãªã¿ã¹ã¯ã§ãããšèª€ã£ãŠä¿¡ããŠãããä»ã®ãã¹ãŠã¯ãªãã·ã§ã³ã§ãã ããã¯å®å šã«çå®ã§ã¯ãããŸããã éä¿¡ãããããŒã¿ãæå·åãããšããåä¿¡è ã¯ããã埩å·åã§ããå¿ èŠããããŸãã ããã¯ãã¯ã©ã€ã¢ã³ããå®å šãªæ¥ç¶ã確ç«ããããšããããŽã·ãšãŒã·ã§ã³ãã§ãŒãºäžã«ãã¯ã©ã€ã¢ã³ããšãµãŒããŒãïŒç¹ã«ïŒæå·åããŒã«åæããå Žåã«å¯èœã§ãã ãã ããæ»æè ã¯ç°¡åãªæ¹æ³ã䜿çšããŠã¯ã©ã€ã¢ã³ããšãµãŒããŒã®éã§äŸµå ¥ããããšãã§ããŸãã ã¯ã©ã€ã¢ã³ããã·ã³ã匷å¶çã«ãµãŒããŒãšèŠãªãããšãã§ããŸããããã¯ããäžéè ãæ»æïŒMitMãäžéè ïŒãšåŒã°ããŸãã ãããŠãæå·åããŒã®ããŽã·ãšãŒã·ã§ã³ã¯ãå®éã®ãµãŒããŒã§ã¯ãªããåœç©ã§è¡ãããŸãã ããã«ãããæ»æè ã¯ã¯ã©ã€ã¢ã³ãããéä¿¡ããããã¹ãŠã®ããŒã¿ã解èªã§ããŸãã æããã«ããã®ã·ããªãªããä¿è·ããã«ã¯ã2çªç®ã®èŠä»¶ãã€ãŸãã¯ã©ã€ã¢ã³ããéä¿¡ããŠãããµãŒããŒã®èå¥ãæ€èšŒããæ©èœãéµå®ããå¿ èŠããããŸãã ãã®ãã§ãã¯ãªãã§ã¯ãã¿ãŒã²ãããµãŒããŒãšããã³ããµãŒããŒãåºå¥ããŸããã
ãã®ãããå®å šãªæ¥ç¶ã®ããã«ã¯ã4ã€ã®æ¡ä»¶ãã¹ãŠãæºããå¿ èŠããããŸãã ãããããä»ã®3ã€ãçæ³çã«è£å®ãããã©ã³ã¹ããŒãã¬ãã«ïŒTransport Layer SecurityãTLSïŒã§ä¿¡é Œæ§ãšæç¶æ§ã®ããã»ãã¥ãªãã£ãæäŸããŸãã
TLSã®æè¡çåŽé¢ã«å ããŠãå質ä¿èšŒã«ã¯å¥ã®åŽé¢ããããŸãã ããšãã°ããŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³æ¿èªãã©ãŒã ã«HTTPããŒã¿ãå ¥åã§ããããã«ããå Žåãæ¿èªããŒã¿ãã€ã³ã¿ãŒã»ããããããã®åŸäœ¿çšãããMitMæ»æã®å¯èœæ§ãåãå ¥ããå¿ èŠããããŸãã ãŸãã¯ãHTTPSã§èªã¿èŸŒãŸããããŒãžã«éHTTPSãªãœãŒã¹ãèªã¿èŸŒãããšãèš±å¯ããå ŽåãMitMæ»æè ãã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°æ»æãå®è¡ãããŠãŒã¶ãŒã®ãã©ãŠã¶ãäºåã«ããã°ã©ã ãããæŠåšã«å€ããæ段ãæã£ãŠããããšãåãå ¥ããå¿ èŠããããŸããã©ãŠã¶ããŒã¹ã®HTTPSæ¥ç¶ãä»ããŠééçã«åäœããŸãã
äžèšã®4ã€ã®äž»ãªã¿ã¹ã¯ããçããæãããªåºæºã¯ãã»ãã¥ãªãã£å¯Ÿçã®å質ãè©äŸ¡ããã®ã«åœ¹ç«ã¡ãŸãã
- æå·åïŒåŒ·åãªæå·åæšæºãšæå·ã¹ã€ãŒãã䜿çšãããŠããŸããïŒ
- èå¥ïŒãµãŒããŒèå¥ã®æ£ç¢ºããšå®å šæ§ã¯æ€èšŒãããŠããŸããïŒ
- ããŒã¿ã®æªã¿ïŒã»ãã·ã§ã³äžããŠãŒã¶ãŒããŒã¿ã¯å®å šã«ä¿è·ãããŠããŸããïŒ
- ãªãã¬ã€æ»æïŒãªã¯ãšã¹ããèšé²ããŠæ»æè ããµãŒããŒã«éãè¿ããæ¢ç¥ã®ã¢ã¯ã·ã§ã³ãå¹æããªãã¬ã€ã§ããããã«ããæ»æè ã«å¯Ÿããä¿è·æ¹æ³ã¯ãããŸããïŒ
ãããã¯ãæ¬ã®ç¬¬4éšå šäœã®éèŠãªè³ªåã§ãã ãããã®è©³çŽ°ããã®ä»ã®è©³çŽ°ãæãäžããŸãããè¯å®çãªçããåŸãããªãå Žåããã¹ãŠãäœããã®åœ¢ã§ãããã®è³ªåãšè匱æ§ã®å®çŸ©ãäžå¿ã«å±éããŸãã
ãã1ã€ã®éèŠãªãã€ã³ãã¯ãã©ã®ããŒã¿ãä¿è·ããå¿ èŠããããã§ãã æããã«ããããã¯éè¡ã«ãŒãã®è©³çŽ°ã身å ã確èªã§ããæ å ±ãããã³ãã¹ã¯ãŒãã§ãã ãŠãŒã¶ãŒã»ãã·ã§ã³IDã¯ã©ãã§ããïŒ IDã§ã¯ãªããã¹ã¯ãŒããä¿è·ãããšãæ»æè ã¯éä¿¡ãããCookieãçã¿ãã»ãã·ã§ã³ãã€ãžã£ãã¯æ»æãå®è¡ããŠãèªåã®ã³ã³ãã¥ãŒã¿ãŒã§ãŠãŒã¶ãŒã«ãªãããŸãããšãã§ããŸãã èªèšŒããŒã¿ãä¿åããã«ã¯ãèªèšŒãã©ãŒã ãä¿è·ããã ãã§ã¯ååã§ã¯ãããŸããã ãã©ãŒã ã«ããŒã¿ãå ¥åããŠããã»ãã·ã§ã³ãçµäºãããŸã§ãHTTPSã®ãã¬ãŒã ã¯ãŒã¯å ã§ã®ã¿ãŠãŒã¶ãŒã»ãã·ã§ã³ãå®è¡ãããå Žåãæé«ã®ä¿è·ãå®çŸãããŸãã
ããã§ããªããååã§ã¯ãªãããšããèšèãç解ããå¿ èŠããããŸãã SSL / TLSå®è£ ã®åé¡ã¯ããããã䜿çšããªãã ãã§ãªããæ倧éã®ã»ãã¥ãªãã£ã確ä¿ããã®ã«äžååãªçšåºŠã«äœ¿çšããããšã§ããããŸãã
3ã€ã®èŠ³ç¹ãã茞éã®äžå®å®æ§ãæ€èšããŸãã
- ãµãŒããŒã¢ããªã±ãŒã·ã§ã³ãšãµãŒãããŒãã£ãµãŒããŒéã
- ã¯ã©ã€ã¢ã³ããšãµãŒããŒã¢ããªã±ãŒã·ã§ã³éã
- ã«ã¹ã¿ã ã»ãã¥ãªãã£ããªã·ãŒã䜿çšããã¯ã©ã€ã¢ã³ããšãµãŒããŒã¢ããªã±ãŒã·ã§ã³éã
æåã®é ç®ã«ã¯ãWebã¢ããªã±ãŒã·ã§ã³ãä»ã®ããã»ã¹åå è ã«å®å šã«æ¥ç¶ããŠããããšã®ç¢ºèªãå«ãŸããŸãã TLSã¯äžè¬ã«ãWebãµãŒãã¹APIããã³ã¢ããªã±ãŒã·ã§ã³ã®å®è¡ã«å¿ èŠãªä»ã®å€ãã®å ¥åãœãŒã¹ã«äœ¿çšãããŸãã
2çªç®ã®é ç®ã¯ããã©ãŠã¶ãŸãã¯ä»ã®ã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ãä»ãããŠãŒã¶ãŒãšWebã¢ããªã±ãŒã·ã§ã³ãšã®å¯Ÿè©±ã§ãã ãã®å Žåãã»ãã¥ãªãã£ã§ä¿è·ãããURLãå ¬éããã»ãã¥ãªãã£å¯Ÿçãæ£ããå®è£ ãããŠããããšã確èªããŠããããããã€ãã¹ãããªã¹ã¯ããªãããã«ããå¿ èŠããããŸãã
3çªç®ã®ãã€ã³ãã«ã¯ãããããçš®é¡ã®æŽŸæãªãœãªã¥ãŒã·ã§ã³ïŒå¥åŠãªå¥åŠãïŒãå«ãŸããŸãã SSL / TLSã¯ããã°ã©ããŒã«ãã£ãŠäžé©åã«å®è£ ãããæšæºã«å®è©ããããããSSL / TLSãªãã§å®å šãªæ¥ç¶ã確ä¿ããæ¹æ³ã¯å€æ°ãããŸãã äŸã¯ãSSL / TLSãå¿ èŠãšããªããããããã«ãã£ãŠæäŸãããå€ãã®ä¿è·æ段ãæäŸãã眲åæžã¿èŠæ±ã®OAuthãããã³ã«ã«ãã䜿çšã§ãïŒç¹ã«ãèŠæ±ããŒã¿ã®æå·åã¯çç¥ãããŸãïŒã ãããã£ãŠãããã¯çæ³çãªãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸãããã誀ã£ãŠæ§æãããSSL / TLSã©ã€ãã©ãªãããåªããŠããŸãã
詳现ã説æããåã«ããŸãTLSã®æŠèŠãèŠãŠåºæ¬çãªç¥èãåŸãŠãããPHPã®å éšã«ã€ããŠæ·±ãæãäžããŸãããã
å®çŸ©ãšæ ¹æ¬çãªè匱æ§
TLSã¯ãæå·åãèªèšŒæ€èšŒãªã©ã䜿çšããŠ2人ã®åå è ã®éã«å®å šãªæ¥ç¶ãäœæããæ¹æ³ã説æããäžè¬çãªååã§ãã ããããšãã®é¢ä¿ã«ã€ããŠç°¡åã«èŠãŠã¿ãŸãããã
PHPããã®SSL / TLSïŒãµãŒããŒãµãŒããŒïŒ
PHPãããã°ã©ãã³ã°èšèªãšããŠã©ãã»ã©æããŠãã人æ°ã®ãããªãŒãã³ãœãŒã¹ã©ã€ãã©ãªã®æãè¡šé¢çãªæŠèŠã§ããæããã«ãªããŸãããããã«ã¯ããããã段éã§ãã©ã³ã¹ããŒãã¬ãã«ã®ã»ãã¥ãªãã£é¢é£ã®è匱æ§ãå«ãŸããŠããŸãã ãŸããPHPã³ãã¥ããã£ã¯ãåé¡ã解決ããããããŠãŒã¶ãŒãè
ããæ¹ãç°¡åã ãããšãã£ãŠãæ£åœãªçç±ããªããããã®è匱æ§ã«èŠããã§ããŸãã ç¶æ³ã¯ãPHPèªäœãããœã±ããããŒã¹ã®HTTPã¯ã©ã€ã¢ã³ãããfile_get_contents()
ããã³ãã®ä»ã®ãã¡ã€ã«ã·ã¹ãã é¢æ°ã«è³ããŸã§ãããããå Žæã§äœ¿çšãããPHPã¹ããªãŒã ã§ã®SSL / TLSã®å®è£
ãéåžžã«è²§åŒ±ã§ãããšããäºå®ã«ãã£ãŠæªåããŸãã ããã«å ããŠãPHPã©ã€ãã©ãªã®äœæè
ã¯ãSSL / TLSã®æœåšçãªã»ãã¥ãªãã£ãžã®åœ±é¿ã«ã€ããŠãè°è«ããããšããŠããŸããã
ãã®ç« ã§èª¬æããããšãäœãå®è¡ããªãå Žåã¯ãå°ãªããšãPHPã®cURLæ¡åŒµã䜿çšããŠãã¹ãŠã®HTTPSèŠæ±ãå®è¡ããŸãã ããã©ã«ãèšå®ã¯ã»ãã¥ãªãã£ãæäŸããããã«ãæ¡åŒµæ©èœã¯PHPã®ç¯å²å€ã®å€æ°ã®ãŠãŒã¶ãŒã®å°é家ã«ããè©äŸ¡ã«äŸåããŠããŸãã ãããã£ãŠãã»ãã¥ãªãã£ãåäžãããããã«ãã®ç°¡åãªã¹ããããèžããšãåŸæããããšã¯ãããŸããã çæ³çãªè§£æ±ºçã¯ãPHPã®äœæè ãæçµçã«èµ·åããçµã¿èŸŒã¿ã®SSL / TLSãµããŒãã§Secure By DefaultååïŒããã©ã«ãã»ãã¥ãªãã£ïŒãå®è£ ããå Žåã§ãã
PHPã§ã®SSL / TLSã®çŽ¹ä»ã¯éåžžã«å€±ç€Œã§ããã TLSã®è匱æ§ã¯ãã»ãšãã©ã®ã»ãã¥ãªãã£åé¡ãããã¯ããã«åçŽã§ããããã©ãŠã¶ãŒã«ãšã£ãŠãããã©ãã»ã©éèŠã§ãããã¯èª°ããç¥ã£ãŠããŸãã ãããããµãŒããŒã¢ããªã±ãŒã·ã§ã³ã¯ããŠãŒã¶ãŒããŒã¿ã®ã»ãã¥ãªãã£ãã§ãŒã³ã«ãããŠãåæ§ã«éèŠãªãªã³ã¯ã§ãã ããã§ã¯ãPHPã®SSL / TLSã詳ããèŠãŠã¿ãŸãããã次ã«ãPHPã¹ã¬ãããšåªããcURLæ¡åŒµæ©èœãèŠãŠã¿ãŸãããã
PHPã¹ã¬ãã
ã¹ããªãŒã ã«æ £ããŠããªãå ŽåïŒãã¡ã€ã«ããããã¯ãŒã¯ãããã³å ±éã®æ©èœãå ±æããä»ã®æäœãäžè¬åããããã«å¿ èŠã§ãã ã¹ããªãŒã ãç¹å®ã®ãããã³ã«ã䜿çšããæ¹æ³ãç¥ãã«ã¯ãã©ãããŒã䜿çšããŠãã¹ããªãŒã ããã¡ã€ã«ãHTTPãªã¯ãšã¹ããPHARã¢ãŒã«ã€ããããŒã¿URIïŒRFC 2397ïŒãªã©ãè¡šãããšãã§ããŸããã¹ããªãŒã ãéå§ããã«ã¯ãè£å©ãã¡ã€ã«é¢æ°ãåŒã³åºãã ãã§ååã§ãïŒãµããŒããã¡ã€ã«é¢æ°ïŒã«å¯Ÿå¿ããURLã䜿çšããŠãã©ãããŒãšã¿ãŒã²ãããªãœãŒã¹ã瀺ããŸãã
file_get_contents('file:///tmp/file.ext');
ããã©ã«ãã§ã¯ãã¹ããªãŒã ã¯ãã¡ã€ã«ã©ãããŒïŒãã¡ã€ã«ã©ãããŒïŒã䜿çšãããããéåžžãURLã¯å¿
èŠãããŸããããã¡ã€ã«ãžã®çžå¯Ÿãã¹ã§ãååã§ãã file()
ã include()
ã require_once
file_get_contents()
ãªã©ã®ã»ãšãã©ã®ãã¡ã€ã«ã·ã¹ãã é¢æ°ã¯ã¹ããªãŒã åç
§ãåãå
¥ãããããããã¯æããã§ãã ãããã£ãŠãåã®äŸãæžãçŽããŸãã
file_get_contents('/tmp/file.ext');
è°è«äžã®ãããã¯ãèãããšããããè¡ãããšãã§ããŸãïŒ
file_get_contents('http://www.example.com');
file_get_contents()
ãªã©ã®ãã¡ã€ã«ã·ã¹ãã é¢æ°ã¯HTTPã©ããã¹ããªãŒã ããµããŒãããŠãããããPHPã§HTTPã¯ã©ã€ã¢ã³ãã圢æããŸããããã¯éåžžã«ç°¡åã«ã¢ã¯ã»ã¹ã§ããŸãã å°çšã®ã©ã€ãã©ãªã䜿çšããŠãGuzzleãBuzzããŸãã¯Zend \Zend\Http\Client
ãã¬ãŒã ã¯ãŒã¯ã®ã¯ã©ã¹ãªã©ã®HTTPã¯ã©ã€ã¢ã³ããäœæããå¿
èŠããªããšæããå Žåã«äœ¿çšã§ããŸãã ã·ã³ãã«ãªã¯ã©ã€ã¢ã³ããæ©èœããã«ã¯ã php.ini
ã§allow_url_fopen
ãªãã·ã§ã³ãæå¹ã«ããå¿
èŠãããphp.ini
ã ããã©ã«ãã§ã¯æå¹ã«ãªã£ãŠããŸãã
ãã¡ããã allow_url_fopen
æå¹ã«ãããšããªã¢ãŒããã¡ã€ã«ã®å®è¡ã«ããæ»æã®ãªã¹ã¯ã䌎ããã¢ã¯ã»ã¹å¶åŸ¡ãæ
å ±æŒãããåé¿ãããŸãã æ»æè
ããªãã·ã§ã³ã§ãªã¢ãŒãURIããã¡ã€ã«é¢æ°ã«æ¿å
¥ã§ããå Žåããªã¢ãŒãã®ä¿¡é Œã§ããªããœãŒã¹ããã®ãã®ãå«ããããŠã³ããŒããããã¡ã€ã«ãã¢ããªã±ãŒã·ã§ã³ã«ç°¡åã«å®è¡ãä¿åããŸãã¯è¡šç€ºãããããšãã§ããŸãã
ãã¡ã€ã«ã¯localhost
ããããŠã³ããŒããããããšãå¿ããªãã§ãã ãããããã¯ãããŒã«ã«ãµãŒããŒã«ç»é²ãããŠããå¶éã«åºã¥ããŠã¢ã¯ã»ã¹å¶åŸ¡ããã€ãã¹ã§ããããšãæå³ããŸãã ãŸãã allow_url_fopen
ãªãã·ã§ã³allow_url_fopen
ããã©ã«ãã§æå¹ã«ãªã£ãŠããå Žåãæ倧éã®ã»ãã¥ãªãã£ã確ä¿ããã«ã¯ç¡å¹ã«ããå¿
èŠããããŸãã
PHPã¹ããªãŒã ãåçŽãªHTTPã¯ã©ã€ã¢ã³ããšããŠäœ¿çšããããšã«æ»ããŸãããïŒããã§ãå§ãã§ããŸãã ïŒã ãããè¡ãããšãããšããã¹ãŠãããèå³æ·±ããã®ã«ãªããŸãã
$url = 'https://api.twitter.com/1/statuses/public_timeline.json'; $result = file_get_contents($url);
ããã¯ãHTTPSãä»ããïŒä»¥åã®ïŒTwitter API 1.0ãžã®åçŽãªéèªèšŒãªã¯ãšã¹ãã§ãã é倧ãªãªãŒã¯ããããŸãã HTTPS-ïŒhttpsïŒ//ïŒããã³FTPS-ïŒftpsïŒ//ïŒã©ãããŒã䜿çšããŠè¡ããããªã¯ãšã¹ãã®å ŽåãPHPã¯SSL Context
䜿çšããŸãã SSL / TLSã«ã¯å€ãã®èšå®ãããããããã®ããã©ã«ãå€ã¯å®å
šã«å®å
šã§ã¯ãããŸããã file_get_contents()
ãã©ã¡ãŒã¿ãŒãšããŠèšå®ãããå
ã®SSL Context
èšå®ãæ¿å
¥ããæ¹æ³ã瀺ãããã«äŸãå€æŽããŸãã
$url = 'https://api.twitter.com/1/statuses/public_timeline.json'; $contextOptions = array( 'ssl' => array() ); $sslContext = stream_context_create($contextOptions); $result = file_get_contents($url, NULL, $sslContext);
åè¿°ã®ããã«ãSSL / TLSãæ£ããæ§æããªããšãã¢ããªã±ãŒã·ã§ã³ã¯ãäžéè ãæ»æã«å¯ŸããŠç¡é²åã«ãªããŸãã ããã©ã«ãã§ã¯ãPHPã¹ããªãŒã ã¯SSL / TLSã䜿çšããŠäœæ¥ããå Žåãå®å šã«å®å šã§ã¯ãããŸããã å®å šã«å®å šã«ãªãããã«äŸãä¿®æ£ããŸãããã
$url = 'https://api.twitter.com/1/statuses/public_timeline.json'; $contextOptions = array( 'ssl' => array( 'verify_peer' => true, 'cafile' => '/etc/ssl/certs/ca-certificates.crt', 'verify_depth' => 5, 'CN_match' => 'api.twitter.com', 'disable_compression' => true, 'SNI_enabled' => true, 'ciphers' => 'ALL!EXPORT!EXPORT40!EXPORT56!aNULL!LOW!RC4' ) ); $sslContext = stream_context_create($contextOptions); $result = file_get_contents($url, NULL, $sslContext);
ä»ããã¹ãŠã倧äžå€«ã§ãïŒ ä»¥åã®ããŒãžã§ã³ãšæ¯èŒãããšãPHPã«ãã£ãŠæåã«èšå®ãŸãã¯ç¡å¹åãããªãã£ã4ã€ã®ãªãã·ã§ã³ãèšå®ãããŠããããšãããããŸãã 圌ããäœããããèŠãŠã¿ãŸãããã
- verify_peer
ãã¢æ€èšŒ-HTTPSãªã¯ãšã¹ããéä¿¡ãããã¹ãã«ãã£ãŠæäŸãããSSL蚌ææžã®æå¹æ§ã®æ€èšŒã æ£ãã蚌ææžã¯ãä¿¡é Œã§ããèªèšŒå±ïŒCAïŒã®ç§å¯éµã§çœ²åãããŸãã æ€èšŒã¯ã䜿çšããSSLã³ã³ããã¹ãã®cafile
ãªãã·ã§ã³ãšããŠãã¡ã€ã«ã»ããã«å«ãŸããŠããCAå
¬éããŒã䜿çšããŠå®è¡ã§ããŸãã ãŸãã蚌ææžã®æå¹æéãåããªãããã«ããå¿
èŠããããŸãã
- cafile
cafile
ã¯ãä¿¡é Œã§ããCAã®å
¬ééµãå«ãæå¹ãªãã¡ã€ã«ãæãå¿
èŠããããŸãã PHPã§ã¯ãããã¯èªåçã«è¡ãããªãããããªã³ã¯ããããã¡ã€ã«ã«ããŒãç¹å¥ãªåœ¢åŒïŒéåžžã¯PEMãŸãã¯CRTïŒã§ä¿ç®¡ããŠãã ããã ã³ããŒãèŠã€ãããªãå Žåã¯ã Mozilla VCSããããŠã³ããŒãããŠè§£æããŸãã ãã®ãã¡ã€ã«ããªããã°ããã¢ããã§ãã¯ããããšã¯äžå¯èœã§ããããªã¯ãšã¹ãã¯å®è¡ãããŸããã
- verify_depth
ãã®èšå®ã¯ãäžé蚌ææžçºè¡è ã®æ倧æ°ãã€ãŸãå ã®ã¯ã©ã€ã¢ã³ã蚌ææžã®æ€èšŒã«äœ¿çšã§ããCA蚌ææžã®æ°ãæå®ããŸãã
- CN_match
åè¿°ã®3ã€ã®ãªãã·ã§ã³ã¯ããµãŒããŒããæäŸããã蚌ææžã®æ€èšŒã«é¢é£ããŠããŸãã ãã ãããããã¯ç§ãã¡ãèŠæ±ãããã¡ã€ã³åãŸãã¯IPãã€ãŸããã¹ãã«é¢é£ããURLã®äžéšã«å¯ŸããŠæå¹ãã©ãããç解ããã®ã«åœ¹ç«ã¡ãŸããã 蚌ææžãçŸåšã®ãã¡ã€ã³/ IPã«ãã€ã³ããããŠãããã©ããã確èªããããã«ããã¹ãæ€èšŒïŒãã¹ãæ€èšŒïŒãå®è¡ããŸãã PHPã§ã¯ããµããã¡ã€ã³ãããå Žåã¯ã CN_match
ãã¹ãå€ïŒSSLã³ã³ããã¹ãå
ïŒãèšå®ããå¿
èŠããããŸãã ãã®ãªãã·ã§ã³ãèšå®ãããŠããéããPHPã¯å
éšãã§ãã¯ãå®è¡ããŸãã ãããè¡ãããªãå Žåãäžéè
æ»æäžã«ãæ»æè
ã¯ä¿¡é Œã§ããCAã«ãã£ãŠçœ²åãããæå¹ãªèšŒææžãæäŸã§ããŸãã ãã ãã蚌ææžã¯æ»æè
ã®å¶åŸ¡äžã«ãããã¡ã€ã³ã«å¯ŸããŠæå¹ã§ãããæ¥ç¶ããããã¡ã€ã³ã«å¯ŸããŠã¯æå¹ã§ã¯ãããŸããã CN_match
ãªãã·ã§ã³ãèšå®ãããšã蚌ææžã®äžäžèŽãç¹å®ããHTTPSèŠæ±ã®å€±æã«ã€ãªãããŸãã
æ»æè
ã䜿çšããæå¹ãªèšŒææžã«ã¯æ»æè
ã®èå¥æ
å ±ãå«ãŸããŠããããïŒãããååŸããããã®æ¡ä»¶ã§ãïŒïŒãçµéšè±å¯ãªæ»æè
ã¯ã察å¿ããç§å¯ããŒãåããæå¹ãªçœ²åä»ãCA蚌ææžã«ããã€ã§ãã¢ã¯ã»ã¹ã§ããããšã«æ³šæããŠãã ããã ä»ã®äŒç€ŸããçãŸããããä¿¡é Œã§ããCAãã§ãã¯ãããæãããããå¯èœæ§ããããŸãã ããã¯ã2011幎ã«DigiNotorãgoogle.com
äžæãªããŒãã£ã®èšŒææžãçºè¡ãããšãã«èµ·ãããŸããã 圌女ã¯ãäž»ã«ã€ã©ã³ã®ãŠãŒã¶ãŒã«å¯Ÿãããäžéè
ãæ»æã«äœ¿çšããŸããã
- disable_compression
ãã®ãªãã·ã§ã³ã¯ãPHP 5.4.13ã§ç»å ŽããŸããã CRIMEæ»æããã³BEASTã®ãããªããã£ã³ã°ã䌎ãä»ã®æ»æããä¿è·ããå¿ èŠããããŸãã ãã®èšäºã®å·çæç¹ã§ã¯ããã®ãªãã·ã§ã³ã¯10ãæéå©çšå¯èœã§ãã ãªãŒãã³ãœãŒã¹PHPã§ã®äœ¿çšã®ã»ãšãã©å¯äžã®äŸãèŠã€ããã«ã¯ãå€ãã®å¿èãå¿ èŠã§ããã
- SNI_enabled
åäžã®IPãè€æ°ã®SSL蚌ææžã§åäœããããã«æ§æã§ããå Žåããã¹ãŠã®ãµã€ããŸãã¯ãã®IPã§ãã¹ããããéHTTPãµãŒãã¹ã«éå®ãããªãããã«ããµãŒããŒå衚瀺ã®ãµããŒããå«ãŸããŸãã
- æå·
ãã®èšå®ã¯ãSSL / TLSæ¥ç¶ã確ç«ãããšãã«ãã©ã®æå·ãéžæãã¹ããããŸãã¯éžæãã¹ãã§ãªããã衚瀺ããã®ã«åœ¹ç«ã¡ãŸãã ããã©ã«ãã®ãªã¹ãã¯ãopensslæ¡åŒµæ©èœã«ãã£ãŠæäŸãããŸãã 䜿çšã匷å¶ãããªãéããç¡å¹ã«ããå¿ èŠãããå®å šã§ãªãæå·ãå«ãŸããŠããŸãã 以äžã®ãªã¹ãã¯ãopensslã§åãå ¥ããããŠããæ§æã䜿çšããŠã2014幎1æã«cURLã«ãã£ãŠå®è£ ãããŸããã 転éã®å®å šãªã»ãã¥ãªãã£ïŒPerfect Forward SecrecyïŒã«éç¹ã眮ãããŠãããããMozillaã«ãã£ãŠææ¡ããã代æ¿ãªã¹ãã®æ¹ãåªããŠããå¯èœæ§ããããŸããããã¯æè¯ã®å®çšçãªã¢ãããŒãã§ãã Mozillaã®ãªã¹ãã¯ãã£ãšé·ãã§ãïŒ
ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:AES128:AES256:RC4-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK
å¶éäºé
äžèšã®ããã«ãäžéè æ»æäžã«äœ¿çšããŠããURLã§æå®ããããã¹ãã«å¯ŸããŠãµãŒããŒããæäŸããã蚌ææžã®æå¹æ§ããã§ãã¯ããŠããäžæ£ã«è³Œå ¥ãŸãã¯åä¿¡ããæå¹ãªèšŒææžãåã«ã¹ãªããããããšã¯ã§ããŸããã ããã¯ãæ¥ç¶ãå®å šã«å®å šã«ããããã®4ã€ã®éèŠãªã¹ãããã®1ã€ã§ãã
ã·ã¹ãã ã¯ãPHP HTTPSã©ãããŒã®SSL Context
ã«ãã£ãŠå®£èšãããCN_match
ãã©ã¡ãŒã¿ãŒã®ãããã§ãã§ãã¯ãå®è¡ããŸãã ãããã圌ã«ã¯æ¬ é¥ããããŸãã å·çæç¹ã§ã¯ãSSL蚌ææžã®å
±éåïŒCommon NameãCNïŒã®ã¿ããã§ãã¯ããã蚌ææžã§å®çŸ©ãããSubject Alternative NameïŒSANïŒãã£ãŒã«ãã®æå¹æ§ã¯ãã§ãã¯ãããŸããã§ããã SANã§ã¯ãåäžã®SSL蚌ææžã§è€æ°ã®ãã¡ã€ã³åãä¿è·ã§ãããããéåžžã«éèŠã§ãããææ°ã®ãã¹ãŠã®ãã©ãŠã¶ãŒã§ãµããŒããããŠããŸãã ãŸããPHPã¯ãŸã SANãã§ãã¯ããµããŒãããŠããªãããããã®ãããªèšŒææžã§ä¿è·ããããã¡ã€ã³ãžã®SSL / TLSæ¥ç¶ã¯ç¢ºç«ãããŸããã SANã®ãµããŒãã¯ãããŒãžã§ã³5.6以éã®PHPã§æäŸãããäºå®ã§ãã
äžæ¹ããã®ãŸãŸäœ¿çšã§ããcURLæ¡åŒµæ©èœã¯SANããµããŒãããŠãããããçµã¿èŸŒã¿ã®PHP HTTPS / FTPSã©ãããŒãšæ¯èŒããŠããã®äœ¿çšã¯ã¯ããã«ä¿¡é Œæ§ãé«ãæãŸããæ¹æ³ã§ãã ãã®ç¹ã§ãPHPã¹ããªãŒã ãé«ã確çã§äœ¿çšãããšã誀ã£ãåäœãçºçããå¯èœæ§ããããçæ°ãªããã°ã©ããŒã¯ãã¹ããã§ãã¯å šäœãåçŽã«ãªãã«ããŸãããããã¯éåžžã«æãŸãããããŸããã
PHPãœã±ããã®SSLã³ã³ããã¹ã
PHPã®å€ãã®HTTPã¯ã©ã€ã¢ã³ãã¯ãcURLã¢ããã¿ãŒãšããã©ã«ãã®PHPãœã±ããã¢ããã¿ãŒã®äž¡æ¹ãæäŸããŸãã åŸè ã®ããã©ã«ãã®äœ¿çšã¯ãcURLããªãã·ã§ã³ã®æ¡åŒµæ©èœã§ããããšãæå³ããå®éã«ã¯ç¡å¹ã«ã§ããŸãã
PHPãœã±ããã¯ãPHPã¹ã¬ãããšåãSSL Context
ãªãœãŒã¹ã䜿çšãããããäžèšãšåãåé¡ãšå¶éããããŸãã å¯äœçšïŒå€ãã®äž»èŠãªHTTPã¯ã©ã€ã¢ã³ãã¯ãã¢ããªãªãªã«ä¿¡é Œæ§ãäœããæ¬æ¥ãããå®å
šæ§ãäœãå¯èœæ§ããããŸãã å¯èœã§ããã°ããã®ãããªã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªã¯cURLã¢ããã¿ã䜿çšããããã«æ§æããå¿
èŠããããŸãã ãŸããã¯ã©ã€ã¢ã³ããæ£ããSSL / TLSã»ãã¥ãªãã£ã¢ãããŒãã䜿çšããããšãå¿ããªãããã«ããŠãã ããã
è¿œå ã®ãªã¹ã¯
CURLæ¡åŒµ
PHPã¹ããªãŒã ãšã¯ç°ãªããcURLæ¡åŒµæ©èœã¯HTTPãªã¯ãšã¹ããå«ãããŒã¿ã®ã¿ã転éããŸãã ãŸãã SSL Context
ãããŒãšã¯ç°ãªããcURLã¯ããã©ã«ãã§SSL / TLSãä»ããŠå®å
šã«ãªã¯ãšã¹ããå®è¡ããŸãã CA蚌ææžããã±ãŒãžçšã®ã¹ãã¬ãŒãžãªãã§ã³ã³ãã€ã«ãããå ŽåïŒããšãã°ãcert.pemãã¡ã€ã«ãŸãã¯ä¿¡é Œã§ããCA蚌ææžä»ãã®ca-bundle.crtãªãïŒã§ã³ã³ãã€ã«ãããå Žåãé€ããããã«å¯ŸããŠäœãããå¿
èŠã¯ãããŸããã
ããã«ã¯ç¹å¥ãªã¢ãããŒãã¯å¿ èŠãªããããTwitterã®APIãåŒã³åºãããšãã§ããŸããããã¯ãPHPã¹ããªãŒã ã䜿çšããSSL / TLSã®å Žåãšåæ§ã§ãã æå°éã®æéãããã³äžéæ»æã®ç·æ§ã®ããã«ããªããéãããã€ãã®ãªãã·ã§ã³ãå¿ãããšããäºå®ãå¿é ããªãã§ãã ããã
$url = 'https://api.twitter.com/1/statuses/public_timeline.json'; $req = curl_init($url); curl_setopt($req, CURLOPT_RETURNTRANSFER, TRUE); $result = curl_exec($req);
ãããã£ãŠãHTTPSãªã¯ãšã¹ãã«ã¯cURLããå§ãããŸãã ããã¯ããã©ã«ãã§ã¯å®å šã§ãããPHPã¹ã¬ããã¯ããããå®å šã§ã¯ãããŸããã ãã以å€ã®å Žåã¯ãcURLã䜿çšããã ãã§ãé çãã解æŸãããŸãã æçµçã«ãcURLã¯ããå®å šã§ãå¿ èŠãªã³ãŒããå°ãªãã人çºçãšã©ãŒã«ããSSL / TLSã»ãã¥ãªãã£ã§å€±æããå¯èœæ§ãäœããªããŸãã
å·çæç¹ã§ãPHP 5.6ã¯alpha1ã«éããŸããã æçµãªãªãŒã¹ã§ã¯ãPHPã¹ããªãŒã ããã³SSL / TLSãä»ãããœã±ããæ¥ç¶ã®ããå®å šãªããã©ã«ããå°å ¥ãããŸãã ãããã®ã€ãããŒã·ã§ã³ã¯ãPHP 5.3ã5.4ããŸãã¯5.5ã«ã¯ç§»æ€ãããŸããã ãããã£ãŠãããã°ã©ããŒã¯PHP 5.6ãæäœéå¿ èŠã«ãªããŸã§ãå®å šãªããã©ã«ãèšå®ãæèçã«å®è£ ããå¿ èŠããããŸãã
ãã¡ãããä¿¡é Œã§ãã蚌ææžã®ããã±ãŒãžã®é 眮ãæ§æããã«cURLæ¡åŒµæ©èœãæå¹ã«ããå Žåãäžèšã®äŸã¯æ©èœããŸããã å ¬ã«é åžãããã©ã€ãã©ãªã®å Žåãå®å šãªåäœã匷å¶ããå¿ èŠããããŸãã
$url = 'https://api.twitter.com/1/statuses/public_timeline.json'; $req = curl_init($url); curl_setopt($req, CURLOPT_RETURNTRANSFER, TRUE); $result = curl_exec($req); /** * , SSL, * CA-, , * ext/curl. 77 CURLE_SSL_CACERT_BADFILE, * - PHP. */ $error = curl_errno($req); if ($error == CURLE_SSL_PEER_CERTIFICATE || $error == CURLE_SSL_CACERT || $error == 77) { curl_setopt($req, CURLOPT_CAINFO, __DIR__ . '/cert-bundle.crt'); $result = curl_exec($req); } /** * . * SSL ;). */
æãé£ããã®ã¯ãæããã«cert-bundle.crt
ãŸãã¯cafile.pem
蚌ææžããã±ãŒãžãã¡ã€ã«ãé
åžããããšã§ãïŒãã¡ã€ã«åã¯ãœãŒã¹ã«ãã£ãŠç°ãªããŸãïŒïŒã CAã®èšŒææžã¯ãã»ãã¥ãªãã£ãŸãã¯ãã¢ã¬ãã¥ãŒããã»ã¹ã«éåããå Žåãã»ãšãã©ã®ãã©ãŠã¶ã§ãã€ã§ã倱å¹ããå¯èœæ§ãããããã蚌ææžãã¡ã€ã«ãé·æéæŽæ°ããªãããšã¯ãå§ãã§ããŸããã ãã ããæãæãããªè§£æ±ºçã¯ãå¿
èŠãªã©ã€ãã©ãªãŸãã¯ã¢ããªã±ãŒã·ã§ã³ãã¡ã€ã«ã®ã³ããŒãé
åžããããšã§ãã
é åžããã蚌ææžããã±ãŒãžã®æŽæ°ãå³å¯ã«å¶åŸ¡ã§ããªãå ŽåããŸãã¯ãããå®æçã«ç¢ºèªã§ããããŒã«ãå¿ èŠãªå Žåã¯ã Sslurpã䜿çšããŠãã ãã ã
ã¯ã©ã€ã¢ã³ãåŽã®SSL / TLSæ¥ç¶ïŒã¯ã©ã€ã¢ã³ã/ãã©ãŠã¶ãŒãµãŒããŒïŒ
以åã«è©±ããããšã®ã»ãšãã©ã¯ãPHP Webã¢ããªã±ãŒã·ã§ã³ã®ã€ãã·ã¢ããã§å¥ã®ãµãŒããŒãšç¢ºç«ãããSSL / TLSæ¥ç¶ã«é¢é£ããŠããŸããã ãã¡ãããã¢ããªã±ãŒã·ã§ã³ãã¯ã©ã€ã¢ã³ããã©ãŠã¶ãŒãä»ã®ã¢ããªã±ãŒã·ã§ã³ã«SSL / TLSãµããŒããæäŸããå Žåãå€ãã®ã»ãã¥ãªãã£äžã®åé¡ããããŸãã ããã«ããããã©ã³ã¹ããŒãã¬ãã«ã§ã®ã»ãã¥ãªãã£ã®è匱æ§ã«é¢é£ããæ»æã®ãªã¹ã¯ãé«ãŸããŸãã
èããŠã¿ããšãããã¯éåžžã«ç°¡åã§ãã ãŠãŒã¶ãŒãã¹ã¯ãŒãã®å ¥åæã«ä¿è·ãæäŸãããªã³ã©ã€ã³ã¢ããªã±ãŒã·ã§ã³ãäœæããŠãããšããŸãã æ¿èªãã©ãŒã ã¯HTTPSçµç±ã§æäŸãããããããã®ããŒã¿ãHTTPSçµç±ã§éä¿¡ãããŸãã ããã·ã§ã³ã¯å®äºããŸããã ã¢ã«ãŠã³ãã§äœæ¥ãéå§ããããã«ããŠãŒã¶ãŒã¯HTTP URLã«ãªãã€ã¬ã¯ããããŸããã åé¡ã«æ°ã¥ããŸãããïŒ
ãäžéè ãæ»æã®è åšãããå Žåãæ¿èªãã©ãŒã ãä¿è·ããŠããéããã ãã§ã¯ãããŸããã ãŠãŒã¶ãŒã»ãã·ã§ã³ãšãã¹ãŠã®å ¥åããŒã¿ãããã³ãŠãŒã¶ãŒãåä¿¡ãããã¹ãŠã®HTMLã³ãŒãã®Cookieã¯ãHTTPçµç±ã§äœæ¥ããå Žåã¯å®å šã§ã¯ãããŸããã æ»æè ã¯Cookieãçãã§ãŠãŒã¶ãŒã«ãªãããŸãããšãã§ãããŠãŒã¶ãŒãåä¿¡ããããŒãžã«XSSã³ãŒããæ¿å ¥ããŠããŠãŒã¶ãŒã«ä»£ãã£ãŠã¿ã¹ã¯ãå®è¡ããããã¢ã¯ã·ã§ã³ãå¶åŸ¡ãããã§ããŸãã ãããŠãããããã¹ãŠã®ããã«ããŠãŒã¶ãŒã®ãã¹ã¯ãŒãã¯å¿ èŠãããŸããã
HTTPSã®ã¿ã§èªèšŒããã»ã¹ãä¿è·ãããšããã¹ã¯ãŒãã®çŽæ¥çé£ã¯é²æ¢ãããŸãããã»ãã·ã§ã³ãã€ãžã£ãã¯ãä»ã®åœ¢åŒã®ããŒã¿çé£ãããã³XSSæ»æã®ã³ãŒãã®å°å ¥ã«å¯Ÿããä¿è·ã¯è¡ãããŸããã HTTPSã䜿çšããŠ1人ã®ãŠãŒã¶ãŒã®ã¿ãä¿è·ãããšããã©ã³ã¹ããŒãã¬ãã«ã§ã®ä¿è·ãäžååã«ãªããŸãã ãŠãŒã¶ãŒã¯ãäžéè æ»æã«å¯ŸããŠè匱ãªãŸãŸã§ãã