月度归档:2015年02月

『棋王』

『棋王』春节在家看了一部中篇小说『棋王』,它是当代作家阿城的成名作,讲述的是在一个知青下乡的年代,“棋呆子”王一生嗜棋如命,不断与人切磋棋艺,在最后的车轮战中戏剧性地以一敌九,加冕为乡亲们心目中的“棋王”。作者借此表达在一个物质极为困乏的年代,总归还是有不少理想主义青年愿意为理想正名,借棋道喻生道,“中华棋道,毕竟不颓”。

说起理想主义,说起生道,总是不免令人感叹,生活太具体,无法抓住其内在逻辑。“天下的事,不知道的太多。这每天的大字报,张张都新鲜,虽看出点道儿,可不能究底。子儿不全摆上,这棋就没法儿下”,如果生道都像棋道,就这么棋盘点大小,就这么几个棋子,就这么几条规则,大小事情全看在眼里,倒也不至于会令困局中的人们产生痛苦。

甭管身处哪个年代,能专注于一件事都不是一件容易的事情,我们会因为各种事情分心,大多时候忙碌于满足马斯洛需求层次中的底层,生存、情感等这些需求已经耗去了大半精力,真正留给自我实现的精力少之又少。回过来看『棋王』,因为食物稀缺,小说中的人物对“吃”都极为讲究,大多以虔诚的心态面对着这些非常普通的食物,无论火车上的盒饭,还是农场里的烤蛇。“吃完以后,他把两只筷子吮净,拿水把饭盒冲满,将上面一层油花吸净”,“有时你会可怜那些饭被他吃得一个渣儿都不剩,真有点儿惨无人道”,“我们这种人,没有什么忧,顶多有些不痛快。何以解不痛快?唯有象棋”……类似的描写对照着读更显王一生对棋的执着,这是一种拿理想当饭吃的态度。

附录:『棋王』精彩描写片段

--EOF--

『醉古堂剑扫』

『醉古堂剑扫』王家卫的访谈让很人多知道了『醉古堂剑扫』,这其中也包括我。初闻“醉花宜昼,醉雪宜夜”、“不知了了是了了,若知了了,便不了”时仿佛全身的文艺细胞都聚集起来了,深深折服于古人的表达能力。『醉古堂剑扫』,有人说它就是『小窗幽记』,实际上这两不是同一本书。看过一篇考证文章,作者推断前者为原作,后者为伪作,从论据来看倒也合乎情理,所以我就暂且认为我读过的是『醉古堂剑扫』,而非『小窗幽记』。『醉古堂剑扫』是明代陆绍珩编撰,全书12卷:醒、情、峭、灵、素、景、韵、奇、绮、豪、法、倩,主要从明代各类儒家书籍中摘录了各种醒世恒言,按类型分门别类,编辑成书。用现代的眼光看来,实际上它就是一部充满各种心灵鸡汤的读书笔记,因为取材自儒派经典,故表达的观点也多扬“入世”、抑“出世”。

以下为读书笔记:

今世之昏昏逐逐,无一日不醉,无一人不醉,趋名者醉于朝,趋利者醉于野,豪者醉于声色车马,而天下竟为昏迷不醒之天下矣,安得一服清凉散,人人解酲,集醒第一。

使人有面前之誉,不若使人无背后之毁;使人有乍交之欢,不若使人无久处之厌。

居盈满者,如水之将溢未溢,切忌再加一滴;处危急者,如木之将折未折,切忌再加一搦。

情最难久,故多情人必至寡情;性自有常,故任性人终不失性。

真廉无廉名,立名者,正所以为贪;大巧无巧术,用术者,乃所以为拙。

为恶而畏人知,恶中犹有善念;为善而急人知,善处即是恶根。

贪得者,身富而心贫;知足者,身贫而心富;居高者,形逸而神劳;处下者,形劳而神逸。

才人经世,能人取世,晓人逢世,名人垂世,高人出世,达人玩世。

