TA的每日心情 | 擦汗 前天 08:38 |
---|
签到天数: 2382 天 [LV.Master]伴坛终老
|
作者: 阿伦 日期: 2013 年 3 月 21 日分类: HTTP, Javascript标签: HTTP, HTTPS, IFrame, 安全
! C1 ^% Y; n5 _; D, N5 R, G目的学习如何搭建HTTPS服务;
! P2 L& f9 c3 Y6 I, x3 P( K为开发对安全性有较高要求的页面提供指导,避免不必要的安全漏洞;
/ h- t$ q0 ^5 d+ q2 `9 {6 l- Z' L# _步骤1.搭建本地HTTPS;3 c& H; Z* i5 h% ?
2.分别开发所有可能的嵌套场景:+ e9 X+ H# Q+ |3 h# o5 q
- HTTP嵌套HTTPS
- HTTPS嵌套HTTP
- HTTPS嵌套HTTPS
- HTTP嵌套HTTP
2 g" ^" ?: h3 C: K3 b# x3 O. N; L 3.分别在现有主流浏览器的各个版本访问嵌套页面,记录浏览器相关提示及限制;
* d! n' n8 ~* _. f. l' |操作记录环境系统环境:Windows 7 64bit7 `& W0 L' a+ W
服务器:Apache9 S0 O' r2 \# f4 Q5 l
数据库:MySQL
3 d- A7 ^4 N2 |3 V& v: \) [% j" a) q服务器语言:PHP. O' w2 b) }- _/ P6 }2 V- K( U+ `
搭建本地HTTPS下载windows环境的OpenSSL( http://www.openssl.org/related/binaries.html ,由于本人机器使用的是64位系统,所以下载的是64位OpenSSL)
: H% f6 l$ u& }1 `7 F1 x在Command中使用一下命令生成搭建HTTPS所需要的证书及相关文件:: C$ K! X) i1 g" t
(1) 复制apahce2/conf目录openssl.cnf 文件到bin目录
% s6 S3 I) B( y0 f6 w0 A(2) 生成RSA密钥 (private key) 下面两个命令都可以生成密钥: R8 S. t/ \% |
- openssl genrsa -des3 -out ca.key
- openssl genrsa -out ca.key
- openssl genrsa -out ca.key 1024
. K6 f- t; ]& ^# f7 Y( n (-des3选项可以加密生成的密钥, 但是Win32平台不支持加密密钥?启动Apache时会产生以下错误信息, “SSLPassPhraseDialog builtin is not supported on Win32″(当时不清楚我就加了-des3参数?且出现这个错误时apache启动不报错?查看日志才发现以上错误。))
* s, ^0 A+ n' e% S n8 Y(3) 产生 CA require cert?按提示填入相应的内容:
1 e& S! _5 v a% a- openssl req -config openssl.cnf -new -key ca.key -out ca.csr! S8 ^: `: r! a% Y( ] J
(4) 产生 CA public cert:" _6 Y8 g4 H% a1 ^
- openssl x509 -days 3650 -req -signkey ca.key -in ca.csr -out ca.crt! u) Y6 g' P# z9 t0 m, ~4 X9 @
(5) 产生 Server private key:
^/ b) L- f* z0 A t q! D) N- openSSL genrsa -out ssl/server.key 1024
5 Q4 |' P0 H' x (6) 产生 Server require cert?按提示填入和上边相同的内容:
; K; X( X: q1 J- openssl req -config openssl.cnf -new -key server.key -out server.csr- q( D6 G" i9 \# {6 ]$ c
(7) 产生 Server public key:9 Y; v6 U) i: e) d% |. E! u
- openssl ca -config openssl.cnf -days 3650 -cert ca.crt -keyfile ca.key -in server.csr -out server.crt
( ]5 K8 ?( Z7 y" @; d 运行这个命令会出错?I am unable to access the ./demoCA/newcerts directory….. ]1 C1 Y; _: w: j' W
错误原因是没有手动创建一个CA目录结构! \% G4 F6 g2 @9 @7 ?3 Y
- └─demoCA
- ├─newcerts
- ├─index.txt
- ├─serial5 O% w1 e- m2 z( _
在demoCA中建立 index.txt 空文件, serial文件 , serial文件 中可输入01?此时再运行以上的命令即可生成server.crt。 将生成的 ca.crt、server.crt 和 server.key 放入apache的 conf 目录中( _1 I* y9 J) o* ~6 i: M
(8) 编辑apache的配置文件httpd.conf 去掉以下语句的注释, Include conf/extra/httpd-ssl.conf' P4 g/ ]2 D" F4 k& X* K& e
- # Secure (SSL/TLS) connections
- Include conf/extra/httpd-ssl.conf
4 H/ Q+ f5 Y' N0 E$ X% V; ` (9) 编辑 conf/extra/httpd-ssl.conf
2 W6 p8 e" [; s! J把SSLMutex标签的值改为default
5 L' O9 R3 V. w1 C: o检查以下项目对应的文件的目录是否正确$ F6 v( e8 C/ u) a4 x
- SSLCertificateFile "D:/web/Apache2.2/conf/server.crt"
- SSLCertificateKeyFile "D:/web/Apache2.2/conf/server.key"
- SSLCertificateChainFile "D:/web/Apache2.2/conf/ca.crt"! h- s) ^* U$ Q0 }
(上述内容需要按照服务安装的实际路径填写,除此之外,配置文件内的所有文件路径都需要确认是否与实际路径相符)1 L4 x) n4 a7 O' j9 S6 M0 x
成功搭建HTTPS:/ t; ?1 n( j0 O, E) G
$ @ b! _4 j2 Y. n! s7 f+ \
HTTPS搭建完成
( l2 G" R3 W# J( P0 u5 |! @" G- I4 D
开发各场景的测试页面HTTP内嵌IFRAME HTTPS-
- HTTP iframe HTTPS
- 这是父页面
-
3 e2 h: I9 C. I$ O# \( ^ HTTPS内嵌IFRAME HTTP-
- HTTPS iframe HTTP
-
- 这是父页面
-
( L/ r, h! u4 E" n6 D2 { 内嵌页面-
- Inner HTML
- 这是子页面
& M( I* c: B2 g" {- y 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安全风险警告信息:
+ U3 _0 q b% O% }1 L+ ~/ l/ \IE 8.0安全风险警告信息:
IE 8.0安全风险警告信息 ; G/ @) {% y0 B# U2 o! d' H6 J
IE 7.0安全风险警告信息:
IE 7.0安全风险警告信息 ' U5 ^6 j% [9 f& M) K3 P! m
JS访问测试父页面- …
- <script type="mce-”text/javascript”">
- //
- window.display = function() {
- alert(“Parent window.display() called.”);
- }
- // ]]>
- …
+ L/ I' A& S3 G. R
- i/ f; S$ W! W8 o 子页面- …
- <script type="mce-”text/javascript”">
- //
- window.onload = function() {
- window.parent && window.parent.display();
- }
- // ]]>
- …
$ ^3 w. H1 @0 P# Y. s$ ~9 N# q1 f$ v9 [
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 控制台报错信息 . t3 B6 F% ?6 c' l8 |) R7 u
IE 8.0 浏览器报错信息:
IE 8.0 浏览器报错信息 # K; x3 E$ P# B6 v: A; s
IE 7.0 浏览器报错信息:
6 a: H O, I( c: ^分析通过上面的测试,浏览器对于HTTPS和HTTP之间用iFrame嵌套并没过于限制,但存在编码问题。另一方面,基于安全考虑,浏览器有对HTTPS和HTTP之间的JavaScript调用有较严格的限制。# Q2 z# u; \5 x4 I
$ @ _0 \ M0 R* v# V9 M* f. b) Q5 q0 A) t$ N9 |- e0 l' p
|
|