TA的每日心情 | 擦汗 4 天前 |
---|
签到天数: 2402 天 [LV.Master]伴坛终老
|
作者: 阿伦 日期: 2013 年 3 月 21 日分类: HTTP, Javascript标签: HTTP, HTTPS, IFrame, 安全& t! `2 U, y8 `# U) x7 E' B
目的学习如何搭建HTTPS服务;- y6 {; ~' ~9 u0 O/ {3 Y9 ]; O
为开发对安全性有较高要求的页面提供指导,避免不必要的安全漏洞;
- P. i) i4 d+ A步骤1.搭建本地HTTPS;. N+ l6 w' v( [
2.分别开发所有可能的嵌套场景:
" K5 V$ R7 V0 L8 J5 O- HTTP嵌套HTTPS
- HTTPS嵌套HTTP
- HTTPS嵌套HTTPS
- HTTP嵌套HTTP
' q+ w0 q& ?. y- ]+ S 3.分别在现有主流浏览器的各个版本访问嵌套页面,记录浏览器相关提示及限制;. C9 w% w7 u& _ t R( \
操作记录环境系统环境:Windows 7 64bit6 c A6 f. `2 E7 i3 r( J. k
服务器:Apache
+ o- M: M) I- \8 u8 G7 V) O数据库:MySQL
: T9 L/ ?2 ~2 ` I; r* q服务器语言:PHP
" D$ g+ X8 ?7 v7 o, G搭建本地HTTPS下载windows环境的OpenSSL( http://www.openssl.org/related/binaries.html ,由于本人机器使用的是64位系统,所以下载的是64位OpenSSL)% D- Z- B- |1 S4 m9 f, Z
在Command中使用一下命令生成搭建HTTPS所需要的证书及相关文件:
# O9 X% H3 n; P; i3 L, b! \3 R(1) 复制apahce2/conf目录openssl.cnf 文件到bin目录, ]+ X4 M( p, `& ~+ q
(2) 生成RSA密钥 (private key) 下面两个命令都可以生成密钥:
; t% I5 O* ~8 q7 R R- openssl genrsa -des3 -out ca.key
- openssl genrsa -out ca.key
- openssl genrsa -out ca.key 10246 [9 k+ X8 i/ w& ^2 M3 q
(-des3选项可以加密生成的密钥, 但是Win32平台不支持加密密钥?启动Apache时会产生以下错误信息, “SSLPassPhraseDialog builtin is not supported on Win32″(当时不清楚我就加了-des3参数?且出现这个错误时apache启动不报错?查看日志才发现以上错误。))' l+ g, [% S$ A4 R) {
(3) 产生 CA require cert?按提示填入相应的内容:
$ }- Q9 R# @5 h4 D- openssl req -config openssl.cnf -new -key ca.key -out ca.csr- C U9 c* {( o) N1 @
(4) 产生 CA public cert:( R$ s8 t' S$ ?0 Z# k, b
- openssl x509 -days 3650 -req -signkey ca.key -in ca.csr -out ca.crt
( m& R8 B u, g8 p/ v (5) 产生 Server private key:5 a3 U% L% y: n; `: Q+ \. d" U
- openSSL genrsa -out ssl/server.key 1024; q9 m6 y J! J' o( K9 n+ ?9 e
(6) 产生 Server require cert?按提示填入和上边相同的内容:
/ L* l/ e6 B1 j6 h- openssl req -config openssl.cnf -new -key server.key -out server.csr
- [) x- V& [5 ~& m (7) 产生 Server public key:
( `/ S g2 A3 V5 F( v- openssl ca -config openssl.cnf -days 3650 -cert ca.crt -keyfile ca.key -in server.csr -out server.crt% G g( `) k" b# [2 r8 i x$ p
运行这个命令会出错?I am unable to access the ./demoCA/newcerts directory….$ q5 N/ L3 u2 J, G T4 b4 _! n
错误原因是没有手动创建一个CA目录结构6 e; m& r" D4 @) a8 E g* K% N% b* a
- └─demoCA
- ├─newcerts
- ├─index.txt
- ├─serial
# U1 ~5 ]( m) o8 d4 A) f' l 在demoCA中建立 index.txt 空文件, serial文件 , serial文件 中可输入01?此时再运行以上的命令即可生成server.crt。 将生成的 ca.crt、server.crt 和 server.key 放入apache的 conf 目录中
! c, Q! F( z# B. h(8) 编辑apache的配置文件httpd.conf 去掉以下语句的注释, Include conf/extra/httpd-ssl.conf/ m6 t! l. _ O" a: f
- # Secure (SSL/TLS) connections
- Include conf/extra/httpd-ssl.conf
' Q# s! O6 p; F. ^8 y (9) 编辑 conf/extra/httpd-ssl.conf
/ p# o) `0 W0 u' v/ v# g/ c6 j3 G把SSLMutex标签的值改为default
Q! _7 R8 j1 _) P t检查以下项目对应的文件的目录是否正确" t. Q' x P. g: |" H# h
- 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 ^" V' |9 _4 H! e$ G) y
(上述内容需要按照服务安装的实际路径填写,除此之外,配置文件内的所有文件路径都需要确认是否与实际路径相符)# t$ N: t& q# {3 N6 [
成功搭建HTTPS:
5 A6 U3 _: V4 O/ |* B e$ A; D9 {, L- s/ Z
HTTPS搭建完成
3 `! f+ o% g6 ^4 n- ?( M! ^2 D. a3 |4 ^; n( r1 e0 Z2 W4 N5 H/ [7 }. {
开发各场景的测试页面HTTP内嵌IFRAME HTTPS-
- HTTP iframe HTTPS
- 这是父页面
-
1 L& l1 c) Y: N! J HTTPS内嵌IFRAME HTTP-
- HTTPS iframe HTTP
-
- 这是父页面
-
& w3 Y. c$ A. y* ?6 K 内嵌页面-
- Inner HTML
- 这是子页面
- ) g: Q# J6 t1 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安全风险警告信息:
' L$ ]* T I8 c/ n' N4 e: |% WIE 8.0安全风险警告信息:
IE 8.0安全风险警告信息 # U8 v4 e1 c* n7 |
IE 7.0安全风险警告信息:
IE 7.0安全风险警告信息
8 {( J" v/ K+ g% V QJS访问测试父页面- …
- <script type="mce-”text/javascript”">
- //
- window.display = function() {
- alert(“Parent window.display() called.”);
- }
- // ]]>
- …8 l! b, t3 g0 l
4 N, _, V c5 v0 U7 _ 子页面- …
- <script type="mce-”text/javascript”">
- //
- window.onload = function() {
- window.parent && window.parent.display();
- }
- // ]]>
- … }. u( b7 `9 h- f; ^4 t
! d( X3 Q* R* \; N 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 控制台报错信息 Q2 q3 {9 b# |
IE 8.0 浏览器报错信息:
IE 8.0 浏览器报错信息 : W& t3 H; F+ \8 S b
IE 7.0 浏览器报错信息:3 u$ ?+ ?& K% v' ]
分析通过上面的测试,浏览器对于HTTPS和HTTP之间用iFrame嵌套并没过于限制,但存在编码问题。另一方面,基于安全考虑,浏览器有对HTTPS和HTTP之间的JavaScript调用有较严格的限制。
: K" ]6 N" ?6 ~! p& j! F: p3 [; V. o- N$ Z# g- f w
. |5 j) U- d& J! M/ ~
|
|