沾泥带水之累,病根在一恋字;随方逐圆之妙,便宜在一耐字。

佛只是个了,仙也是个了,圣人了了不知了。不知了了是了了,若知了了,便不了。

处事不可不斩截,存心不可不宽舒,待己不可不严明,与人不可不和气。

笔之用以月计,墨之用以岁计,砚之用以世计。笔最锐,墨次之,砚钝者也。岂非钝者寿,而锐者夭耶?笔最动,墨次之,砚静者也。岂非静者寿而动者夭乎?于是得养生焉。以钝为体,以静为用,唯其然是以能永年。

贫贱之人,一无所有,及临命终时,脱一厌字;富贵之人,无所不有,及临命终时,带一恋字。脱一厌字,如释重负;带一恋字,如担枷锁。

透得名利关,方是小休歇;透得生死关,方是大休歇。

天下之事,利害常相半;有全利,而无小害者,惟书。

处巧若拙,处明若晦,处动若静。

世人皆醒时作浊事,安得睡时有清身;若欲睡时得清身,须于醒时有清意。

草色花香,游人赏其真趣;桃开梅谢,达士悟其无常。

欲不除,似蛾扑灯,焚身乃止;贪无了,如猩嗜酒,鞭血方休。

休怨我不如人,不如我者常众;休夸我能胜人,胜如我者更多。

有誉于前,不若无毁于后;有乐于身,不若无忧于心。

富时不俭贫时悔,潜时不学用时悔,醉后狂言醒时悔,安不将息病时悔。

贫不足羞,可羞是贫而无志;贱不足恶,可恶是贱而无能;老不足叹,可叹是老而虚生;死不足悲,可悲是死而无补。

大凡聪明之人,极是误事。何以故,惟聪明生意见,意见一生,便不忍舍割。往往溺于爱河欲海者,皆极聪明之人。

己情不可纵,当用逆之法制之,其道在一忍字;人情不可拂,当用顺之法调之,其道在一恕字。

世无花月美人,不愿生此世界。

枕边梦去心亦去,醒后梦还心不还。

亭前杨柳,送尽到处游人;山下蘼芜,知是何时归路。

银烛轻弹,红妆笑倚,人堪惜情更堪惜;困雨花心,垂阴柳耳,客堪怜春亦堪怜。

山水花月之际,看美人更觉多韵。非美人借韵于山水花月也,山水花月直借美人生韵耳。

良缘易合,红叶亦可为媒;知己难投,白璧未能获主。

放得俗人心下,方可为丈夫。放得丈夫心下,方名为仙佛。放得仙佛心下,方名为得道。

竹外窥莺,树外窥水,峰外窥云,难道我有意无意;鸟来窥人,月来窥酒,雪来窥书,却看他有情无情。

一失脚为千古恨,再回头是百年人。

学者要有兢业的心思,又要有潇洒的趣味。

平民种德施惠,是无位之卿相;仕夫贪食财好货,乃有爵的乞人。

枝头秋叶,将落犹然恋树;檐前野鸟,除死方得离笼。人之处世,可怜如此。

有面前之誉易,无背后之毁难;有乍交之欢易,无久处之厌难。

待人而留有余不尽之恩,可以维系无厌之人心;御事而留有余不尽之智,可以堤防不测之事变。

无事如有事时堤防,可以弭意外之变;有事如无事时镇定,可以销局中之危。

种两倾负郭田,量晴校雨;寻几个知心友,弄月嘲风。

是技皆可成名天下,唯无技之人最苦;片技即足自立天下,唯多技之人最劳。

傲骨、侠骨、媚骨,即枯骨可致千金;冷语、隽语、韵语,即片语亦重九鼎。

志要高华,趣要淡泊。

眼里无点灰尘,方可读书千卷;胸中没些渣滓,才能处世一番。

如今休去便休去,若觅了时无了时。若能行乐,即今便好快活。身上无病,心上无事,春鸟是笙歌,春花是粉黛。闲得一刻,即为一刻之乐,何必情欲乃为乐耶?

