TA的每日心情 | 怒 5 天前 |
---|
签到天数: 2261 天 [LV.Master]伴坛终老
|
作者: 阿伦 日期: 2013 年 3 月 21 日分类: HTTP, Javascript标签: HTTP, HTTPS, IFrame, 安全" C& p# m; j6 l
目的学习如何搭建HTTPS服务;
- s: @" k5 g5 [8 }; u: p' @为开发对安全性有较高要求的页面提供指导,避免不必要的安全漏洞;
! S$ B( E5 P9 I7 L% {" F8 e步骤1.搭建本地HTTPS;7 T u# o! ^4 K$ X; `) }& l
2.分别开发所有可能的嵌套场景:: u' p. r$ t0 K0 s6 X3 o
- HTTP嵌套HTTPS
- HTTPS嵌套HTTP
- HTTPS嵌套HTTPS
- HTTP嵌套HTTP- ~ b# `3 Z% A5 n8 n' Y+ @
3.分别在现有主流浏览器的各个版本访问嵌套页面,记录浏览器相关提示及限制;( Z( i+ S, k2 m+ w6 o& B
操作记录环境系统环境:Windows 7 64bit
; k2 t" Z _8 r( C服务器:Apache
! n5 |, M4 i0 f8 p数据库:MySQL3 _/ r5 k# M- q o
服务器语言:PHP
3 G' G" o: d4 P# b1 ~6 g搭建本地HTTPS下载windows环境的OpenSSL( http://www.openssl.org/related/binaries.html ,由于本人机器使用的是64位系统,所以下载的是64位OpenSSL)
# o2 r; O! K' a在Command中使用一下命令生成搭建HTTPS所需要的证书及相关文件:+ }+ F) Z* L! P+ o$ P" }3 G6 s
(1) 复制apahce2/conf目录openssl.cnf 文件到bin目录
0 p, V3 n. {2 p$ W w! U(2) 生成RSA密钥 (private key) 下面两个命令都可以生成密钥:7 p2 v. }9 r- U$ q. f0 f
- openssl genrsa -des3 -out ca.key
- openssl genrsa -out ca.key
- openssl genrsa -out ca.key 1024 M: O: U) h \
(-des3选项可以加密生成的密钥, 但是Win32平台不支持加密密钥?启动Apache时会产生以下错误信息, “SSLPassPhraseDialog builtin is not supported on Win32″(当时不清楚我就加了-des3参数?且出现这个错误时apache启动不报错?查看日志才发现以上错误。))
0 O. e& ]' o8 X' u, U(3) 产生 CA require cert?按提示填入相应的内容:
. Y. X* F8 Z+ t, P! |9 c- openssl req -config openssl.cnf -new -key ca.key -out ca.csr1 H4 ]% B. G$ c
(4) 产生 CA public cert:
1 z/ t) @; w. U8 x/ ]. F- openssl x509 -days 3650 -req -signkey ca.key -in ca.csr -out ca.crt
; ^5 i! d' V+ a. R! Z5 d (5) 产生 Server private key:. W1 o, ?- ]. J' j
- openSSL genrsa -out ssl/server.key 10242 ?% a6 l' C1 j4 i+ X$ A
(6) 产生 Server require cert?按提示填入和上边相同的内容:
) Z7 h* H4 m! N, [3 F- openssl req -config openssl.cnf -new -key server.key -out server.csr6 i. M1 _ V9 z \# K4 x, b
(7) 产生 Server public key:& F% z2 p4 b( k2 M
- openssl ca -config openssl.cnf -days 3650 -cert ca.crt -keyfile ca.key -in server.csr -out server.crt
* Y% V) v8 k) @9 m: |8 Z 运行这个命令会出错?I am unable to access the ./demoCA/newcerts directory….
- a0 B5 r4 P# _" q' C错误原因是没有手动创建一个CA目录结构
9 H% @1 o; M' T6 N) r, S/ n- └─demoCA
- ├─newcerts
- ├─index.txt
- ├─serial
% o+ O2 \) Q6 [6 A 在demoCA中建立 index.txt 空文件, serial文件 , serial文件 中可输入01?此时再运行以上的命令即可生成server.crt。 将生成的 ca.crt、server.crt 和 server.key 放入apache的 conf 目录中
( u) K1 g2 I4 ]; J0 N. e- o! U(8) 编辑apache的配置文件httpd.conf 去掉以下语句的注释, Include conf/extra/httpd-ssl.conf* A" _3 \4 t% _7 c' a1 r
- # Secure (SSL/TLS) connections
- Include conf/extra/httpd-ssl.conf
* m/ a+ m0 q$ k: y3 n0 c8 _0 j" n (9) 编辑 conf/extra/httpd-ssl.conf
+ S b0 c! L4 _4 x把SSLMutex标签的值改为default
9 [, X2 Y4 f+ I检查以下项目对应的文件的目录是否正确. s7 \, J3 B Z5 P9 e
- SSLCertificateFile "D:/web/Apache2.2/conf/server.crt"
- SSLCertificateKeyFile "D:/web/Apache2.2/conf/server.key"
- SSLCertificateChainFile "D:/web/Apache2.2/conf/ca.crt"8 |7 I, d4 R' Y. r, S- ]
(上述内容需要按照服务安装的实际路径填写,除此之外,配置文件内的所有文件路径都需要确认是否与实际路径相符)) w( W- `5 ^+ U
成功搭建HTTPS:
. s) w" e0 s( J
) ~0 Z7 G5 t- E
HTTPS搭建完成
' e) f( _: | I0 R$ y4 X4 ?. G/ d1 v, e0 Z* _$ l2 U
开发各场景的测试页面HTTP内嵌IFRAME HTTPS-
- HTTP iframe HTTPS
- 这是父页面
-
- , E) [$ `, F0 R
HTTPS内嵌IFRAME HTTP-
- HTTPS iframe HTTP
-
- 这是父页面
-
- 9 O1 w+ @* O1 a& k- r
内嵌页面-
- Inner HTML
- 这是子页面
- & j# m+ z: g2 o# [! @
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安全风险警告信息:
% [! j) U7 l, P4 v% |/ `/ QIE 8.0安全风险警告信息:
IE 8.0安全风险警告信息
/ Z2 F' O6 g; O' {: q9 IIE 7.0安全风险警告信息:
IE 7.0安全风险警告信息
. f8 b2 q; e1 Z' KJS访问测试父页面- …
- <script type="mce-”text/javascript”">
- //
- window.display = function() {
- alert(“Parent window.display() called.”);
- }
- // ]]>
- …
+ n, x" N* K& v& V9 c0 t5 k3 A% a+ b* M6 x i% H+ h4 M
子页面- …
- <script type="mce-”text/javascript”">
- //
- window.onload = function() {
- window.parent && window.parent.display();
- }
- // ]]>
- …
( T: a: \/ J. G6 a, w4 k
- X2 Q6 d$ S/ Z/ t 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 控制台报错信息
0 C) \7 r4 m; M1 w/ q/ EIE 8.0 浏览器报错信息:
IE 8.0 浏览器报错信息
- \. k) r" ~0 B* y, XIE 7.0 浏览器报错信息:
( n- f0 d( E3 `+ A; o/ L分析通过上面的测试,浏览器对于HTTPS和HTTP之间用iFrame嵌套并没过于限制,但存在编码问题。另一方面,基于安全考虑,浏览器有对HTTPS和HTTP之间的JavaScript调用有较严格的限制。" C: w2 U3 ^& W- d" p. ~& i
& x/ M } m1 n0 R+ B
6 w5 U, g9 M0 C4 p6 Q9 B1 k |
|