一、淘宝惨案
我充满期待地打开了 Recorder,设置好相关的参数,将 FF 代理打到 Recorder 设置的端口上,开始录制并访问双十一依然稳如狗的 www.taobao.com.
这样的问题一出现,头就会很大,因为往往要去 Google 半天才能找到问题所在,what a xxx!
好吧,既然看起来淘宝是全站 https 的,自然是证书问题了。我注意到 FF 给的一句提示:
此网站使用了 HTTP 严格传输安全协议(HSTS),要求 Firefox 只应与其建立安全的连接。正因如此,此证书无法添加到例外。
由于我弱爆了我并不知道 HSTS 是什么协议,所以我又试了一下百度。
我发现百度并未使用 HSTS 协议什么的,还有一个救命按钮 “添加例外”。
信任并添加例外后,百度果然可以正常的访问到了。
仔细回想了一下,在 Recorder 的设置中,的确是有关于 Https 的相关配置,于是查看了一下
现在原理可以大概的想通了(个人理解):Gatling Record 此时是作为 FF 访问外网的代理服务器。现在 FF 这边发出一个 https 的请求,肯定会向淘宝服务器索要证书。然而,FF 的这个请求被 Recorder 拦截了,Recorder 返回了一个非法证书——Self-signed Certificate 给 FF。而且这个非法证书过于坑爹,签名摘要都没有。这个证书的颁发者是一个虚构的 CA——Gatling,FF 自然是不会认同,所以会提示风险。再者,淘宝采用了一个更为严格的协议,这个协议不允许浏览器添加例外,凡是证书不合法均不予访问;百度则没有采用此协议,故可以添加例外。
从官方教程http://gatling.io/docs/2.0.0-RC2/http/recorder.htmlCertificates 的说明可以找到一个解决方法。中对
Steps: Generate a Certificate Authority certficate Generate a server
certificate signed by the CA certificate for the proxy. The
certificate is generated against the site domain name(s) being
recorded Import the server certificate and Chain (CA cert) into a java
keystore Import the CA certificate into the Device/Client configure
the recorder to use the custom keystore
简而言之,我需要通过 openssl 自己构造 CA 及证书,然后让 Firefox 认为这一切都是真的。
openssl genrsa -out device.key 2048 openssl req -new -key device.key
-out device.csr openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 1 openssl pkcs12
-export -in device.crt -inkey device.key -out server.p12 -name gatling -CAfile rootCA.pem -caname gatling -chain keytool -importkeystore -deststorepass gatling -destkeypass gatling -destkeystore gatling-custom.jks -srckeystore server.p12 -srcstoretype PKCS12
-srcstorepass gatling -alias gatling
如上的流程我暂时也无力阐述,不过在某一步要求你输入 CommonName 的时候,要对应的输入你要测试的目标域名如 www.taobao.com。执行完毕后,会在执行目录生成如下一些文件。
把 rootCA.pem 通过导入功能添加到 FireFox -> 高级 -> 证书 -> 查看证书 -> 证书机构中
再在 Recorder 的 Https Mode 处把原来的 Self-signed Certificate 改为 Provided keystore,并 Browse 选择刚生成的 jks 后缀文件即可。
我再开始录制,访问 taobao,Awesome!
注:本段内容涉及了一些关于 Https 的内容。由于题主在这方面确实薄弱,也只能歪打正着按照官方文档去配置出来。其中的具体细节,希望能有精通这方面的朋友指点一下,阐述一下整个流程,比如对于一个普通的 https 请求,如果有代理服务器的介入,浏览器是否会预警?Gatling 所做的事和普通的代理服务器区别何在?为什么通过 Gatling 的代理访问到 https 页面后,图片和样式的显示都不正常?
二、HAR 文件生成脚本
Gatling 的 Recorder 提供了 HAR Converter 的功能。前一节所述的问题,如果用 HAR Converter 去解决就会很方便。
1. 用浏览器记录网络请求
打开 Chrome,按开 F12,选中网络面板,访问淘宝首页。
可以看到浏览器记录了所有的请求,各种静态资源 js,css 也在其中。
2. 保存为 har 文件
右击任一请求,选择 “Copy all as har”.此时你的剪贴板中已经保存了我们所需 har 文件的所有内容。打开你的编辑器,将内容粘贴并保存为 taobao.har. har 文件实际上就是描述这些请求的 JSON 对象,仅此而已。
3. 利用 HAR Converter
在 Recorder mode 处选择 Har Converter. Browse 选择到刚才保存的 Har 文件,配置好相关参数后直接 Start,.scala 脚本就会直接生成了。录制到的 urls 如下:
val uri01 = "https://atanx.alicdn.com/t"
val uri02 = "tce.alicdn.com"
val uri03 = "https://log.mmstat.com"
val uri04 = "https://ecpm.tanx.com/ex"
val uri05 = "www.taobao.com"
val uri06 = "headline.taobao.com"
val uri07 = "gtms02.alicdn.com"
val uri08 = "auto.alicdn.com"
val uri09 = "cart.taobao.com"
val uri10 = "assets.alicdn.com"
val uri11 = "https://gtd.alicdn.com/tps"
val uri12 = "www.taobao.com"
val uri13 = "ossgw.alicdn.com"
val uri14 = "dfhs.tanx.com"
val uri15 = "https://g.alicdn.com"
val uri16 = "https://msg.taobao.com/json"
val uri17 = "vip.taobao.com"
val uri18 = "mpp.taobao.com"
val uri19 = "https://gtms01.alicdn.com/tps/i1"
val uri20 = "https://img.alicdn.com"
val uri21 = "opehs.tanx.com"
val uri22 = "suggest.taobao.com"
val uri23 = "ald.taobao.com"
val uri24 = "https://at.alicdn.com/t"
val uri25 = "cookiemapping.wrating.com"
val uri26 = "https://gm.mmstat.com"
val uri27 = "wwc.alicdn.com"
val uri28 = "https://aecpm.alicdn.com/simba/img"
val uri29 = "allot-mpp.taobao.com"
val uri30 = "textlink.simba.taobao.com"
val uri31 = "1234-a5lvd2i7mascabaxzauv4vsl--1513252938.cmos.greencompute.org"
val uri32 = "gw.alicdn.com"
可以看到,https 请求也能被正常的转换,用于后期的测试。