择池纳凉,不若先除热恼;执鞭求富,何如急遣穷愁。

凡醉各有所宜。醉花宜昼,袭其光也;醉雪宜夜,清其思也;醉得意宜唱,宣其和也;醉将离宜击钵,壮其神也;醉文人宜谨节奏,畏其侮也;醉俊人宜益觥盂加旗帜,助其怒也;醉楼宜暑,资其清也;醉水宜秋,泛其爽也。此皆审其宜,考其景,反此则失饮矣。

必出世者,方能入世,不则世缘易堕;必入世者,方能出世,不则空趣难持。

万事皆易满足,惟读书终身无尽;人何不以不知足一念加之书。又云:读书如服药,药多力自行。

打透生死关,生来也罢,死来也罢;参破名利场,得了也好,失了也好。

我争者,人必争,虽极力争之,未必得;我让者,人必让,虽极力让之,未必失。

沧海日,赤城霞;蛾眉雪,巫峡云;洞庭月,潇湘雨;彭蠡烟,广凌涛;庐山瀑布,合宇宙奇观,绘吾斋壁。少陵诗,摩诘画;左传文,马迁史;薛涛笺,右军帖;南华经,相如赋;屈子离骚,收古今绝艺,置我山窗。

成名每在穷苦日,败事多因得志时。

宠辱不惊,肝木自宁;动静以敬,心火自定;饮食有节,脾土不泄;调息寡言,肺金自全;怡神寡欲,肾水自足。

天下可爱的人,都是可怜人;天下可恶的人,都是可惜人。

凡名易居,只有清名难居;凡福易享,只有清福难享。

舞蝶游蜂,忙中之闲,闲中之忙;落花飞絮,景中之情,情中之景。

五夜鸡鸣,唤起窗前明月;一觉睡起,看破梦里当年。

田园有真乐,不潇洒终为忙人;诵读有真趣,不玩味终为鄙夫;山水有真赏,不领会终为漫游;吟咏有真得,不解脱终为套语。

但看花开落,不言人是非。

莫恋浮名,梦幻泡影有限;且寻乐事,风花雪月无穷。

世味浓,不求忙而忙自至;世味淡,不偷闲而闲自来。

流年不复记,但见花开为春,花落为秋;终岁无所营,惟知日出而作,日入而息。

是非场里,出人逍遥;顺逆境中,纵横自在。竹密何妨水过,山高不碍云飞。

花开花落春不管,拂意事休对人言;水暖水寒鱼自知,会心处还期独赏。

宠辱不惊,闲看庭前花开花落;去留无意,漫随天外云卷云舒。斗室中万虑都捐,说甚画栋飞云,珠帘卷雨;三杯后一真自得,谁知素弦横月,短笛吟风。

当乐境而不能享者,毕竟是薄福之人;当苦境而反觉甘者,方才是真修之士。

曲高每生寡和之嫌,歌唱需求同调;眉修多取入宫之妒,梳洗切莫倾城。

绘雪者,不能绘其清;绘月者,不能绘其明;绘花者,不能绘其香;绘风者,不能绘其声;绘人者,不能绘其情。

多方分别,是非之窦易开;一味圆融,人我之见不立。

浣花溪内,洗十年游子衣尘;修木林中,定四海良朋交籍。

春夜宜苦吟,宜焚香读书,宜与老僧说法,以销艳思。夏夜宜闲谈,宜临水枯坐,宜听松声冷韵,以涤烦襟。秋夜宜豪游,宜访快士,宜谈兵说剑,以除萧瑟。冬夜宜茗战,宜酌酒说《三国》、《水浒》、《金瓶梅》诸集,宜箸竹肉,以破孤岑。

道上红尘,江中白浪,饶他南面百城;花间明月,松下凉风,输我北窗一枕。

俗气入骨,即吞刀刮肠,饮灰洗胃,觉俗态之益呈;正气效灵,即刀锯在前,鼎镬具后,见英风之益露。

