TA的每日心情 | 怒 6 天前 |
---|
签到天数: 2261 天 [LV.Master]伴坛终老
|
作者: 阿伦 日期: 2013 年 3 月 21 日分类: HTTP, Javascript标签: HTTP, HTTPS, IFrame, 安全
: g3 ?% \) t4 F: I \3 K目的学习如何搭建HTTPS服务;* I1 M5 V7 A, o% B3 _) X+ B* c% e
为开发对安全性有较高要求的页面提供指导,避免不必要的安全漏洞;! q+ _. O7 G8 n' V: M
步骤1.搭建本地HTTPS;; s/ v* e1 F* j8 @& t& x
2.分别开发所有可能的嵌套场景:" N6 y6 Y5 i1 u2 G2 E/ q, p
- HTTP嵌套HTTPS
- HTTPS嵌套HTTP
- HTTPS嵌套HTTPS
- HTTP嵌套HTTP) _/ x- k! }0 R) n( ^
3.分别在现有主流浏览器的各个版本访问嵌套页面,记录浏览器相关提示及限制;
+ {! {) N# ~: J9 i/ [操作记录环境系统环境:Windows 7 64bit, E! D5 z* {& L \8 [
服务器:Apache. ^3 X- y6 ^1 Y" y
数据库:MySQL) e$ O' X, ]0 F% Y: W0 A. |
服务器语言:PHP. W5 _/ Y N- z, i' d2 \
搭建本地HTTPS下载windows环境的OpenSSL( http://www.openssl.org/related/binaries.html ,由于本人机器使用的是64位系统,所以下载的是64位OpenSSL)# i o, ]( ]0 ?$ l9 ~
在Command中使用一下命令生成搭建HTTPS所需要的证书及相关文件:
1 K8 m5 M- l8 E# @6 I, t9 E' Y(1) 复制apahce2/conf目录openssl.cnf 文件到bin目录
" K2 |2 B8 `/ Y3 E+ L(2) 生成RSA密钥 (private key) 下面两个命令都可以生成密钥:
- v- O. y, w1 o- g- openssl genrsa -des3 -out ca.key
- openssl genrsa -out ca.key
- openssl genrsa -out ca.key 10240 {( p3 \2 o- ]1 b, X+ K3 A
(-des3选项可以加密生成的密钥, 但是Win32平台不支持加密密钥?启动Apache时会产生以下错误信息, “SSLPassPhraseDialog builtin is not supported on Win32″(当时不清楚我就加了-des3参数?且出现这个错误时apache启动不报错?查看日志才发现以上错误。))4 {- e7 s, {" d
(3) 产生 CA require cert?按提示填入相应的内容:4 ]2 I0 O( g1 n& n* u
- openssl req -config openssl.cnf -new -key ca.key -out ca.csr
* q1 h; W$ R2 b3 B. g" K/ t" N (4) 产生 CA public cert:
1 H! v1 f, X8 H& q; p- openssl x509 -days 3650 -req -signkey ca.key -in ca.csr -out ca.crt) d& _4 K. B6 W: _0 ?/ Q5 h, g
(5) 产生 Server private key:
/ {, e/ o [: C1 l) L. [- openSSL genrsa -out ssl/server.key 1024
5 Q$ M; K6 p0 ]& E (6) 产生 Server require cert?按提示填入和上边相同的内容:
2 A% O" G2 N$ Y5 P8 {: u) a' w- openssl req -config openssl.cnf -new -key server.key -out server.csr
3 Y7 a' P6 ~. N/ e6 {, M8 s (7) 产生 Server public key:- @7 ~9 u0 w* x
- openssl ca -config openssl.cnf -days 3650 -cert ca.crt -keyfile ca.key -in server.csr -out server.crt4 J6 p3 }* y( v+ ~4 ~1 W8 y
运行这个命令会出错?I am unable to access the ./demoCA/newcerts directory….. U) W% L+ G* A- k9 X" x
错误原因是没有手动创建一个CA目录结构' z" {7 ^3 ?/ R
- └─demoCA
- ├─newcerts
- ├─index.txt
- ├─serial/ X; b0 V! n. y' t+ A( Z; h
在demoCA中建立 index.txt 空文件, serial文件 , serial文件 中可输入01?此时再运行以上的命令即可生成server.crt。 将生成的 ca.crt、server.crt 和 server.key 放入apache的 conf 目录中* m; M8 R* q6 ~$ g
(8) 编辑apache的配置文件httpd.conf 去掉以下语句的注释, Include conf/extra/httpd-ssl.conf; p( p" C) C# A0 d e# v, L
- # Secure (SSL/TLS) connections
- Include conf/extra/httpd-ssl.conf
" d y4 X- ?; F7 l (9) 编辑 conf/extra/httpd-ssl.conf
0 K% @- n1 @8 d6 e1 R; K( a把SSLMutex标签的值改为default$ \" F% O# R. d
检查以下项目对应的文件的目录是否正确
2 a( \; H* Q; d1 U( U$ t- SSLCertificateFile "D:/web/Apache2.2/conf/server.crt"
- SSLCertificateKeyFile "D:/web/Apache2.2/conf/server.key"
- SSLCertificateChainFile "D:/web/Apache2.2/conf/ca.crt"
6 i/ F7 {9 L) v8 \) C0 Z0 F (上述内容需要按照服务安装的实际路径填写,除此之外,配置文件内的所有文件路径都需要确认是否与实际路径相符)2 I# }# c6 F. d {. N+ s% r1 a
成功搭建HTTPS:
% h1 E6 T6 ~: D2 b3 f) k6 B. u+ ^7 Y9 Y- L2 ]; T) l, a
HTTPS搭建完成 . n* @# V R \
S2 w3 q: V+ q. |( S4 t开发各场景的测试页面HTTP内嵌IFRAME HTTPS-
- HTTP iframe HTTPS
- 这是父页面
-
" ~+ g- P% \5 i5 o; j/ T9 ` HTTPS内嵌IFRAME HTTP-
- HTTPS iframe HTTP
-
- 这是父页面
-
- 1 x3 P" f8 p x/ X- Y
内嵌页面-
- Inner HTML
- 这是子页面
# ~& H6 e9 R+ v, @" [4 Z IFRAME内嵌统计结果 | HTTP内嵌HTTPS | HTTPS内嵌HTTP | HTTPS内嵌HTTPS | HTTP内嵌HTTP | Chrome | 正常(有证书) | 正常(有证书) | 正常(有证书) | 正常 | Firefox | 正常(有证书) | 正常(有证书) | 正常(有证书) | 正常 | IE 9.0 | 父页面展示正常,子页面含不安全警告(有证书) | 正常(有证书) | 正常(有证书) | 正常 | IE 8.0 | 父页面展示正常,子页面含不安全警告(有证书) | 正常(有证书) | 正常(有证书) | 正常 | IE 7.0 | 父页面展示正常,子页面含不安全警告(有证书) | 正常(有证书) | 正常(有证书) | 正常 | Opera | 正常(有证书) | 正常(有证书) | 正常(有证书) | 正常 | IE 9.0安全风险警告信息:
IE 9.0安全风险警告信息:
( v7 K, d. r& ^; H' @: G, r8 `+ PIE 8.0安全风险警告信息:
IE 8.0安全风险警告信息 , u" w$ Q! I% `, L- L% m
IE 7.0安全风险警告信息:
IE 7.0安全风险警告信息 " I( {( F2 o1 f4 H& c- s* ]
JS访问测试父页面- …
- <script type="mce-”text/javascript”">
- //
- window.display = function() {
- alert(“Parent window.display() called.”);
- }
- // ]]>
- …( l$ }9 P3 T* `. } r
' P4 s6 ? d7 L# X
子页面- …
- <script type="mce-”text/javascript”">
- //
- window.onload = function() {
- window.parent && window.parent.display();
- }
- // ]]>
- …* r$ U) H" P0 g1 }
9 r: y8 k# {% G' {0 m3 r JS访问测试统计结果 | HTTP(父) HTTPS(子) | HTTPS(父)HTTP(子) | HTTPS(父)HTTPS(子) | HTTP(父)HTTP(子) | Chrome | 控制台报错,限制调用 | 控制台报错,限制调用 | 正常调用 | 正常调用 | Firefox | 控制台报错,限制调用 | 控制台报错,限制调用 | 正常调用 | 正常调用 | IE 9.0 | 控制台报错,限制调用 | 控制台报错,限制调用 | 正常调用 | 正常调用 | IE 8.0 | 浏览器报错,限制调用 | 浏览器报错,限制调用 | 正常调用 | 正常调用 | IE 7.0 | 浏览器报错,限制调用 | 浏览器报错,限制调用 | 正常调用 | 正常调用 | Opera | 控制台报错,限制调用 | 控制台报错,限制调用 | 正常调用 | 正常调用 | IE 9.0 控制台报错信息:
IE 9.0 控制台报错信息
3 N( e1 _/ @2 f9 hIE 8.0 浏览器报错信息:
IE 8.0 浏览器报错信息 7 R! }( l& A9 P) K( d5 }' u! c
IE 7.0 浏览器报错信息:2 S1 u' B1 s; ]" e4 e* D
分析通过上面的测试,浏览器对于HTTPS和HTTP之间用iFrame嵌套并没过于限制,但存在编码问题。另一方面,基于安全考虑,浏览器有对HTTPS和HTTP之间的JavaScript调用有较严格的限制。7 L5 h& K# F7 b- }% m
4 R) ]# t4 u4 l9 O' R
: K( Y; ]/ l- v' A3 D |
|