TA的每日心情 | 怒 3 分钟前 |
---|
签到天数: 2258 天 [LV.Master]伴坛终老
|
作者: 阿伦 日期: 2013 年 3 月 21 日分类: HTTP, Javascript标签: HTTP, HTTPS, IFrame, 安全5 i$ K; ?9 z! y" H8 D, y! U
目的学习如何搭建HTTPS服务;
' X- O; y/ u7 ]为开发对安全性有较高要求的页面提供指导,避免不必要的安全漏洞;
y9 B e! r: m" u1 J$ T$ k步骤1.搭建本地HTTPS;
, L4 I/ X: I( y0 V+ B/ L4 r. ]3 {' E2 g2.分别开发所有可能的嵌套场景: L& G2 C* ~# u; B: ^
- HTTP嵌套HTTPS
- HTTPS嵌套HTTP
- HTTPS嵌套HTTPS
- HTTP嵌套HTTP) f- y; U. u" W0 x
3.分别在现有主流浏览器的各个版本访问嵌套页面,记录浏览器相关提示及限制;2 |0 q+ }) g, b! t
操作记录环境系统环境:Windows 7 64bit
& Z |. @& {/ H服务器:Apache G2 q- Y$ j/ J% F
数据库:MySQL8 ]8 v! M3 ], |! N+ f( F
服务器语言:PHP
# ]5 H- L4 G- V搭建本地HTTPS下载windows环境的OpenSSL( http://www.openssl.org/related/binaries.html ,由于本人机器使用的是64位系统,所以下载的是64位OpenSSL)& X8 y+ D' C% _
在Command中使用一下命令生成搭建HTTPS所需要的证书及相关文件: J* S f) l; f! \
(1) 复制apahce2/conf目录openssl.cnf 文件到bin目录+ e# x4 J; G1 V7 v3 v
(2) 生成RSA密钥 (private key) 下面两个命令都可以生成密钥:
* N! i- n/ P4 V8 ]- openssl genrsa -des3 -out ca.key
- openssl genrsa -out ca.key
- openssl genrsa -out ca.key 10247 a; C' W. X( K r1 T$ N' t0 |' [ O
(-des3选项可以加密生成的密钥, 但是Win32平台不支持加密密钥?启动Apache时会产生以下错误信息, “SSLPassPhraseDialog builtin is not supported on Win32″(当时不清楚我就加了-des3参数?且出现这个错误时apache启动不报错?查看日志才发现以上错误。))
l5 d* B2 a2 H0 w(3) 产生 CA require cert?按提示填入相应的内容:2 c4 f, a+ k/ X: i+ R2 Q) H4 }/ J+ C
- openssl req -config openssl.cnf -new -key ca.key -out ca.csr
, _3 Q" S/ @9 ?& F( w1 e M (4) 产生 CA public cert:
; J4 K7 l3 f% V; t W7 b6 }+ i9 a- openssl x509 -days 3650 -req -signkey ca.key -in ca.csr -out ca.crt9 T0 f* T" w) X- {
(5) 产生 Server private key:
) b1 p3 \$ x; {- openSSL genrsa -out ssl/server.key 1024
# ?, a3 a& D) D/ _2 a (6) 产生 Server require cert?按提示填入和上边相同的内容:
( ^- ]# R1 q1 a- openssl req -config openssl.cnf -new -key server.key -out server.csr
4 a% V/ t7 c- D/ N (7) 产生 Server public key:
/ a; _2 E7 k! ~0 ?# a8 v- openssl ca -config openssl.cnf -days 3650 -cert ca.crt -keyfile ca.key -in server.csr -out server.crt: A" N- m# {+ j
运行这个命令会出错?I am unable to access the ./demoCA/newcerts directory….
) U! B+ _/ n2 E9 O错误原因是没有手动创建一个CA目录结构
- r* e, y. i2 s3 F5 A& m2 d- └─demoCA
- ├─newcerts
- ├─index.txt
- ├─serial y* {* S4 E* q
在demoCA中建立 index.txt 空文件, serial文件 , serial文件 中可输入01?此时再运行以上的命令即可生成server.crt。 将生成的 ca.crt、server.crt 和 server.key 放入apache的 conf 目录中
8 I _3 ]' v$ K1 V(8) 编辑apache的配置文件httpd.conf 去掉以下语句的注释, Include conf/extra/httpd-ssl.conf
" ?1 o* c9 D; |' ?- # Secure (SSL/TLS) connections
- Include conf/extra/httpd-ssl.conf
. T$ r8 ]# b- l$ b (9) 编辑 conf/extra/httpd-ssl.conf( H$ y' a: a. G
把SSLMutex标签的值改为default
8 r2 x3 ?* o9 y& `! z% ]检查以下项目对应的文件的目录是否正确
4 B! v& p: I: J, t8 |0 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"
2 e2 }: j/ ~2 x* i( a (上述内容需要按照服务安装的实际路径填写,除此之外,配置文件内的所有文件路径都需要确认是否与实际路径相符)) d9 B h9 ~6 n* L& B& o
成功搭建HTTPS:
* D' I4 i7 G& t' M, z5 T" l
/ I9 Q8 K1 c8 L# F% n+ w5 y
HTTPS搭建完成 6 A0 s" @( I/ N s6 g) ?$ w
( z- `% u8 C' K& e: @2 Z$ q Q开发各场景的测试页面HTTP内嵌IFRAME HTTPS-
- HTTP iframe HTTPS
- 这是父页面
-
; ~/ N9 m, O' J" \8 N3 x+ f HTTPS内嵌IFRAME HTTP-
- HTTPS iframe HTTP
-
- 这是父页面
-
/ t8 v9 ?$ s( u. f d( D 内嵌页面-
- Inner HTML
- 这是子页面
- " M6 T/ b* h/ a; `( |
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安全风险警告信息:
% m) ], b/ Q$ fIE 8.0安全风险警告信息:
IE 8.0安全风险警告信息
: V( w$ Y0 b" g$ ^, W. e* cIE 7.0安全风险警告信息:
IE 7.0安全风险警告信息
0 ]! k( Z, Y. r+ \JS访问测试父页面- …
- <script type="mce-”text/javascript”">
- //
- window.display = function() {
- alert(“Parent window.display() called.”);
- }
- // ]]>
- …* `7 c/ g+ M/ z7 t6 W9 Q) V
# G0 r3 ^+ f/ j/ q0 u# m4 u4 \2 }. Y' y
子页面- …
- <script type="mce-”text/javascript”">
- //
- window.onload = function() {
- window.parent && window.parent.display();
- }
- // ]]>
- …% \( H5 `; e T4 P' u) b0 S u
9 X8 z; Z) U5 c# q- V 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 B8 @4 d1 i# ~1 a( B
IE 8.0 浏览器报错信息:
IE 8.0 浏览器报错信息 5 K; u7 X; o3 ?1 N, F
IE 7.0 浏览器报错信息:
! X+ w( S9 a3 I$ L分析通过上面的测试,浏览器对于HTTPS和HTTP之间用iFrame嵌套并没过于限制,但存在编码问题。另一方面,基于安全考虑,浏览器有对HTTPS和HTTP之间的JavaScript调用有较严格的限制。
) f. \% Y6 C b0 T
+ F" f0 g# y1 p# H# q
- j8 ]4 ^7 W- M( S& i b |
|