读《春秋》,在人事上见天理;读《周易》,在天理上见人事。

昔人有花中十友:桂为仙友,莲为净友,梅为清友,菊为逸友,海棠名友,荼蘼韵友,瑞香殊友,芝兰芳友,腊梅奇友,栀子禅友。昔人有禽中五客:鸥为闲客,鹤为仙客,鹭为雪客,孔雀南客,鹦鹉陇客。会花鸟之情,真是天趣活泼。

个个题诗,写不尽千秋花月;人人作画,描不完大地江山。

天下无不虚之山,惟虚故高而易峻;天下无不实之水,惟实故流而不竭。

世多理所难必之事,莫执宋人道学;世多情所难通之事,莫说晋人风流。

毋似小嫌而疏至戚,勿以新怨而忘旧恩。

爵位不宜太盛,太盛则危;能事不宜尽毕,尽毕则衰。

男子有德便是才,女子无才便是德。

死后声名,空誉墓中之骸骨;穷途潦倒,谁怜宫外之蛾眉。

君子处身,宁人负己,己无负人;小人处事,宁己负人,无人负己。

砚神曰淬妃,墨神曰回氏,纸神曰尚卿,笔神曰昌化,又曰佩阿。

要治世,半部《论语》;要出世,一卷《南华》。

祸莫大于纵己之欲,恶莫大于言人之非。

求见知于人世易,求真知于自己难;求粉饰于耳目易,求无愧于隐微难。

君子有三惜:此生不学,一可惜;此日闻过,二可惜;此身一败,三可惜。

士大夫三日不读书,则礼义不交,便觉面目可憎,语言无味。

势不可倚尽,言不可道尽,福不可享尽,事不可处尽,意味偏长。

静坐然后知平日之气浮,守默然后知平日之言躁,省事然后知平日之贵闲,闭户然后知平日之交滥,寡欲然后知平日之病多,近情然后知平日之念刻。

人之恩可念不可忘,人之仇可忘不可念。

《水浒传》无所不有,却无破老一事,非关缺陷,恰是酒肉汉本色。如此益知作者之妙。

心中事,眼中景,意中人。

园花按时开放,因即其佳称待之以客。梅花索笑客,桃花销恨客,杏花倚云客,水仙凌波客,牡丹酣酒客,芍药占春客,萱草忘忧客,莲花禅社客,葵花丹心客,海棠昌州客,桂花青云客,菊花招隐客,兰花幽谷客,酴醾清叙客,腊梅远寄客。须是身闲,方可称为主人。

甘酒以待病客,辣酒以待饮客,苦酒以待豪客,淡酒以待清客,浊酒以待俗客。

--EOF--

HTTPS和SNI

问题:有两个站点架在同一台服务器上,并且强制HTTPS访问,地址分别为https://sub.domain.com和https://admin.sub.domain.com,HTTPS证书签名的域名分别为*.domain.com和*.sub.domain.com,使用HttpClient(4.1.1版本)去调用一个接口:

1
2
3
4
5
6
7
public class TestGet {
  public static void main(String args[]) throws Exception {
    HttpGet httpGet = new HttpGet("https://sub.domain.com/api/nodes");
    HttpClient httpClient = new DefaultHttpClient();
    httpClient.execute(httpGet);
  }
}

返回 javax.net.ssl.SSLException异常:

Exception in thread "main" javax.net.ssl.SSLException: hostname in certificate didn't match:  != <*.sub.domain.com> OR <*.sub.domain.com>
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:231)
    at org.apache.http.conn.ssl.BrowserCompatHostnameVerifier.verify(BrowserCompatHostnameVerifier.java:54)
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:152)
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:133)
    at org.apache.http.conn.ssl.SSLSocketFactory.verifyHostname(SSLSocketFactory.java:559)
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:534)
    ……

问题分析:从异常信息来看,显然是SSL连接握手阶段出现证书不匹配的问题,客户端请求的是sub.domain.com域名,服务器返回了*.sub.domain.com的证书。但是浏览器访问又正常,这是为何?

