TA的每日心情 | 奋斗 3 天前 |
---|
签到天数: 2383 天 [LV.Master]伴坛终老
|
作者: 阿伦 日期: 2013 年 3 月 21 日分类: HTTP, Javascript标签: HTTP, HTTPS, IFrame, 安全( o4 J$ P3 v4 E" [) C
目的学习如何搭建HTTPS服务;' R% R/ e6 M& q" ?% ^3 r* c) a; R/ a
为开发对安全性有较高要求的页面提供指导,避免不必要的安全漏洞;$ T- L! j1 W5 K6 ]+ D! r; y
步骤1.搭建本地HTTPS; L- o3 d; u* t2 u
2.分别开发所有可能的嵌套场景:
+ R o: |/ }, B; a/ s0 c- HTTP嵌套HTTPS
- HTTPS嵌套HTTP
- HTTPS嵌套HTTPS
- HTTP嵌套HTTP% n+ v4 w1 e6 g- }
3.分别在现有主流浏览器的各个版本访问嵌套页面,记录浏览器相关提示及限制;) N8 G% J5 J, `: U
操作记录环境系统环境:Windows 7 64bit
/ | E k# v7 f5 J服务器:Apache: n) A6 R" U% U) o/ d) ^+ M
数据库:MySQL
c) ?* N5 q9 V& f6 a I! j服务器语言:PHP
! h. b, x; l8 N# a搭建本地HTTPS下载windows环境的OpenSSL( http://www.openssl.org/related/binaries.html ,由于本人机器使用的是64位系统,所以下载的是64位OpenSSL)
8 P/ p" E f" ]5 Y; [6 H X在Command中使用一下命令生成搭建HTTPS所需要的证书及相关文件:
" ` u9 y7 }5 b3 O% w0 _7 z- Z(1) 复制apahce2/conf目录openssl.cnf 文件到bin目录. [: v% R% T! \2 D' E
(2) 生成RSA密钥 (private key) 下面两个命令都可以生成密钥:
( j# h. {4 b- ?+ s. z l- openssl genrsa -des3 -out ca.key
- openssl genrsa -out ca.key
- openssl genrsa -out ca.key 1024
9 x( O: W: H C; Q q9 ? (-des3选项可以加密生成的密钥, 但是Win32平台不支持加密密钥?启动Apache时会产生以下错误信息, “SSLPassPhraseDialog builtin is not supported on Win32″(当时不清楚我就加了-des3参数?且出现这个错误时apache启动不报错?查看日志才发现以上错误。))' R$ W' m; Y$ |5 U7 b
(3) 产生 CA require cert?按提示填入相应的内容:5 {* U4 S/ `& m% t5 _- B4 w
- openssl req -config openssl.cnf -new -key ca.key -out ca.csr8 B- f( g/ Z& [: ~/ h& ^1 D! b
(4) 产生 CA public cert:0 U3 o, L4 y, u2 S( K+ y8 X
- openssl x509 -days 3650 -req -signkey ca.key -in ca.csr -out ca.crt& ?; j( a. q) M- Q4 d" C
(5) 产生 Server private key: N9 k) S. x* l) A# b# k7 v
- openSSL genrsa -out ssl/server.key 1024( y1 H6 ^$ y r, m, g4 d
(6) 产生 Server require cert?按提示填入和上边相同的内容:! f" d- T7 J$ z9 b
- openssl req -config openssl.cnf -new -key server.key -out server.csr8 f" h3 N: h& I- k2 o+ J
(7) 产生 Server public key:
! I! W# P, b3 ?: A1 _" @% G- openssl ca -config openssl.cnf -days 3650 -cert ca.crt -keyfile ca.key -in server.csr -out server.crt
5 n$ B8 E3 D, L4 _1 ]# ^ 运行这个命令会出错?I am unable to access the ./demoCA/newcerts directory….
- Y; _% S: T; @; Q' y3 y错误原因是没有手动创建一个CA目录结构) c& u. k( }' b8 v
- └─demoCA
- ├─newcerts
- ├─index.txt
- ├─serial
9 e! C9 i5 `& C' K R F5 T# ] 在demoCA中建立 index.txt 空文件, serial文件 , serial文件 中可输入01?此时再运行以上的命令即可生成server.crt。 将生成的 ca.crt、server.crt 和 server.key 放入apache的 conf 目录中
. V n+ z5 M. d(8) 编辑apache的配置文件httpd.conf 去掉以下语句的注释, Include conf/extra/httpd-ssl.conf
% Z4 W5 q, _/ f9 T' q& K- # Secure (SSL/TLS) connections
- Include conf/extra/httpd-ssl.conf
2 u& C, r% }/ s. b; e (9) 编辑 conf/extra/httpd-ssl.conf9 ?* u; O0 C/ M" {1 z3 V. q
把SSLMutex标签的值改为default
5 V, D6 C9 D6 b4 e3 N4 Y检查以下项目对应的文件的目录是否正确2 G- O0 @; o9 q: Q
- SSLCertificateFile "D:/web/Apache2.2/conf/server.crt"
- SSLCertificateKeyFile "D:/web/Apache2.2/conf/server.key"
- SSLCertificateChainFile "D:/web/Apache2.2/conf/ca.crt", Z% P7 m& t4 `6 K+ z0 O
(上述内容需要按照服务安装的实际路径填写,除此之外,配置文件内的所有文件路径都需要确认是否与实际路径相符)2 [% p3 p* d; n: n+ V, b, M
成功搭建HTTPS:( ^+ A2 ^3 y# R* k9 V2 s8 Y- S% @
+ U) j$ @5 ~0 {, o3 r3 v6 P/ s1 K6 M
HTTPS搭建完成 * w" V7 K2 U6 S Q
* @) [ d1 I" m: a' C开发各场景的测试页面HTTP内嵌IFRAME HTTPS-
- HTTP iframe HTTPS
- 这是父页面
-
- ) t8 Y R" S6 R9 J, ]
HTTPS内嵌IFRAME HTTP-
- HTTPS iframe HTTP
-
- 这是父页面
-
$ h, k( E2 i1 v2 Z9 d, s4 { 内嵌页面-
- Inner HTML
- 这是子页面
- 1 [" }' W, c9 B& ?
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安全风险警告信息:
! \+ U" `1 O, P8 O+ ?IE 8.0安全风险警告信息:
IE 8.0安全风险警告信息
5 L7 H# T' c6 f# R% W! ^IE 7.0安全风险警告信息:
IE 7.0安全风险警告信息 + ^% H: c; F7 @0 r3 G6 z
JS访问测试父页面- …
- <script type="mce-”text/javascript”">
- //
- window.display = function() {
- alert(“Parent window.display() called.”);
- }
- // ]]>
- …
0 j$ Z* ?' m. D2 W$ J4 z
& z4 A! w M' ~( ~6 w/ c q# X 子页面- …
- <script type="mce-”text/javascript”">
- //
- window.onload = function() {
- window.parent && window.parent.display();
- }
- // ]]>
- …
, u# x1 ]0 l8 C1 _6 |5 P) a2 @. \# h r, P, t& B# G4 l6 c
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 控制台报错信息
2 z2 y. p) l& ^& yIE 8.0 浏览器报错信息:
IE 8.0 浏览器报错信息 6 A$ S' i3 ?. U8 \5 t, {
IE 7.0 浏览器报错信息:* m# a7 y7 v& s& W2 m1 s
分析通过上面的测试,浏览器对于HTTPS和HTTP之间用iFrame嵌套并没过于限制,但存在编码问题。另一方面,基于安全考虑,浏览器有对HTTPS和HTTP之间的JavaScript调用有较严格的限制。
7 _; B; q2 M6 Y, Z/ r3 C% O- a/ B' J+ X" Q3 J
k0 w. M& J }) \ |
|