TA的每日心情 | 奋斗 4 天前 |
---|
签到天数: 2370 天 [LV.Master]伴坛终老
|
作者: 阿伦 日期: 2013 年 3 月 21 日分类: HTTP, Javascript标签: HTTP, HTTPS, IFrame, 安全# ?; z6 W) Q3 i1 A& R2 H
目的学习如何搭建HTTPS服务;; A1 ]) y- N# T2 i/ I
为开发对安全性有较高要求的页面提供指导,避免不必要的安全漏洞;
% Y: A2 \2 u- o6 s步骤1.搭建本地HTTPS;
# k N4 J; @3 ?# X/ T. s2.分别开发所有可能的嵌套场景:
* W- s7 D& Z: n, I5 n5 T4 T; ]- HTTP嵌套HTTPS
- HTTPS嵌套HTTP
- HTTPS嵌套HTTPS
- HTTP嵌套HTTP0 w; t3 k1 ~( B+ r
3.分别在现有主流浏览器的各个版本访问嵌套页面,记录浏览器相关提示及限制;- d4 t8 f l/ N# j
操作记录环境系统环境:Windows 7 64bit
' N0 N% `) {3 n; i服务器:Apache
2 \3 P3 Z( R0 ]' Q" t0 i数据库:MySQL
9 L( d3 R$ H: a2 [2 ^; t服务器语言:PHP: i! m7 V# c8 [
搭建本地HTTPS下载windows环境的OpenSSL( http://www.openssl.org/related/binaries.html ,由于本人机器使用的是64位系统,所以下载的是64位OpenSSL)2 ?6 F( X. v# c- J
在Command中使用一下命令生成搭建HTTPS所需要的证书及相关文件:
8 W' b( W5 Z0 E(1) 复制apahce2/conf目录openssl.cnf 文件到bin目录
9 q6 N" I: V0 |(2) 生成RSA密钥 (private key) 下面两个命令都可以生成密钥:
6 ^4 \' e5 u: h8 E7 e% x0 i9 F- openssl genrsa -des3 -out ca.key
- openssl genrsa -out ca.key
- openssl genrsa -out ca.key 1024
, @9 T3 }. e/ Y9 m& k; ] (-des3选项可以加密生成的密钥, 但是Win32平台不支持加密密钥?启动Apache时会产生以下错误信息, “SSLPassPhraseDialog builtin is not supported on Win32″(当时不清楚我就加了-des3参数?且出现这个错误时apache启动不报错?查看日志才发现以上错误。))/ v. p1 b M0 f+ C {. _4 S1 T
(3) 产生 CA require cert?按提示填入相应的内容:6 S) }# R6 e# ^( V% j
- openssl req -config openssl.cnf -new -key ca.key -out ca.csr
; a6 `/ X7 U9 h" y* ? (4) 产生 CA public cert:( N6 e+ r! p4 D. C( ~2 j; q0 [ K
- openssl x509 -days 3650 -req -signkey ca.key -in ca.csr -out ca.crt
/ a+ W6 m) G `, [0 Y (5) 产生 Server private key:
h; e6 C9 Z- g9 K( R0 s+ J- openSSL genrsa -out ssl/server.key 1024# F; H( u# d5 a4 K& G/ S
(6) 产生 Server require cert?按提示填入和上边相同的内容:
% @8 _( F. m3 p' C: ]- openssl req -config openssl.cnf -new -key server.key -out server.csr
( R* w M( m" D7 R; b0 k (7) 产生 Server public key:. S) n: O% h' G; k1 e& d% l/ X0 Y
- openssl ca -config openssl.cnf -days 3650 -cert ca.crt -keyfile ca.key -in server.csr -out server.crt& }, d0 X6 g! F' h# H3 o6 H
运行这个命令会出错?I am unable to access the ./demoCA/newcerts directory….0 c# [) N2 l. U* Q
错误原因是没有手动创建一个CA目录结构
% k- R; w7 `, P7 B5 o6 `- └─demoCA
- ├─newcerts
- ├─index.txt
- ├─serial
# L) ~8 C6 N( m- p 在demoCA中建立 index.txt 空文件, serial文件 , serial文件 中可输入01?此时再运行以上的命令即可生成server.crt。 将生成的 ca.crt、server.crt 和 server.key 放入apache的 conf 目录中3 k6 |& q3 D# Z1 P0 ]
(8) 编辑apache的配置文件httpd.conf 去掉以下语句的注释, Include conf/extra/httpd-ssl.conf
" d( A5 x( ^& M. W9 a! k4 C- # Secure (SSL/TLS) connections
- Include conf/extra/httpd-ssl.conf
* ^" n$ m" H+ _4 G (9) 编辑 conf/extra/httpd-ssl.conf
! z4 {% a5 n: U; g( {( c# s把SSLMutex标签的值改为default& ^- T* Z& X ]* C, `4 `) f
检查以下项目对应的文件的目录是否正确& N4 G+ |: o2 J; A+ D
- SSLCertificateFile "D:/web/Apache2.2/conf/server.crt"
- SSLCertificateKeyFile "D:/web/Apache2.2/conf/server.key"
- SSLCertificateChainFile "D:/web/Apache2.2/conf/ca.crt"4 i5 f! q' \0 q" W9 y& O% A
(上述内容需要按照服务安装的实际路径填写,除此之外,配置文件内的所有文件路径都需要确认是否与实际路径相符)
+ V8 p) ] C" l成功搭建HTTPS:
% Q! d( _" u/ C7 l; }0 D7 p* v& ^# x) Q/ E" D5 s# }# X- E, F
HTTPS搭建完成
1 H/ I$ T9 }. Z. v4 N) q, `7 H* a, a
开发各场景的测试页面HTTP内嵌IFRAME HTTPS-
- HTTP iframe HTTPS
- 这是父页面
-
& F2 O/ A- D8 P3 Q HTTPS内嵌IFRAME HTTP-
- HTTPS iframe HTTP
-
- 这是父页面
-
- 6 v, h E" I; m
内嵌页面-
- Inner HTML
- 这是子页面
- 4 X; m9 U& ]: K2 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安全风险警告信息:
. _: S1 m; _& @2 AIE 8.0安全风险警告信息:
IE 8.0安全风险警告信息
3 Q3 t: ^4 W/ y5 U5 K5 wIE 7.0安全风险警告信息:
IE 7.0安全风险警告信息
4 t0 f+ a' X- Z8 T# iJS访问测试父页面- …
- <script type="mce-”text/javascript”">
- //
- window.display = function() {
- alert(“Parent window.display() called.”);
- }
- // ]]>
- …
# H1 t# Q7 Z: v4 l
; V' W7 b& M3 A# h; g) A( [ 子页面- …
- <script type="mce-”text/javascript”">
- //
- window.onload = function() {
- window.parent && window.parent.display();
- }
- // ]]>
- …; z# S: n, m- ?+ x. H8 [
t/ W+ S: M* t/ e: i5 e3 P1 G 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 控制台报错信息 + k+ Z0 z, Q- N4 D$ m/ n( J6 R0 Q
IE 8.0 浏览器报错信息:
IE 8.0 浏览器报错信息 2 |9 C" P5 U7 C
IE 7.0 浏览器报错信息:
; D( n. D# I( R, q# H6 q. ]分析通过上面的测试,浏览器对于HTTPS和HTTP之间用iFrame嵌套并没过于限制,但存在编码问题。另一方面,基于安全考虑,浏览器有对HTTPS和HTTP之间的JavaScript调用有较严格的限制。
0 b3 F4 v1 f+ x# D* H- B
* i. W- z4 c( i4 x4 R: D& y. W' W6 H0 `3 \ G
|
|