解决方法:故事要从IPv4的设计开始说起,设计者认为32位够用了,后续的上层协议设计者也纷纷假设一个IP提供一个服务的前提,比如HTTP/1.0、SSL等,一个大坑就这样被埋下。从90年代中期开始,互联网发展太快,人们开始意识到IP资源越来越稀缺,于是着手设计IPv6,但是从IPv4到IPv6需要一个很长的过渡期,远远大于IPv4地址耗尽的时间。于是一些IP复用的方案出现了,CIDR和NAT技术能在一定程度上缓和IPv4资源稀缺的问题,互联网协议也适时进行了升级,比如HTTP,在HTTP/1.1版本中加入Host头,这个头部在虚拟主机(Virtual Host)中非常重要,它支持不同站点架在一个IP上,客户端通过Host头告知服务器需要访问的站点。但是Host头无法解决HTTPS场景中客户端与虚拟主机(多站点共享同一个IP)之间加密连接的建立,因为HTTPS依赖的SSL/TLS协议并没有同步跟进,SSL握手阶段客户端向服务器端发送的信息中未包含Host,所以服务器端也就没法返回正确的HTTPS证书了。这样的背景下,解决HTTPS虚拟主机的方法主要有:

1. 绑定不同的端口。为不同的虚拟主机绑定不同的HTTPS端口(默认端口443)。缺点显而易见,每次访问都需要显式指定端口号。
2. 绑定不同的IP。前面说过,IPv4资源越来越稀缺,而且这种方法也违背了虚拟主机的初衷。
3. 购买泛域名SSL证书(Wildcard Certificate)。
4. 购买多域名SSL证书(Multi Domain Certificate)。

这些方法都只是绕过限制,要根本解决问题还是得修改SSL/TLS协议,所以SNI(Server Name Indication)就适时被提了出来,它扩展了TLS协议(SSL 3.0不支持,在TLS 1.0以后支持,RFC4366RFC6606),在客户端请求的CLIENTHELLO阶段加入Host信息,告知服务器端要与哪个主机建立加密连接。
SNI

图片来源

实际上,SNI需要通信双方(服务端、客户端)都支持,根据Wiki上的总结,目前一些常见浏览器、服务器软件、类库的支持情况如下:

浏览器:

IE 7+
Mozilla Firefox 2.0+
Opera 8.0+
Google Chrome 5.0.342.1+
Safari 3.0+

注:这里的支持度还跟操作系统相关,比如Windows XP上所有IE均不支持,Chrome在不同操作系统下开始支持的版本也不同。

服务器软件:

Apache 2.2.12+
Nginx(依赖支持sni的openssl库)
Apache Traffic Server 3.2.0+
HAProxy 1.5+

类库:

OpenSSL: 0.9.8f(compiled in with config option '--enable-tlsext'), 0.9.8j+
libcurl / cURL 7.18.1+
Python 3.2
Qt 4.8
Oracle Java 7 JSSE
Apache HttpComponents 4.3.2
wget 1.14
Android 4.2 (Jellybean MR1)
Go (client and server)

Java是在JDK1.7里才支持SNI的,因此要在Java应用里使用,前提就是将OpenJDK或者Oracle JDK升到1.7,如果同时使用HttpClient进行HTTP接口调用,那么还必须将HttpClient版本升到4.3.2及以后,这个JIRA单描述了如何支持SNI(代码设计层面)的前因后果。

回到开头的异常问题,可以通过以下步骤修复:

1. 升级JDK至少到1.7。
2. 升级HttpClient至少到4.3.2。
3. 更新少量代码如下:

1
2
3
4
5
6
7
8
public class TestGet {
  public static void main(String args[]) throws Exception {
    HttpGet httpGet = new HttpGet("https://sub.domain.com/api/nodes");
    //HttpClient httpClient = new DefaultHttpClient();
    CloseableHttpClient httpClient = HttpClients.createDefault();
    httpClient.execute(httpGet);
  }
}

--EOF--