TA的每日心情 | 奋斗 昨天 08:55 |
---|
签到天数: 2340 天 [LV.Master]伴坛终老
|
作者: 阿伦 日期: 2013 年 3 月 21 日分类: HTTP, Javascript标签: HTTP, HTTPS, IFrame, 安全
5 o$ a( T# p% C( i$ [& L5 v; I( n目的学习如何搭建HTTPS服务;# ]! d$ K" k) V' Q A3 T
为开发对安全性有较高要求的页面提供指导,避免不必要的安全漏洞;
/ R0 G0 D& u7 a+ ~. M步骤1.搭建本地HTTPS;
/ f* |" Q: _. f( a t+ T' d$ U: q$ J2.分别开发所有可能的嵌套场景:6 i4 Q9 v! |9 E; ~7 _, W7 [
- HTTP嵌套HTTPS
- HTTPS嵌套HTTP
- HTTPS嵌套HTTPS
- HTTP嵌套HTTP8 L- M* }$ _, v) Y8 X) Y
3.分别在现有主流浏览器的各个版本访问嵌套页面,记录浏览器相关提示及限制;" `. Z2 G3 t) M. N5 Z! ?
操作记录环境系统环境:Windows 7 64bit
0 w# J% x b+ _; S" J6 O) R& g+ H服务器:Apache
1 d( h) ~* s- T w# K) R数据库:MySQL& v* {8 v7 f$ @& g9 j
服务器语言:PHP
. J2 g6 Q- _, I5 n搭建本地HTTPS下载windows环境的OpenSSL( http://www.openssl.org/related/binaries.html ,由于本人机器使用的是64位系统,所以下载的是64位OpenSSL)
1 b' Q/ e( }0 A( z) D在Command中使用一下命令生成搭建HTTPS所需要的证书及相关文件:6 O h, _# u( P& |$ [% ~
(1) 复制apahce2/conf目录openssl.cnf 文件到bin目录
# ^3 M) x$ J* D2 d2 v" o" }. A7 E(2) 生成RSA密钥 (private key) 下面两个命令都可以生成密钥:
# I6 E! K% [* l# r- f- openssl genrsa -des3 -out ca.key
- openssl genrsa -out ca.key
- openssl genrsa -out ca.key 1024
4 C4 a3 }# x9 x6 I0 _- S (-des3选项可以加密生成的密钥, 但是Win32平台不支持加密密钥?启动Apache时会产生以下错误信息, “SSLPassPhraseDialog builtin is not supported on Win32″(当时不清楚我就加了-des3参数?且出现这个错误时apache启动不报错?查看日志才发现以上错误。))
$ k4 m6 \; R \: V(3) 产生 CA require cert?按提示填入相应的内容:
) T+ f0 L! a/ x. {& u- openssl req -config openssl.cnf -new -key ca.key -out ca.csr
/ a( n! }5 R- ? (4) 产生 CA public cert:
# x% t* C8 R0 u* P- openssl x509 -days 3650 -req -signkey ca.key -in ca.csr -out ca.crt1 u4 [1 U, |1 _, {
(5) 产生 Server private key:
8 h. {' h$ O% m' B- openSSL genrsa -out ssl/server.key 1024+ d$ `) T7 L" \8 P8 L
(6) 产生 Server require cert?按提示填入和上边相同的内容:
$ s5 j+ B2 x! b3 d5 e1 K- openssl req -config openssl.cnf -new -key server.key -out server.csr6 l: F" J9 Z$ T" Z: @' A
(7) 产生 Server public key:" k' B0 @5 f# l& `" |8 z
- openssl ca -config openssl.cnf -days 3650 -cert ca.crt -keyfile ca.key -in server.csr -out server.crt# C' S8 ?' d' E+ u4 A4 q+ G; z1 f# Y
运行这个命令会出错?I am unable to access the ./demoCA/newcerts directory….
% i9 \+ H5 h+ V; `3 e错误原因是没有手动创建一个CA目录结构* F8 J f4 R9 I
- └─demoCA
- ├─newcerts
- ├─index.txt
- ├─serial% ?' y' j3 g: @: q7 N9 |9 d
在demoCA中建立 index.txt 空文件, serial文件 , serial文件 中可输入01?此时再运行以上的命令即可生成server.crt。 将生成的 ca.crt、server.crt 和 server.key 放入apache的 conf 目录中 ?6 h5 d4 Z, Q H
(8) 编辑apache的配置文件httpd.conf 去掉以下语句的注释, Include conf/extra/httpd-ssl.conf
% e6 c; b2 G9 X3 ?# K- # Secure (SSL/TLS) connections
- Include conf/extra/httpd-ssl.conf
& X4 S" [5 p: j% {' B }0 i (9) 编辑 conf/extra/httpd-ssl.conf
" U5 g) m0 x9 ^) ]% n$ ~" w( w2 K把SSLMutex标签的值改为default9 R) ?" ~$ f! a' ]/ z
检查以下项目对应的文件的目录是否正确& [/ B) [% g0 N" E5 C
- SSLCertificateFile "D:/web/Apache2.2/conf/server.crt"
- SSLCertificateKeyFile "D:/web/Apache2.2/conf/server.key"
- SSLCertificateChainFile "D:/web/Apache2.2/conf/ca.crt"
2 w: p3 O& ]: {) p) t (上述内容需要按照服务安装的实际路径填写,除此之外,配置文件内的所有文件路径都需要确认是否与实际路径相符)- w2 |2 X* Z- ]- n9 k0 T8 [3 E
成功搭建HTTPS:
1 j/ t& J( |- t0 w4 f: g6 R0 N0 y3 C+ u$ j$ B
HTTPS搭建完成 + k# q4 K) X7 _* F7 R
; ?8 f; E# \7 |7 V开发各场景的测试页面HTTP内嵌IFRAME HTTPS-
- HTTP iframe HTTPS
- 这是父页面
-
" C9 [: q9 [# l HTTPS内嵌IFRAME HTTP-
- HTTPS iframe HTTP
-
- 这是父页面
-
- $ [2 {9 P- R0 p+ M3 [6 ^/ _; i% o
内嵌页面-
- Inner HTML
- 这是子页面
- % q) ~$ f7 L9 C3 B5 J% ^
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) Y! N: t: }! ]
IE 8.0安全风险警告信息:
IE 8.0安全风险警告信息
! B* }3 ~" p1 K: ]/ |IE 7.0安全风险警告信息:
IE 7.0安全风险警告信息 ! [+ D6 R- g; W( G3 F
JS访问测试父页面- …
- <script type="mce-”text/javascript”">
- //
- window.display = function() {
- alert(“Parent window.display() called.”);
- }
- // ]]>
- …% N# \" @6 c; P
+ i. C1 N1 r% o% i. y. N
子页面- …
- <script type="mce-”text/javascript”">
- //
- window.onload = function() {
- window.parent && window.parent.display();
- }
- // ]]>
- …4 |5 Z; k/ y) G/ D% v
v, L* w* \# M, P) f 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 控制台报错信息 , C: Z. B% M* }. B6 p. \
IE 8.0 浏览器报错信息:
IE 8.0 浏览器报错信息 $ ?$ K: F; T& i* r! P
IE 7.0 浏览器报错信息:
# H) b4 E" ~3 R' d: |分析通过上面的测试,浏览器对于HTTPS和HTTP之间用iFrame嵌套并没过于限制,但存在编码问题。另一方面,基于安全考虑,浏览器有对HTTPS和HTTP之间的JavaScript调用有较严格的限制。
+ J; f5 \( M) @' [, |& Z* {# e. A* f/ @- Z# i2 O5 V2 x6 C4 `
0 H* N6 J! T, C- \* Z- K9 p$ i |
|