<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>出家如初，成佛有余</title>
	<atom:link href="http://www.yeeach.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.yeeach.com</link>
	<description>专注电子商务领域，关注无线互联网，关注新媒体；Yeeach.com用于记录我技术生涯的点滴</description>
	<lastBuildDate>Sun, 14 Mar 2010 11:33:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Cognos 8.3用户权限控制入门</title>
		<link>http://www.yeeach.com/2010/03/14/cognos-8-3%e7%94%a8%e6%88%b7%e6%9d%83%e9%99%90%e6%8e%a7%e5%88%b6%e5%85%a5%e9%97%a8/</link>
		<comments>http://www.yeeach.com/2010/03/14/cognos-8-3%e7%94%a8%e6%88%b7%e6%9d%83%e9%99%90%e6%8e%a7%e5%88%b6%e5%85%a5%e9%97%a8/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 11:33:21 +0000</pubDate>
		<dc:creator>chuanliang</dc:creator>
				<category><![CDATA[技术相关]]></category>
		<category><![CDATA[cognos，opends，OLAP，权限控制，ldap]]></category>

		<guid isPermaLink="false">http://www.yeeach.com/2010/03/14/cognos-8-3%e7%94%a8%e6%88%b7%e6%9d%83%e9%99%90%e6%8e%a7%e5%88%b6%e5%85%a5%e9%97%a8/</guid>
		<description><![CDATA[&#160;&#160;&#160; 学习Cognos 8.3入门中，需要实现Cognos与现有业务系统集成，尤其是用户权限部分。官方文档及网上的教程对Cognos用户权限控制的实现机制都语焉不详，迫切需要一个快餐式的Step-By-Step的学习文档。整理一下学习的东西，希望对新手们有所帮助。
&#160;&#160;&#160; 目的：
&#160;&#160;&#160; 1. 采用OpenDS存储组织机构及用户信息，实现OpenDS与Cognos集成
&#160;&#160;&#160; 2. 使用Cognos Framework Manager来实现用户数据过滤控制，实现同一报表用户只能够看见自己的数据
&#160;&#160;&#160; 3. 二次开发实现cognos与业务系统的用户数据集成
&#160; 下载《Cognos 8.3用户权限控制入门》
&#160;
Technorati 标签: cognos,opends,OLAP,权限控制,ldap
	
	
	&#169; chuanliang for 出家如初，成佛有余, 2010. &#124;
	  Permalink &#124;
	  No comment
	Add to del.icio.us
	Search blogs linking this post with Technorati
	Want more on these topics ? Browse the archive of posts filed under 技术相关.]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 学习Cognos 8.3入门中，需要实现Cognos与现有业务系统集成，尤其是用户权限部分。官方文档及网上的教程对Cognos用户权限控制的实现机制都语焉不详，迫切需要一个快餐式的Step-By-Step的学习文档。整理一下学习的东西，希望对新手们有所帮助。</p>
<p>&#160;&#160;&#160; 目的：</p>
<p>&#160;&#160;&#160; 1. 采用OpenDS存储组织机构及用户信息，实现OpenDS与Cognos集成</p>
<p>&#160;&#160;&#160; 2. 使用Cognos Framework Manager来实现用户数据过滤控制，实现同一报表用户只能够看见自己的数据</p>
<p>&#160;&#160;&#160; 3. 二次开发实现cognos与业务系统的用户数据集成</p>
<p>&#160; 下载<a href="http://www.yeeach.com/ebooks/other/Cognos%208.3%20and%20OpenDS%20Integration.rar" >《Cognos 8.3用户权限控制入门》</a></p>
<p>&#160;</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:198be3cf-754f-401e-95d5-ff87486ae62f" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/cognos" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/cognos');" rel="tag">cognos</a>,<a href="http://technorati.com/tags/opends" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/opends');" rel="tag">opends</a>,<a href="http://technorati.com/tags/OLAP" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/OLAP');" rel="tag">OLAP</a>,<a href="http://technorati.com/tags/%e6%9d%83%e9%99%90%e6%8e%a7%e5%88%b6" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e6%9d%83%e9%99%90%e6%8e%a7%e5%88%b6');" rel="tag">权限控制</a>,<a href="http://technorati.com/tags/ldap" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/ldap');" rel="tag">ldap</a></div>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; chuanliang for <a href="http://www.yeeach.com" >出家如初，成佛有余</a>, 2010. |
	  <a href="http://www.yeeach.com/2010/03/14/cognos-8-3%e7%94%a8%e6%88%b7%e6%9d%83%e9%99%90%e6%8e%a7%e5%88%b6%e5%85%a5%e9%97%a8/" >Permalink</a> |
	  <a href="http://www.yeeach.com/2010/03/14/cognos-8-3%e7%94%a8%e6%88%b7%e6%9d%83%e9%99%90%e6%8e%a7%e5%88%b6%e5%85%a5%e9%97%a8/#comments" >No comment</a></p>
	<p>Add to <a href="http://del.icio.us/post?url=http://www.yeeach.com/2010/03/14/cognos-8-3%e7%94%a8%e6%88%b7%e6%9d%83%e9%99%90%e6%8e%a7%e5%88%b6%e5%85%a5%e9%97%a8/&amp;title=Cognos 8.3用户权限控制入门" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://del.icio.us/post?url=http://www.yeeach.com/2010/03/14/cognos-8-3%e7%94%a8%e6%88%b7%e6%9d%83%e9%99%90%e6%8e%a7%e5%88%b6%e5%85%a5%e9%97%a8/&amp;title=Cognos 8.3用户权限控制入门');">del.icio.us</a></p>
	<p>Search blogs linking this post with <a href="http://www.technorati.com/search/http://www.yeeach.com/2010/03/14/cognos-8-3%e7%94%a8%e6%88%b7%e6%9d%83%e9%99%90%e6%8e%a7%e5%88%b6%e5%85%a5%e9%97%a8/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.technorati.com/search/http://www.yeeach.com/2010/03/14/cognos-8-3%e7%94%a8%e6%88%b7%e6%9d%83%e9%99%90%e6%8e%a7%e5%88%b6%e5%85%a5%e9%97%a8/');" title="Search on Technorati">Technorati</a></p>
	<p>Want more on these topics ? Browse the archive of posts filed under <a href="http://www.yeeach.com/category/%e6%8a%80%e6%9c%af-%e8%bd%af%e4%bb%b6/"  title="查看 技术相关 的全部文章" rel="category tag">技术相关</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.yeeach.com/2010/03/14/cognos-8-3%e7%94%a8%e6%88%b7%e6%9d%83%e9%99%90%e6%8e%a7%e5%88%b6%e5%85%a5%e9%97%a8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>电子商务平台之&#8220;推荐作为服务&#8221;</title>
		<link>http://www.yeeach.com/2010/03/07/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e6%8e%a8%e8%8d%90%e4%bd%9c%e4%b8%ba%e6%9c%8d%e5%8a%a1/</link>
		<comments>http://www.yeeach.com/2010/03/07/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e6%8e%a8%e8%8d%90%e4%bd%9c%e4%b8%ba%e6%9c%8d%e5%8a%a1/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 15:34:46 +0000</pubDate>
		<dc:creator>chuanliang</dc:creator>
				<category><![CDATA[技术相关]]></category>
		<category><![CDATA[电子商务]]></category>
		<category><![CDATA[recommendation engine，推荐引擎，推荐系统，协同过滤，开放平台，推荐作为服务，recommendation as a service]]></category>

		<guid isPermaLink="false">http://www.yeeach.com/2010/03/07/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e6%8e%a8%e8%8d%90%e4%bd%9c%e4%b8%ba%e6%9c%8d%e5%8a%a1/</guid>
		<description><![CDATA[&#160;&#160;&#160; 在亚马逊这样的电子商务标杆企业的示范下，推荐系统对于电子商务网站的价值已被大家所认同，例如：增加网站的访问量，提升销售额；提高网站的交叉销售能力；增加顾客在网店上的停留时间，浏览更多的商品；将网站的浏览者转变为购买者等等。因此大家都希望能够拥有自己的推荐系统。 
&#160;&#160;&#160; 但相对于网站开发技术而言，推荐系统由于涉及数据仓库、数据挖掘、统计分析、人工智能等相关技术，因此技术门槛要高得多，对于研发能力相对较弱的中小型的企业而言，要自己研发推荐系统难度很大。于是乎诞生了一些以“推荐作为服务”（Recommendation as a Service）的公司。 
1、推荐服务的基本模式
&#160;&#160;&#160; 这些公司拥有推荐系统核心技术，通过SaaS模式对外提供推荐服务，一般的服务方式如下： 
&#160;&#160;&#160; 1）、以接口、批量上传等形式导入合作伙伴的产品目录
&#160;&#160;&#160; 2）、在合作伙伴网站页面嵌入用于跟踪用户行为的javascript脚本
&#160;&#160;&#160; 3）、通过对诸如商品信息、历史用户数据、用户行为（包括搜索、网站点击行为、购买历史、喜好、购物车、收藏历史）等行为数据的汇总分析，建立网站相应的推荐模型
&#160;&#160;&#160; 4）、用户登录网站时候，根据用户历史行为数据实时分析预测用户的喜好，产生个性化推荐。
&#160;&#160;&#160; 下图摘自Strands、Mybuys 公司的业务流程图，基本上概括了推荐服务的核心模型
 
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Strands的模型
&#160;
 
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Mybuys 的模型 
&#160;&#160;&#160; 尽管推荐服务核心算法的理论基础基本上类似，但不同行业推荐对象对应的模型不尽相同（例如电子商务、SNS社区、媒体站点），更为重要的是由于各公司商业模式的不同，不同的公司对于推荐服务有不同的要求，因此推荐服务提供商针对不同行业及不同公司所采用推荐算法及模型实现都会有所不同。&#160;&#160;&#160; 
2、推荐服务提供商
&#160;&#160; 2.1、国外的“推荐作为服务”提供商：
&#160;&#160;&#160; Strands、 Mybuys 、 Baynote、 Loomia 、 Aggregrate Knowledge 、RichRelevance、 OutBrain、 ATG、 Avail Intelligence、Certona、&#160;&#160;&#160; Choicestream、 Apture
&#160; 
&#160;

2.2、国内的“推荐作为服务”提供商：
&#160;&#160;&#160; 百分点、 麦路 
&#160;&#160;&#160; 麦路最初以“推荐作为服务”作为商业模式，目前重点已经转向运营购物返现联盟发现宝。 
&#160;&#160;&#160; 而百分点仍然专注在“推荐作为服务”上，相对于麦路更加专业，百分点推荐技术研究中心及电子期刊收集了一些有价值的资料。尽管作为纯技术驱动的公司在国内现实的商业环境下生存相对较难，但随着国内电子商务的繁荣及成熟，相信像百分点这样专业化的公司会有美好的前景。 
3、几点思考：
3.1、“推荐作为服务”的商业模式
&#160;&#160;&#160; 1）、独立的推荐服务提供商 
&#160;&#160;&#160; 2）、依托于某个电子商务开放平台（例如淘宝开放平台）、SNS开放平台提供推荐服务 
&#160;&#160;&#160; 3）、依托于广告联盟 
&#160;&#160;&#160; 4）、依托于网络营销、购物返现联盟 [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 在亚马逊这样的电子商务标杆企业的示范下，推荐系统对于电子商务网站的价值已被大家所认同，例如：增加网站的访问量，提升销售额；提高网站的交叉销售能力；增加顾客在网店上的停留时间，浏览更多的商品；将网站的浏览者转变为购买者等等。因此大家都希望能够拥有自己的推荐系统。 </p>
<p>&#160;&#160;&#160; 但相对于网站开发技术而言，推荐系统由于涉及数据仓库、数据挖掘、统计分析、人工智能等相关技术，因此技术门槛要高得多，对于研发能力相对较弱的中小型的企业而言，要自己研发推荐系统难度很大。于是乎诞生了一些以“推荐作为服务”（Recommendation as a Service）的公司。 </p>
<h3><strong>1、推荐服务的基本模式</strong></h3>
<p>&#160;&#160;&#160; 这些公司拥有推荐系统核心技术，通过SaaS模式对外提供推荐服务，一般的服务方式如下： </p>
<p>&#160;&#160;&#160; 1）、以接口、批量上传等形式导入合作伙伴的产品目录</p>
<p>&#160;&#160;&#160; 2）、在合作伙伴网站页面嵌入用于跟踪用户行为的javascript脚本</p>
<p>&#160;&#160;&#160; 3）、通过对诸如商品信息、历史用户数据、用户行为（包括搜索、网站点击行为、购买历史、喜好、购物车、收藏历史）等行为数据的汇总分析，建立网站相应的推荐模型</p>
<p>&#160;&#160;&#160; 4）、用户登录网站时候，根据用户历史行为数据实时分析预测用户的喜好，产生个性化推荐。</p>
<p>&#160;&#160;&#160; 下图摘自<a href="http://www.strands.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.strands.com');">Strands</a>、<a title="http://www.mybuys.com/" href="http://www.mybuys.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.mybuys.com/');">Mybuys</a> 公司的业务流程图，基本上概括了推荐服务的核心模型</p>
<p><a href="http://www.yeeach.com/wp-content/uploads/2010/03/strands.png" ><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="recommendation engine，推荐引擎，推荐系统，协同过滤，开放平台，推荐作为服务，recommendation as a service" border="0" alt="recommendation engine，推荐引擎，推荐系统，协同过滤，开放平台，推荐作为服务，recommendation as a service" src="http://www.yeeach.com/wp-content/uploads/2010/03/strands_thumb.png" width="645" height="1027" /></a> </p>
<p align="left">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <a href="http://www.strands.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.strands.com');">Strands</a>的模型</p>
<p>&#160;</p>
<p><a href="http://www.yeeach.com/wp-content/uploads/2010/03/imgrecommendation_engine.jpg" ><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="recommendation engine，推荐引擎，推荐系统，协同过滤，开放平台，推荐作为服务，recommendation as a service" border="0" alt="recommendation engine，推荐引擎，推荐系统，协同过滤，开放平台，推荐作为服务，recommendation as a service" src="http://www.yeeach.com/wp-content/uploads/2010/03/imgrecommendation_engine_thumb.jpg" width="644" height="445" /></a> </p>
<p align="left">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <a title="http://www.mybuys.com/" href="http://www.mybuys.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.mybuys.com/');">Mybuys</a> 的模型 </p>
<p align="left">&#160;&#160;&#160; 尽管推荐服务核心算法的理论基础基本上类似，但不同行业推荐对象对应的模型不尽相同（例如电子商务、SNS社区、媒体站点），更为重要的是由于各公司商业模式的不同，不同的公司对于推荐服务有不同的要求，因此推荐服务提供商针对不同行业及不同公司所采用推荐算法及模型实现都会有所不同。&#160;&#160;&#160; </p>
<h3><strong>2、推荐服务提供商</strong></h3>
<h4><strong>&#160;&#160; 2.1、国外的“推荐作为服务”提供商：</strong></h4>
<p>&#160;&#160;&#160; <a href="http://www.strands.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.strands.com');">Strands</a>、 <a title="http://www.mybuys.com/" href="http://www.mybuys.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.mybuys.com/');">Mybuys</a> 、 <a href="http://www.baynote.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.baynote.com');">Baynote</a>、 <a title="http://www.loomia.com/" href="http://www.loomia.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.loomia.com/');">Loomia</a> 、 <a href="http://www.aggregrateknowledge.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.aggregrateknowledge.com');">Aggregrate Knowledge</a> 、<a href="http://www.richrelevance.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.richrelevance.com');">RichRelevance</a>、 <a href="http://www.outbrain.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.outbrain.com');">OutBrain</a>、 <a title="http://www.atg.com/" href="http://www.atg.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.atg.com/');">ATG</a>、 <a href="http://www.avail.net/en/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.avail.net/en/');">Avail Intelligence</a>、<a href="http://www.certona.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.certona.com');">Certona</a>、&#160;&#160;&#160; <a title="http://www.choicestream.com/" href="http://www.choicestream.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.choicestream.com/');">Choicestream</a>、 <a title="http://www.apture.com/" href="http://www.apture.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.apture.com/');">Apture</a></p>
<p><a href="http://www.yeeach.com/wp-content/uploads/2010/03/peronsonlaizationcompetitors1.jpg" ><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="recommendation engine，推荐引擎，推荐系统，协同过滤，开放平台，推荐作为服务，recommendation as a service" border="0" alt="recommendation engine，推荐引擎，推荐系统，协同过滤，开放平台，推荐作为服务，recommendation as a service" src="http://www.yeeach.com/wp-content/uploads/2010/03/peronsonlaizationcompetitors_thumb.jpg" width="649" height="712" /></a>&#160; </p>
<p>&#160;</p>
</p>
<h4><strong>2.2、国内的“推荐作为服务”提供商：</strong></h4>
<p>&#160;&#160;&#160; <a title="http://www.baifendian.com" href="http://www.baifendian.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.baifendian.com');">百分点</a>、 <a title="http://tuijian.mailu.cn/" href="http://tuijian.mailu.cn/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://tuijian.mailu.cn/');">麦路</a> </p>
<p>&#160;&#160;&#160; 麦路最初以“推荐作为服务”作为商业模式，目前重点已经转向运营购物返现联盟<a href="http://www.faxianbao.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.faxianbao.com');">发现宝</a>。 </p>
<p>&#160;&#160;&#160; 而百分点仍然专注在“推荐作为服务”上，相对于麦路更加专业，百分点推荐技术研究中心及电子期刊收集了一些有价值的资料。尽管作为纯技术驱动的公司在国内现实的商业环境下生存相对较难，但随着国内电子商务的繁荣及成熟，相信像百分点这样专业化的公司会有美好的前景。 </p>
<h3><strong>3、几点思考：</strong></h3>
<h4><strong>3.1、“推荐作为服务”的商业模式</strong></h4>
<p>&#160;&#160;&#160; 1）、独立的推荐服务提供商 </p>
<p>&#160;&#160;&#160; 2）、依托于某个电子商务开放平台（例如淘宝开放平台）、SNS开放平台提供推荐服务 </p>
<p>&#160;&#160;&#160; 3）、依托于广告联盟 </p>
<p>&#160;&#160;&#160; 4）、依托于网络营销、购物返现联盟 </p>
<p>&#160;&#160;&#160; 5）、依托于行业垂直搜索引擎公司 </p>
<p>&#160;&#160;&#160; 电子商务、SNS社区等互联网新兴应用的高速发展，对个性化推荐的需求越来越强烈，因此那些专注于“推荐作为服务”这一领域的推荐服务提供商会有较大的成长空间，尽管尚有很长的路要走。 </p>
<p>&#160;&#160; “推荐作为服务”的一种趋势是多种模式的结合，尤其是与开放平台、网络营销联盟、搜索引擎多种模式的结合，因此“推荐作为服务”提供商最终可能变成网路营销服务提供商、垂直搜索引擎公司、广告媒体公司等等。 </p>
<h3><strong>3.2、、“推荐作为服务”的核心价值</strong></h3>
<p><strong>&#160;&#160;&#160; </strong>“推荐作为服务”提供商拥有的最为核心财富不是推荐技术本身，而是通过推荐服务所积累的海量数据，特别是用户数据和项目（item）数据。这正如Google自身最核心的财富不是搜索引擎本身，而是对于用户点击流数据。因此从这点来说，“推荐作为服务”最大的实践者其实是Google。</p>
<p>&#160;&#160;&#160; 用户数据：当下的“推荐作为服务”提供商基本上都围绕一个应用或一个平台来提供服务，并没有以用户网络身份标识为中心来整合各种用户行为数据。如果能够借助opensocial、openid、oauth等开放协议整合用户的网络身份，获得用户各种网络活动的数据，为用户提供更加个性、精准、实时的推荐服务，这样的推荐服务对用户极大的使用价值。</p>
<p>&#160;&#160;&#160; 项目数据：所谓的项目（item）数据的内涵可以是电子商务平台的商品，可以是社会化媒体的一个视频、一篇blog，可以是搜索引擎的搜索关键词，而这些恰恰是那些传统的电子商务、搜索引擎、广告巨头们的关注点。但这并不意味着“推荐作为服务”提供商无法与这些巨头们竞争。“推荐作为服务”之所以能够蓬勃发展，正说明了目前的巨头们所提供的服务在这些领域并不能很好满足用户的需求。例如在实时网络（Real-Time）、开放平台等领域。 </p>
<p>&#160;&#160;&#160; 对于用户而言，推荐服务最核心的价值在于更加个性化、精准、实时的推荐，因此推荐服务未来的趋势之一是对用户身份及数据的整合。 </p>
<p>&#160;&#160;&#160; 对于众多的中小企业而言，推荐服务最核心的价值在于能够帮助其带来流量、促成交易、创造交易，因此推荐服务未来的趋势之一应该是与网络营销、广告联盟等服务更加的紧密结合。 </p>
<h4><strong>3.3、“推荐作为服务”的最佳实践</strong></h4>
<p>&#160;&#160;&#160; Strands 的Francisco Martin 在RecSys 2009上的演讲 <a href="http://blog.strands.com/2009/10/23/recsys-2009-keynote-top-10-lessons-learned-developing-deploying-and-operating-real-world-recommender-systems/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://blog.strands.com/2009/10/23/recsys-2009-keynote-top-10-lessons-learned-developing-deploying-and-operating-real-world-recommender-systems/');">RecSys 2009 Keynote: Top 10 Lessons Learned Developing, Deploying, and Operating Real-World Recommender Systems</a> 分享了Strands在此方面的经验，很精彩：</p>
<ul>
<li><strong>Lesson 1.</strong> Make sure a recommender is really needed! Do you have lots of recommendable items? Many diverse customers?… also think Return-on-Invesment… a more <em>sophisticated</em> recommender <em>may</em> not deliver a better ROI. </li>
<li><strong>Lesson 2.</strong> Make sure the recommendations make <em>strategic</em> sense. Is the best recommendation for the customer also the best for the business? What is the difference between a good and useful recommendation? Good recommendations vs useful recs; obvious recommendations may not be useful; risky recs may deliver better long-term value. </li>
<li><strong>Lesson 3.</strong> Choose the right partner! Select the right rec vendor vs hire some #recsys09 students. If you are a big company the best thing you can do is organize a contest. </li>
<li><strong>Lesson 4.</strong> Forget about cold-start problems (!) …. just be creative. The internet has all the data that you need (somewhere…). </li>
<li><strong>Lesson 5.</strong> Get the right balance between data and algorithms. 70% of the success of a recommendation system is in the data, the other 30% in the algorithm. </li>
<li><strong>Lesson 6.</strong> Finding correlated items is easy but deciding what, how, and when to present them to the user is hard… or don’t just recommend for the sake of it. Remember, user attention is a scarce and valuable resource. Use it wisely! … dont make a recommendations to a customer who is just about to pay for items at the checkout! User interface should get at least 50% of your attention. </li>
<li><strong>Lesson 7</strong> Don’t waste time computing nearest neighbours (use social connections)… just mine the social graph. Might miss useful connections? </li>
<li><strong>Lesson 8</strong> Don’t wait to scale! </li>
<li><strong>Lesson 9:</strong> Choose the right feedback mechanism. Stars vs thumbs …. the <a href="http://youtube-global.blogspot.com/2009/09/five-stars-dominate-ratings.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://youtube-global.blogspot.com/2009/09/five-stars-dominate-ratings.html');">YouTube problem</a>. More research on implicit and other feedback mechanisms is needed. The perfect rating system is no rating system! … focus on the interface. </li>
<li><strong>Lesson 10</strong> Measure Everything! … business control and analytics is a big opportunity here. </li>
</ul>
<p>&#160; </p>
<h3><strong>4、参考资料</strong></h3>
<p>&#160; <a title="http://blog.strands.com/2009/10/23/recsys-2009-keynote-top-10-lessons-learned-developing-deploying-and-operating-real-world-recommender-systems/" href="http://blog.strands.com/2009/10/23/recsys-2009-keynote-top-10-lessons-learned-developing-deploying-and-operating-real-world-recommender-systems/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://blog.strands.com/2009/10/23/recsys-2009-keynote-top-10-lessons-learned-developing-deploying-and-operating-real-world-recommender-systems/');">RecSys 2009 Keynote: Top 10 Lessons Learned Developing, Deploying, and Operating Real-World Recommender Systems</a> </p>
<p>&#160; <a title="http://www.readwriteweb.com/archives/5_problems_of_recommender_systems.php" href="http://www.readwriteweb.com/archives/5_problems_of_recommender_systems.php" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.readwriteweb.com/archives/5_problems_of_recommender_systems.php');">5 Problems of Recommender Systems</a> </p>
<p>&#160; <a title="http://www.readwriteweb.com/archives/recommendation/" href="http://www.readwriteweb.com/archives/recommendation/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.readwriteweb.com/archives/recommendation/');">Readwriteweb series on recommendation technologies</a> </p>
<p>&#160; <a title="http://venturebeat.com/2008/07/22/baynote-strands-richrelevance-will-they-survive-the-recommendation-engine-consolidation/" href="http://venturebeat.com/2008/07/22/baynote-strands-richrelevance-will-they-survive-the-recommendation-engine-consolidation/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://venturebeat.com/2008/07/22/baynote-strands-richrelevance-will-they-survive-the-recommendation-engine-consolidation/');">Baynote, Strands, RichRelevance — will they survive the “recommendation engine” consolidation?</a></p>
<p>&#160; </p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:264ff971-58ba-448a-9fdd-69a48c1f3fc0" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/recommendation+engine" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/recommendation+engine');" rel="tag">recommendation engine</a>,<a href="http://technorati.com/tags/%e6%8e%a8%e8%8d%90%e5%bc%95%e6%93%8e" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e6%8e%a8%e8%8d%90%e5%bc%95%e6%93%8e');" rel="tag">推荐引擎</a>,<a href="http://technorati.com/tags/%e6%8e%a8%e8%8d%90%e7%b3%bb%e7%bb%9f" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e6%8e%a8%e8%8d%90%e7%b3%bb%e7%bb%9f');" rel="tag">推荐系统</a>,<a href="http://technorati.com/tags/%e5%8d%8f%e5%90%8c%e8%bf%87%e6%bb%a4" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e5%8d%8f%e5%90%8c%e8%bf%87%e6%bb%a4');" rel="tag">协同过滤</a>,<a href="http://technorati.com/tags/%e5%bc%80%e6%94%be%e5%b9%b3%e5%8f%b0" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e5%bc%80%e6%94%be%e5%b9%b3%e5%8f%b0');" rel="tag">开放平台</a>,<a href="http://technorati.com/tags/%e6%8e%a8%e8%8d%90%e4%bd%9c%e4%b8%ba%e6%9c%8d%e5%8a%a1" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e6%8e%a8%e8%8d%90%e4%bd%9c%e4%b8%ba%e6%9c%8d%e5%8a%a1');" rel="tag">推荐作为服务</a>,<a href="http://technorati.com/tags/recommendation+as+a+service" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/recommendation+as+a+service');" rel="tag">recommendation as a service</a></div>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; chuanliang for <a href="http://www.yeeach.com" >出家如初，成佛有余</a>, 2010. |
	  <a href="http://www.yeeach.com/2010/03/07/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e6%8e%a8%e8%8d%90%e4%bd%9c%e4%b8%ba%e6%9c%8d%e5%8a%a1/" >Permalink</a> |
	  <a href="http://www.yeeach.com/2010/03/07/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e6%8e%a8%e8%8d%90%e4%bd%9c%e4%b8%ba%e6%9c%8d%e5%8a%a1/#comments" >One comment</a></p>
	<p>Add to <a href="http://del.icio.us/post?url=http://www.yeeach.com/2010/03/07/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e6%8e%a8%e8%8d%90%e4%bd%9c%e4%b8%ba%e6%9c%8d%e5%8a%a1/&amp;title=电子商务平台之&ldquo;推荐作为服务&rdquo;" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://del.icio.us/post?url=http://www.yeeach.com/2010/03/07/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e6%8e%a8%e8%8d%90%e4%bd%9c%e4%b8%ba%e6%9c%8d%e5%8a%a1/&amp;title=电子商务平台之&ldquo;推荐作为服务&rdquo;');">del.icio.us</a></p>
	<p>Search blogs linking this post with <a href="http://www.technorati.com/search/http://www.yeeach.com/2010/03/07/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e6%8e%a8%e8%8d%90%e4%bd%9c%e4%b8%ba%e6%9c%8d%e5%8a%a1/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.technorati.com/search/http://www.yeeach.com/2010/03/07/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e6%8e%a8%e8%8d%90%e4%bd%9c%e4%b8%ba%e6%9c%8d%e5%8a%a1/');" title="Search on Technorati">Technorati</a></p>
	<p>Want more on these topics ? Browse the archive of posts filed under <a href="http://www.yeeach.com/category/%e6%8a%80%e6%9c%af-%e8%bd%af%e4%bb%b6/"  title="查看 技术相关 的全部文章" rel="category tag">技术相关</a>,  <a href="http://www.yeeach.com/category/web20-%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1/"  title="查看 电子商务 的全部文章" rel="category tag">电子商务</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.yeeach.com/2010/03/07/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e6%8e%a8%e8%8d%90%e4%bd%9c%e4%b8%ba%e6%9c%8d%e5%8a%a1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>电子商务平台之平台服务杂思</title>
		<link>http://www.yeeach.com/2010/02/28/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e5%b9%b3%e5%8f%b0%e6%9c%8d%e5%8a%a1%e6%9d%82%e6%80%9d/</link>
		<comments>http://www.yeeach.com/2010/02/28/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e5%b9%b3%e5%8f%b0%e6%9c%8d%e5%8a%a1%e6%9d%82%e6%80%9d/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 03:39:56 +0000</pubDate>
		<dc:creator>chuanliang</dc:creator>
				<category><![CDATA[产品管理]]></category>
		<category><![CDATA[电子商务]]></category>
		<category><![CDATA[电子商务，开放平台，客户服务，去哪儿]]></category>

		<guid isPermaLink="false">http://www.yeeach.com/2010/02/28/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e5%b9%b3%e5%8f%b0%e6%9c%8d%e5%8a%a1%e6%9d%82%e6%80%9d/</guid>
		<description><![CDATA[&#160;&#160;&#160; 在去哪儿上买3张成都到北京的机票，一张儿童票、2张成人票。比价后，选择了一家价格较为便宜的分销商下单，跳转到分销商的网站下单时候成人票860，儿童票720，加上保险、机场建设费等费用，总价2622元。做支付时候也没具体留意总的支付金额（呵呵，是够粗心的），完成支付后，等待交易成功的通知。过了2个小时还没有收到短信通知，于是打分销商的客服电话，打了10多次，一直是忙音，语音始终提示前面有2&#8211;8人等待。于是上分销商的网站看订单状态。由于不知道初始密码，通过重置密码方式，接近10多分钟都没收到重置短信。后来按照111111、2222222、333333顺序方式测密码，终于登陆进去了。发现订单发现每张成人票的支付金额为1080元，而且订单中出现了四张成人票记录。好在总价中只计算了两张票的价格。总价为3062元。
&#160;&#160;&#160; 再打电话投诉，仍然一直是忙音。打了2个多小时，打了30多个电话后，终于打通了。把情况一说，客服人员很流利地说明了原因：他们自己系统是有问题，与去哪儿合作的合作页不是实时刷新的，因此在下单时候成人票的价格在他们平台上是1080，而不是860元，要避免此种情况，最好在下单前在他们平台再查询一下实时价格。从客服的解释来看，以前应该也遇见很多这样的问题，很奇怪明知有问题，为何一直不修改，只好退票。退票时候，客服人员问银行账号，而且建议最好是工行的账号。很奇怪，问她：不是通过快钱支付的吗，你直接给我退回我的支付行就行了。客服说不行，如果不用工行而用其他银行账号，退款退回时间不确定。
&#160;&#160;&#160; 懒得再一家一家地比较，担心再出问题，于是直接在去哪儿上比较了一下进行直销的航空公司的价格，找了相对便宜的南方航空下了单。在这过程中，暴露了很多问题，包括：
&#160;&#160;&#160; 1、合作商户系统与平台对接时候信息同步、实时性问题
&#160;&#160;&#160; 2、合作商户系统本身存在很多问题
&#160;&#160;&#160; 3、合作商户本身服务的能力、服务规范性及服务质量
&#160;&#160;&#160; 4、平台服务体验的一致性问题
&#160;&#160;&#160; 5、平台对合作商户资质的选择
&#160;&#160;&#160; 这些问题归根结底可以概括为电子商务平台服务问题，以上问题能否有效解决影响着一个电子商务平台的成败，总结一下零碎思考的一些内容：
1、平台服务的边界
&#160;&#160; 对用户而言，在购买机票过程中涉及两个比较大的电子商务平台：去哪儿的机票比价平台、快钱的支付平台。在两个平台作为这些商户的平台服务提供商，理论上只需要能够为这些商户提供好所需要的各种服务就行，合作商户以上的各种问题让合作商户自己搞定就行，不能归结为平台的问题。
&#160;&#160; 但对于最终用户而言，在使用服务过程中出现的各种问题都是平台的问题，他并很不清楚这些系统的边界，他只关心能够通过平台低成本、便捷、安全享受各种服务。如果合作商户不能为客户提供优质的服务，那平台本身的价值也打了很大的折扣。平台要保证服务的一致性，要维护平台核心的价值，就应该树立平台的服务标准，用这些标准来要求商户并帮助合作商户从各个层面上进步。合作商户的高度决定了平台的高度。
&#160;&#160;&#160; 因此作为一个平台本身，在考虑平台建设时候，我们不应当只是盯住平台本身的边界，平台的边界的划分应该以用户视角来看，以保证用户以一致性的体验完成整个购物过程。这就要求平台的合作商户的选择、合作商户服务能力、合作商户系统等问题上必须以平台化的要求来执行，对达不到平台化要求的，或者帮助其进步、或者淘汰。&#160;&#160;&#160; 
2、平台服务的核心价值
&#160;&#160;&#160; 对于合作商户而言，如果平台只是单纯作为一个销售通路或营销通路，那平台给合作商户带来的价值并不是持久性的，可替代性很高。尤其航空公司们的直销业务在整个机票分销业务中比重愈来愈大的情况下，这些合作商户凭什么生存呢？
&#160;&#160;&#160; 这些平台服务提供商肯定不希望合作商户在航空公司们的电子商务直销浪潮下消亡掉，在平台上面只剩下几个有限的几个航空公司。平台合作商户的多样化、差异化才能够保证平台对于最终用户的吸引力，也才能够保证平台持久存在的价值。
&#160;&#160;&#160; 在面临日益剧烈的竞争下，平台服务对于合作商户的核心价值在于：通过平台来帮助其提高竞争力。这种竞争力包括服务能力、盈利能力、营销能力、服务的持久性等。
&#160;&#160; 
Technorati 标签: 电子商务,开放平台,客户服务,去哪儿
	
	
	&#169; chuanliang for 出家如初，成佛有余, 2010. &#124;
	  Permalink &#124;
	  No comment
	Add to del.icio.us
	Search blogs linking this post with Technorati
	Want more on these topics ? Browse the archive of posts filed under 产品管理,  电子商务.]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 在去哪儿上买3张成都到北京的机票，一张儿童票、2张成人票。比价后，选择了一家价格较为便宜的分销商下单，跳转到分销商的网站下单时候成人票860，儿童票720，加上保险、机场建设费等费用，总价2622元。做支付时候也没具体留意总的支付金额（呵呵，是够粗心的），完成支付后，等待交易成功的通知。过了2个小时还没有收到短信通知，于是打分销商的客服电话，打了10多次，一直是忙音，语音始终提示前面有2&#8211;8人等待。于是上分销商的网站看订单状态。由于不知道初始密码，通过重置密码方式，接近10多分钟都没收到重置短信。后来按照111111、2222222、333333顺序方式测密码，终于登陆进去了。发现订单发现每张成人票的支付金额为1080元，而且订单中出现了四张成人票记录。好在总价中只计算了两张票的价格。总价为3062元。</p>
<p>&#160;&#160;&#160; 再打电话投诉，仍然一直是忙音。打了2个多小时，打了30多个电话后，终于打通了。把情况一说，客服人员很流利地说明了原因：他们自己系统是有问题，与去哪儿合作的合作页不是实时刷新的，因此在下单时候成人票的价格在他们平台上是1080，而不是860元，要避免此种情况，最好在下单前在他们平台再查询一下实时价格。从客服的解释来看，以前应该也遇见很多这样的问题，很奇怪明知有问题，为何一直不修改，只好退票。退票时候，客服人员问银行账号，而且建议最好是工行的账号。很奇怪，问她：不是通过快钱支付的吗，你直接给我退回我的支付行就行了。客服说不行，如果不用工行而用其他银行账号，退款退回时间不确定。</p>
<p>&#160;&#160;&#160; 懒得再一家一家地比较，担心再出问题，于是直接在去哪儿上比较了一下进行直销的航空公司的价格，找了相对便宜的南方航空下了单。在这过程中，暴露了很多问题，包括：</p>
<p>&#160;&#160;&#160; 1、合作商户系统与平台对接时候信息同步、实时性问题</p>
<p>&#160;&#160;&#160; 2、合作商户系统本身存在很多问题</p>
<p>&#160;&#160;&#160; 3、合作商户本身服务的能力、服务规范性及服务质量</p>
<p>&#160;&#160;&#160; 4、平台服务体验的一致性问题</p>
<p>&#160;&#160;&#160; 5、平台对合作商户资质的选择</p>
<p>&#160;&#160;&#160; 这些问题归根结底可以概括为电子商务平台服务问题，以上问题能否有效解决影响着一个电子商务平台的成败，总结一下零碎思考的一些内容：</p>
<h3><strong>1、平台服务的边界</strong></h3>
<p>&#160;&#160; 对用户而言，在购买机票过程中涉及两个比较大的电子商务平台：去哪儿的机票比价平台、快钱的支付平台。在两个平台作为这些商户的平台服务提供商，理论上只需要能够为这些商户提供好所需要的各种服务就行，合作商户以上的各种问题让合作商户自己搞定就行，不能归结为平台的问题。</p>
<p>&#160;&#160; 但对于最终用户而言，在使用服务过程中出现的各种问题都是平台的问题，他并很不清楚这些系统的边界，他只关心能够通过平台低成本、便捷、安全享受各种服务。如果合作商户不能为客户提供优质的服务，那平台本身的价值也打了很大的折扣。平台要保证服务的一致性，要维护平台核心的价值，就应该树立平台的服务标准，用这些标准来要求商户并帮助合作商户从各个层面上进步。合作商户的高度决定了平台的高度。</p>
<p>&#160;&#160;&#160; 因此作为一个平台本身，在考虑平台建设时候，我们不应当只是盯住平台本身的边界，平台的边界的划分应该以用户视角来看，以保证用户以一致性的体验完成整个购物过程。这就要求平台的合作商户的选择、合作商户服务能力、合作商户系统等问题上必须以平台化的要求来执行，对达不到平台化要求的，或者帮助其进步、或者淘汰。&#160;&#160;&#160; </p>
<h3><strong>2、平台服务的核心价值</strong></h3>
<p>&#160;&#160;&#160; 对于合作商户而言，如果平台只是单纯作为一个销售通路或营销通路，那平台给合作商户带来的价值并不是持久性的，可替代性很高。尤其航空公司们的直销业务在整个机票分销业务中比重愈来愈大的情况下，这些合作商户凭什么生存呢？</p>
<p>&#160;&#160;&#160; 这些平台服务提供商肯定不希望合作商户在航空公司们的电子商务直销浪潮下消亡掉，在平台上面只剩下几个有限的几个航空公司。平台合作商户的多样化、差异化才能够保证平台对于最终用户的吸引力，也才能够保证平台持久存在的价值。</p>
<p>&#160;&#160;&#160; 在面临日益剧烈的竞争下，平台服务对于合作商户的核心价值在于：通过平台来帮助其提高竞争力。这种竞争力包括服务能力、盈利能力、营销能力、服务的持久性等。</p>
<p>&#160;&#160; </p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:0462c118-7282-43b0-858d-edc469cc4f4f" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1');" rel="tag">电子商务</a>,<a href="http://technorati.com/tags/%e5%bc%80%e6%94%be%e5%b9%b3%e5%8f%b0" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e5%bc%80%e6%94%be%e5%b9%b3%e5%8f%b0');" rel="tag">开放平台</a>,<a href="http://technorati.com/tags/%e5%ae%a2%e6%88%b7%e6%9c%8d%e5%8a%a1" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e5%ae%a2%e6%88%b7%e6%9c%8d%e5%8a%a1');" rel="tag">客户服务</a>,<a href="http://technorati.com/tags/%e5%8e%bb%e5%93%aa%e5%84%bf" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e5%8e%bb%e5%93%aa%e5%84%bf');" rel="tag">去哪儿</a></div>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; chuanliang for <a href="http://www.yeeach.com" >出家如初，成佛有余</a>, 2010. |
	  <a href="http://www.yeeach.com/2010/02/28/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e5%b9%b3%e5%8f%b0%e6%9c%8d%e5%8a%a1%e6%9d%82%e6%80%9d/" >Permalink</a> |
	  <a href="http://www.yeeach.com/2010/02/28/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e5%b9%b3%e5%8f%b0%e6%9c%8d%e5%8a%a1%e6%9d%82%e6%80%9d/#comments" >No comment</a></p>
	<p>Add to <a href="http://del.icio.us/post?url=http://www.yeeach.com/2010/02/28/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e5%b9%b3%e5%8f%b0%e6%9c%8d%e5%8a%a1%e6%9d%82%e6%80%9d/&amp;title=电子商务平台之平台服务杂思" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://del.icio.us/post?url=http://www.yeeach.com/2010/02/28/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e5%b9%b3%e5%8f%b0%e6%9c%8d%e5%8a%a1%e6%9d%82%e6%80%9d/&amp;title=电子商务平台之平台服务杂思');">del.icio.us</a></p>
	<p>Search blogs linking this post with <a href="http://www.technorati.com/search/http://www.yeeach.com/2010/02/28/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e5%b9%b3%e5%8f%b0%e6%9c%8d%e5%8a%a1%e6%9d%82%e6%80%9d/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.technorati.com/search/http://www.yeeach.com/2010/02/28/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e5%b9%b3%e5%8f%b0%e6%9c%8d%e5%8a%a1%e6%9d%82%e6%80%9d/');" title="Search on Technorati">Technorati</a></p>
	<p>Want more on these topics ? Browse the archive of posts filed under <a href="http://www.yeeach.com/category/%e4%ba%a7%e5%93%81%e7%ae%a1%e7%90%86/"  title="查看 产品管理 的全部文章" rel="category tag">产品管理</a>,  <a href="http://www.yeeach.com/category/web20-%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1/"  title="查看 电子商务 的全部文章" rel="category tag">电子商务</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.yeeach.com/2010/02/28/%e7%94%b5%e5%ad%90%e5%95%86%e5%8a%a1%e5%b9%b3%e5%8f%b0%e4%b9%8b%e5%b9%b3%e5%8f%b0%e6%9c%8d%e5%8a%a1%e6%9d%82%e6%80%9d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>从Evernote看产品竞争策略</title>
		<link>http://www.yeeach.com/2010/02/19/%e4%bb%8eevernote%e7%9c%8b%e4%ba%a7%e5%93%81%e7%ab%9e%e4%ba%89%e7%ad%96%e7%95%a5/</link>
		<comments>http://www.yeeach.com/2010/02/19/%e4%bb%8eevernote%e7%9c%8b%e4%ba%a7%e5%93%81%e7%ab%9e%e4%ba%89%e7%ad%96%e7%95%a5/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 15:41:29 +0000</pubDate>
		<dc:creator>chuanliang</dc:creator>
				<category><![CDATA[产品管理]]></category>
		<category><![CDATA[Evernote，onenote，产品管理，竞争策略，定位]]></category>

		<guid isPermaLink="false">http://www.yeeach.com/2010/02/19/%e4%bb%8eevernote%e7%9c%8b%e4%ba%a7%e5%93%81%e7%ab%9e%e4%ba%89%e7%ad%96%e7%95%a5/</guid>
		<description><![CDATA[&#160;&#160;&#160; Please, Evernote, wake up. I wanted you to win. 这篇文章不错，虽然只是谈论Evernote与Onenote的竞争策略，但对于产品管理而言，有太多的值得思考借鉴的。作者认为Evernote在过去2年多，丧失了众多的超越Onenote的机会。
&#160;&#160;&#160; 如果我是Evernote的产品经理，我会怎么做呢？总结一下文章的思路：
1、聚焦核心定位：
&#160;&#160;&#160; 相对于Onenote，Evernote作为一个尾随者，在市场影响力及可以利用的资源上都无法与Onenote相匹敌。因此首先最重要的是要时刻遵循自己区隔于Onenote的核心定位：&#34;Notes rethought in Web 2.0&#34;。要找到自己区隔于竞争对手的产品定位很容易（什么定位理论、竞争分析、蓝海理论等满大街烂遍的理论都能够完成），最难的莫过于对产品定位信仰般的坚持，莫过于在定位下对产品功能取舍的平衡及度的把握，莫过于在小有成就后能够压抑住自己进行产品延伸的冲动。
2、改变游戏规则：
&#160;&#160;&#160; 要在与Onenote的竞争中占领上风，依靠比拼功能及用户体验的方式并不能颠覆竞争的格局。一个有效的策略就是所谓的“颠覆性创新”，既然Onenote是收费的、闭源、封闭的，那Evernote可以通过开放平台、Open Source、免费方式来改变游戏规则，让对手不得不放弃其业务核心来遵循你的游戏规则及节奏。Google的「比免费更便宜」的商业模式 可以说是当下最为经典的案例。
3、“抄越”竞争对手：
&#160;&#160;&#160; 有一个强大的竞争对手有时候其实也是一种福气，至少说明市场的价值、机会以及事业的意义。强大的竞争对手是最好的老师，在聚焦核心定位、改变游戏规则的前提下，认真研究学习、抄袭竞争对手优秀的产品功能、用户体验、设计思想，山寨化之并超越之（谓之“抄越”）。虽然我们都在研究竞争对手的产品，但我们缺少对于强大竞争对手的“战略上的藐视，战术上的重视”，更多时候只是处于藐视或自卑的状态，因此基本上只是停留在功能copy层面，并没有用心去领会竞争对手产品的核心设计思想，因此所谓的“抄越”也就无从谈起。
&#160;&#160;&#160; 正如文章所说：I&#8217;m hoping Evernote wakes up, assigns at least one developer full-time to analyze what OneNote did right in usability, run their own usability tests with students, and get Evernote to be the best client-side [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; <a href="http://www.mattie.net/blog/2010/2/13/please-evernote-wake-up-i-wanted-you-to-win.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.mattie.net/blog/2010/2/13/please-evernote-wake-up-i-wanted-you-to-win.html');">Please, Evernote, wake up. I wanted you to win.</a> 这篇文章不错，虽然只是谈论Evernote与Onenote的竞争策略，但对于产品管理而言，有太多的值得思考借鉴的。作者认为Evernote在过去2年多，丧失了众多的超越Onenote的机会。</p>
<p>&#160;&#160;&#160; 如果我是Evernote的产品经理，我会怎么做呢？总结一下文章的思路：</p>
<h3><strong>1、聚焦核心定位：</strong></h3>
<p>&#160;&#160;&#160; 相对于Onenote，Evernote作为一个尾随者，在市场影响力及可以利用的资源上都无法与Onenote相匹敌。因此首先最重要的是要时刻遵循自己区隔于Onenote的核心定位：&quot;Notes rethought in Web 2.0&quot;。要找到自己区隔于竞争对手的产品定位很容易（什么定位理论、竞争分析、蓝海理论等满大街烂遍的理论都能够完成），最难的莫过于对产品定位信仰般的坚持，莫过于在定位下对产品功能取舍的平衡及度的把握，莫过于在小有成就后能够压抑住自己进行产品延伸的冲动。</p>
<h3><strong>2、改变游戏规则：</strong></h3>
<p>&#160;&#160;&#160; 要在与Onenote的竞争中占领上风，依靠比拼功能及用户体验的方式并不能颠覆竞争的格局。一个有效的策略就是所谓的“颠覆性创新”，既然Onenote是收费的、闭源、封闭的，那Evernote可以通过开放平台、Open Source、免费方式来改变游戏规则，让对手不得不放弃其业务核心来遵循你的游戏规则及节奏。Google的<a href="http://apple4.us//2009/11/google-redefines-disruption-the-less-than-free-business-model.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://apple4.us//2009/11/google-redefines-disruption-the-less-than-free-business-model.html');">「比免费更便宜」的商业模式</a> 可以说是当下最为经典的案例。</p>
<h3><strong>3、“抄越”竞争对手：</strong></h3>
<p>&#160;&#160;&#160; 有一个强大的竞争对手有时候其实也是一种福气，至少说明市场的价值、机会以及事业的意义。强大的竞争对手是最好的老师，在聚焦核心定位、改变游戏规则的前提下，认真研究学习、抄袭竞争对手优秀的产品功能、用户体验、设计思想，山寨化之并超越之（谓之“抄越”）。虽然我们都在研究竞争对手的产品，但我们缺少对于强大竞争对手的“战略上的藐视，战术上的重视”，更多时候只是处于藐视或自卑的状态，因此基本上只是停留在功能copy层面，并没有用心去领会竞争对手产品的核心设计思想，因此所谓的“抄越”也就无从谈起。</p>
<p>&#160;&#160;&#160; 正如文章所说：I&#8217;m hoping Evernote wakes up, assigns at least one developer full-time to analyze what OneNote did right in usability, run their own usability tests with students, and get Evernote to be the best client-side note-taking experience in the world.</p>
<h3><strong>4、集中优势资源打歼灭战：</strong></h3>
<p>&#160;&#160; 要集中优势资源对核心产品功能（包括用户体验）进行研发并做到极致，不要将宝贵的资源投到非核心的功能完善上去。产品有了自己的核心优势后才可能有机会将游戏继续下去，“少即是多”。&#160;&#160; </p>
<h3><strong>5、更加注重与用户的互动，倾听用户的声音</strong></h3>
<p>&#160;&#160; 对Evernote而言，拥有这样忠实且专业的用户是最为宝贵的资源，希望Evernote真的能够醒醒倾听用户的心声。</p>
<p>&#160;&#160; 通过与用户的互动及对用户的运营，可以获得第一手的用户需求，保证产品竞争策略的有效性。其实任何产品都有这样用户，只不过很多时候我们太过于自负或是过于忙碌，而最终忘记了产品最终的用户是谁。</p>
<p>&#160;&#160; 写到一半才发现这些道理大家都知道的，懒得写下去了。可为何一家又一家的公司都在犯着同样的错误呢？“纸上得来终觉浅 绝知此事要躬行”。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:8510f1ac-a50f-4413-aa62-8d4d3d6debe9" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/Evernote" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/Evernote');" rel="tag">Evernote</a>,<a href="http://technorati.com/tags/onenote" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/onenote');" rel="tag">onenote</a>,<a href="http://technorati.com/tags/%e4%ba%a7%e5%93%81%e7%ae%a1%e7%90%86" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e4%ba%a7%e5%93%81%e7%ae%a1%e7%90%86');" rel="tag">产品管理</a>,<a href="http://technorati.com/tags/%e7%ab%9e%e4%ba%89%e7%ad%96%e7%95%a5" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e7%ab%9e%e4%ba%89%e7%ad%96%e7%95%a5');" rel="tag">竞争策略</a>,<a href="http://technorati.com/tags/%e5%ae%9a%e4%bd%8d" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e5%ae%9a%e4%bd%8d');" rel="tag">定位</a></div>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; chuanliang for <a href="http://www.yeeach.com" >出家如初，成佛有余</a>, 2010. |
	  <a href="http://www.yeeach.com/2010/02/19/%e4%bb%8eevernote%e7%9c%8b%e4%ba%a7%e5%93%81%e7%ab%9e%e4%ba%89%e7%ad%96%e7%95%a5/" >Permalink</a> |
	  <a href="http://www.yeeach.com/2010/02/19/%e4%bb%8eevernote%e7%9c%8b%e4%ba%a7%e5%93%81%e7%ab%9e%e4%ba%89%e7%ad%96%e7%95%a5/#comments" >7 comments</a></p>
	<p>Add to <a href="http://del.icio.us/post?url=http://www.yeeach.com/2010/02/19/%e4%bb%8eevernote%e7%9c%8b%e4%ba%a7%e5%93%81%e7%ab%9e%e4%ba%89%e7%ad%96%e7%95%a5/&amp;title=从Evernote看产品竞争策略" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://del.icio.us/post?url=http://www.yeeach.com/2010/02/19/%e4%bb%8eevernote%e7%9c%8b%e4%ba%a7%e5%93%81%e7%ab%9e%e4%ba%89%e7%ad%96%e7%95%a5/&amp;title=从Evernote看产品竞争策略');">del.icio.us</a></p>
	<p>Search blogs linking this post with <a href="http://www.technorati.com/search/http://www.yeeach.com/2010/02/19/%e4%bb%8eevernote%e7%9c%8b%e4%ba%a7%e5%93%81%e7%ab%9e%e4%ba%89%e7%ad%96%e7%95%a5/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.technorati.com/search/http://www.yeeach.com/2010/02/19/%e4%bb%8eevernote%e7%9c%8b%e4%ba%a7%e5%93%81%e7%ab%9e%e4%ba%89%e7%ad%96%e7%95%a5/');" title="Search on Technorati">Technorati</a></p>
	<p>Want more on these topics ? Browse the archive of posts filed under <a href="http://www.yeeach.com/category/%e4%ba%a7%e5%93%81%e7%ae%a1%e7%90%86/"  title="查看 产品管理 的全部文章" rel="category tag">产品管理</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.yeeach.com/2010/02/19/%e4%bb%8eevernote%e7%9c%8b%e4%ba%a7%e5%93%81%e7%ab%9e%e4%ba%89%e7%ad%96%e7%95%a5/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>使用CAPICOM实现证书管理</title>
		<link>http://www.yeeach.com/2010/02/16/%e4%bd%bf%e7%94%a8capicom%e5%ae%9e%e7%8e%b0%e8%af%81%e4%b9%a6%e7%ae%a1%e7%90%86/</link>
		<comments>http://www.yeeach.com/2010/02/16/%e4%bd%bf%e7%94%a8capicom%e5%ae%9e%e7%8e%b0%e8%af%81%e4%b9%a6%e7%ae%a1%e7%90%86/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 16:54:19 +0000</pubDate>
		<dc:creator>chuanliang</dc:creator>
				<category><![CDATA[技术相关]]></category>
		<category><![CDATA[数字证书，CAPICOM，cryptapi，PKI，数字签名]]></category>

		<guid isPermaLink="false">http://www.yeeach.com/2010/02/16/%e4%bd%bf%e7%94%a8capicom%e5%ae%9e%e7%8e%b0%e8%af%81%e4%b9%a6%e7%ae%a1%e7%90%86/</guid>
		<description><![CDATA[&#160;&#160;&#160; 在基于ejbca搭建CA时候，需要实现如下功能：
&#160;&#160;&#160; 1）、在客户端实现对页面关键数据（例如订单金额等）采用签名、数字信封等方式进行加密
&#160;&#160;&#160; 2）、能够较好支持USB KEY集成
&#160;&#160;&#160; 3）、用户申请数字证书导入浏览器后，能够通过Web页面对浏览器证书进行重新申请（renewal）、删除、显示、查询、验证等功能
&#160;&#160;&#160; 单独依靠XEnroll.dll或CertEnroll.dll控件已经无法满足以上要求。微软的CAPICOM组件封装了Windows CryptAPI的各种操作，可以在Windows环境下各种语言中使用。而且CAPICOM中的大多数接口都是“脚本安全”的，可以直接在网页脚本中安全使用CAPICOM接口所提供的功能。
&#160;&#160;&#160; 需求1）、2）的实现思路：在前台利用CAPICOM组件读取浏览器或USB盘中的用户证书，对页面表单的关键数据进行SHA1签名。将签名后的密文与页面表单中的明文提交到服务器端。服务器从用户请求密文解密得到用户证书及页面关键数据的摘要（利用Bouncycastle、Apache Commons Codec），验证证书的合法性及有效性。然后对提交的页面明文计算SHA1，把得到的结果与从密文是解出摘要进行对比，从而实现数据完整性的校验。
&#160;&#160;&#160; 需求3）的实现思路：关键是要实现证书的删除、查询、验证功能，结合IE中自动安装用户数字证书 、IE中自动安装根数字证书 ，可以很容易实现相关功能。
&#160; CAPICOM中常用的类主要包括：Store、Certificates、Certificate&#160;
&#160; 基本操作步骤为：创建Store对象-&#62;打开Store对象-&#62;查找需要操作的证书集合（Certificates）-&#62;对单个证书（Certificate）进行操作
&#160;
1、一个简单例子： 
&#60;OBJECT id=&#34;capicom&#34; codeBase=&#34;http://download.microsoft.com/download/E/1/8/E18ED994-8005-4377-A7D7-0A8E13025B94/capicom.cab#version=2,0,0,3&#34; classid=&#34;clsid:A996E48C-D3DC-4244-89F7-AFA33EC60679&#34; VIEWASTEXT&#62;
&#60;/OBJECT&#62;
&#60;script language=&#34;javascript&#34;&#62;
var CAPICOM_CURRENT_USER_STORE = 2
var CAPICOM_MY_STORE = &#34;My&#34;
var CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1
var CAPICOM_STORE_OPEN_READ_WRITE=1
var myStore = new ActiveXObject(&#34;CAPICOM.Store&#34;);
myStore.Open(CAPICOM_CURRENT_USER_STORE,CAPICOM_MY_STORE,CAPICOM_STORE_OPEN_READ_WRITE);
var myStoreCerts = myStore.Certificates;
var info=&#34;&#34;;
for(i = 1; i&#60;= myStoreCerts.Count; i++)
{           [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 在基于ejbca搭建CA时候，需要实现如下功能：</p>
<p>&#160;&#160;&#160; 1）、在客户端实现对页面关键数据（例如订单金额等）采用签名、数字信封等方式进行加密</p>
<p>&#160;&#160;&#160; 2）、能够较好支持USB KEY集成</p>
<p>&#160;&#160;&#160; 3）、用户申请数字证书导入浏览器后，能够通过Web页面对浏览器证书进行重新申请（renewal）、删除、显示、查询、验证等功能</p>
<p>&#160;&#160;&#160; 单独依靠XEnroll.dll或CertEnroll.dll控件已经无法满足以上要求。微软的CAPICOM组件封装了Windows CryptAPI的各种操作，可以在Windows环境下各种语言中使用。而且CAPICOM中的大多数接口都是“脚本安全”的，可以直接在网页脚本中安全使用CAPICOM接口所提供的功能。</p>
<p>&#160;&#160;&#160; <strong>需求1）、2）的实现思路</strong>：在前台利用CAPICOM组件读取浏览器或USB盘中的用户证书，对页面表单的关键数据进行SHA1签名。将签名后的密文与页面表单中的明文提交到服务器端。服务器从用户请求密文解密得到用户证书及页面关键数据的摘要（利用Bouncycastle、Apache Commons Codec），验证证书的合法性及有效性。然后对提交的页面明文计算SHA1，把得到的结果与从密文是解出摘要进行对比，从而实现数据完整性的校验。</p>
<p>&#160;&#160;&#160; <strong>需求3）的实现思路</strong>：关键是要实现证书的删除、查询、验证功能，结合<a href="http://www.yeeach.com/2010/02/14/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e7%94%a8%e6%88%b7%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/" >IE中自动安装用户数字证书 </a>、<a href="http://www.yeeach.com/2010/02/11/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e6%a0%b9%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/" >IE中自动安装根数字证书 </a>，可以很容易实现相关功能。</p>
<p>&#160; CAPICOM中常用的类主要包括：<a href="http://msdn.microsoft.com/en-us/library/aa388120%28VS.85%29.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://msdn.microsoft.com/en-us/library/aa388120%28VS.85%29.aspx');"><strong>Store</strong></a>、<a href="http://msdn.microsoft.com/en-us/library/aa376489%28VS.85%29.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://msdn.microsoft.com/en-us/library/aa376489%28VS.85%29.aspx');"><strong>Certificates</strong></a>、<a href="http://msdn.microsoft.com/en-us/library/aa376092%28VS.85%29.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://msdn.microsoft.com/en-us/library/aa376092%28VS.85%29.aspx');"><strong>Certificate</strong></a>&#160;</p>
<p>&#160; 基本操作步骤为：创建Store对象-&gt;打开Store对象-&gt;查找需要操作的证书集合（<a href="http://msdn.microsoft.com/en-us/library/aa376489%28VS.85%29.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://msdn.microsoft.com/en-us/library/aa376489%28VS.85%29.aspx');"><strong>Certificates</strong></a>）-&gt;对单个证书（<a href="http://msdn.microsoft.com/en-us/library/aa376092%28VS.85%29.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://msdn.microsoft.com/en-us/library/aa376092%28VS.85%29.aspx');"><strong>Certificate</strong></a>）进行操作</p>
<p>&#160;</p>
<h3><strong>1、一个简单例子：</strong><OBJECT id="capicom" codeBase="http://download.microsoft.com/download/E/1/8/E18ED994-8005-4377-A7D7-0A8E13025B94/capicom.cab#version=2,0,0,3" classid="clsid:A996E48C-D3DC-4244-89F7-AFA33EC60679" VIEWASTEXT> </OBJECT></h3>
<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">OBJECT</span> <span class="attr">id</span><span class="kwrd">=&quot;capicom&quot;</span> <span class="attr">codeBase</span><span class="kwrd">=&quot;http://download.microsoft.com/download/E/1/8/E18ED994-8005-4377-A7D7-0A8E13025B94/capicom.cab#version=2,0,0,3&quot;</span> <span class="attr">classid</span><span class="kwrd">=&quot;clsid:A996E48C-D3DC-4244-89F7-AFA33EC60679&quot;</span> <span class="attr">VIEWASTEXT</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">OBJECT</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">script</span> <span class="attr">language</span><span class="kwrd">=&quot;javascript&quot;</span><span class="kwrd">&gt;</span>
<span class="kwrd">var</span> CAPICOM_CURRENT_USER_STORE = 2
<span class="kwrd">var</span> CAPICOM_MY_STORE = <span class="str">&quot;My&quot;</span>
<span class="kwrd">var</span> CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1
<span class="kwrd">var</span> CAPICOM_STORE_OPEN_READ_WRITE=1
<span class="kwrd">var</span> myStore = <span class="kwrd">new</span> ActiveXObject(<span class="str">&quot;CAPICOM.Store&quot;</span>);
myStore.Open(CAPICOM_CURRENT_USER_STORE,CAPICOM_MY_STORE,CAPICOM_STORE_OPEN_READ_WRITE);
<span class="kwrd">var</span> myStoreCerts = myStore.Certificates;
<span class="kwrd">var</span> info=<span class="str">&quot;&quot;</span>;
<span class="kwrd">for</span>(i = 1; i&lt;= myStoreCerts.Count; i++)
{            info+=    <span class="str">&quot; Subject Name : &quot;</span>+myStoreCerts.Item(i).SubjectName +<span class="str">&quot;&lt;br/&gt;&quot;</span>;
}
document.write(info);
<span class="kwrd">&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span></pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>&#160;</p>
<h3><strong>2、一个更复杂的例子：</strong></h3>
<h4><strong>2.1）、capicomtest.html</strong></h4>
<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">html</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">head</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">title</span><span class="kwrd">&gt;</span>CAPICOM使用DEMO<span class="kwrd">&lt;/</span><span class="html">title</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">meta</span> <span class="attr">http-equiv</span><span class="kwrd">=&quot;no-cache&quot;</span><span class="kwrd">&gt;</span>

<span class="kwrd">&lt;/</span><span class="html">head</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">body</span> <span class="attr">onLoad</span><span class="kwrd">=&quot;listCert()&quot;</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">OBJECT</span> <span class="attr">id</span><span class="kwrd">=&quot;capicom&quot;</span> <span class="attr">codeBase</span><span class="kwrd">=&quot;http://download.microsoft.com/download/E/1/8/E18ED994-8005-4377-A7D7-0A8E13025B94/capicom.cab#version=2,0,0,3&quot;</span> <span class="attr">classid</span><span class="kwrd">=&quot;clsid:A996E48C-D3DC-4244-89F7-AFA33EC60679&quot;</span> <span class="attr">VIEWASTEXT</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">OBJECT</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">script</span> <span class="attr">language</span><span class="kwrd">=&quot;javascript&quot;</span> <span class="attr">src</span><span class="kwrd">=&quot;capicom.js&quot;</span><span class="kwrd">&gt;&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">form</span> <span class="attr">name</span><span class="kwrd">=&quot;frmStore&quot;</span> <span class="attr">method</span><span class="kwrd">=&quot;post&quot;</span> <span class="attr">action</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>
  1.读取用户证书
    <span class="kwrd">&lt;</span><span class="html">br</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">br</span><span class="kwrd">&gt;</span>
  证书类型：
  <span class="kwrd">&lt;</span><span class="html">select</span> <span class="attr">id</span><span class="kwrd">=&quot;storeName&quot;</span> <span class="attr">size</span><span class="kwrd">=&quot;1&quot;</span> <span class="attr">name</span><span class="kwrd">=&quot;storeName&quot;</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">option</span> <span class="attr">value</span><span class="kwrd">=&quot;my&quot;</span> <span class="attr">selected</span><span class="kwrd">&gt;</span>Personal<span class="kwrd">&lt;/</span><span class="html">option</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">option</span> <span class="attr">value</span><span class="kwrd">=&quot;root&quot;</span><span class="kwrd">&gt;</span>Root<span class="kwrd">&lt;/</span><span class="html">option</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">option</span> <span class="attr">value</span><span class="kwrd">=&quot;AddressBook&quot;</span><span class="kwrd">&gt;</span>Address Book<span class="kwrd">&lt;/</span><span class="html">option</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">option</span> <span class="attr">value</span><span class="kwrd">=&quot;ca&quot;</span><span class="kwrd">&gt;</span>CA<span class="kwrd">&lt;/</span><span class="html">option</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;/</span><span class="html">select</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">input</span> <span class="attr">type</span><span class="kwrd">=&quot;button&quot;</span> <span class="attr">value</span><span class="kwrd">=&quot;获取证书列表&quot;</span> <span class="attr">onclick</span><span class="kwrd">=&quot;listCert()&quot;</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;/</span><span class="html">p</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">p</span><span class="kwrd">&gt;</span>选择一个证书：<span class="kwrd">&lt;</span><span class="html">br</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">select</span> <span class="attr">id</span><span class="kwrd">=&quot;allCerts&quot;</span> <span class="attr">size</span><span class="kwrd">=&quot;10&quot;</span> <span class="attr">name</span><span class="kwrd">=&quot;allCerts&quot;</span> <span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">select</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">br</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">input</span> <span class="attr">id</span><span class="kwrd">=&quot;delcert&quot;</span> <span class="attr">type</span><span class="kwrd">=&quot;button&quot;</span> <span class="attr">name</span><span class="kwrd">=&quot;delcert&quot;</span> <span class="attr">value</span><span class="kwrd">=&quot;删除选定证书&quot;</span> <span class="attr">onclick</span><span class="kwrd">=&quot;deleteCert()&quot;</span> <span class="kwrd">/&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">input</span> <span class="attr">id</span><span class="kwrd">=&quot;verifydate&quot;</span> <span class="attr">type</span><span class="kwrd">=&quot;button&quot;</span> <span class="attr">name</span><span class="kwrd">=&quot;verifydate&quot;</span> <span class="attr">value</span><span class="kwrd">=&quot;验证选定证书有效期&quot;</span> <span class="attr">onclick</span><span class="kwrd">=&quot;alert(verifyCertValidDate())&quot;</span> <span class="kwrd">/&gt;</span>

<span class="kwrd">&lt;/</span><span class="html">form</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">body</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">html</span><span class="kwrd">&gt;</span></pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>&#160;&#160;&#160; </p>
<p>&#160;</p>
<h3><strong>2.2）、capicom.js</strong></h3>
<pre class="csharpcode">var CAPICOM_CURRENT_USER_STORE = 2
var CAPICOM_MY_STORE = &quot;My&quot;
var CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1
var CAPICOM_STORE_OPEN_READ_WRITE=1

var myStore = new ActiveXObject(&quot;CAPICOM.Store&quot;);
myStore.Open(CAPICOM_CURRENT_USER_STORE,CAPICOM_MY_STORE,CAPICOM_STORE_OPEN_READ_WRITE);      

function deleteCert()
{
    var myStore = new ActiveXObject(&quot;CAPICOM.Store&quot;);
    try{

          var storeName = frmStore.storeName.options(frmStore.storeName.selectedIndex).value;
            myStore.Open(CAPICOM_CURRENT_USER_STORE,storeName,CAPICOM_STORE_OPEN_READ_WRITE);

            var index = frmStore.allCerts.options.selectedIndex;
            var cert = frmStore.allCerts.options[index].value;
          subjectName=getCertCN(cert);

            var myStoreCerts = myStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, subjectName, true);
             for(i = 1; i<span class="kwrd">&lt;</span>= myStoreCerts.Count; i++)
            {
                     if(myStoreCerts.Item(i).HasPrivateKey()){
                         //要删除用户证书，首先要删除私钥，才能够调用Certificates.Remove方法删除证书
                         myStoreCerts.Item(i).PrivateKey.Delete();
                     }

                 myStore.Remove(myStoreCerts.Item(i));
            }
            alert(&quot;删除证书成功&quot;);
            myStoreCerts=null;
            myStore.Close() ;
            myStore=null;    

    }catch(e){
        alert(&quot;删除证书失败，错误码为：&quot;+e.number);

    }
    window.location.reload();
}

function verifyCertValidDate(){
    var myStore = new ActiveXObject(&quot;CAPICOM.Store&quot;);

 try{
         var storeName = frmStore.storeName.options(frmStore.storeName.selectedIndex).value;
        myStore.Open(CAPICOM_CURRENT_USER_STORE,storeName,CAPICOM_STORE_OPEN_READ_WRITE);
    }
    catch (e)
    {
        alert(&quot;打开证书库失败&quot;);
        return ;
    }
    var index = frmStore.allCerts.options.selectedIndex;
    var cert = frmStore.allCerts.options[index].value;
  subjectName=getCertCN(cert);

  var myStoreCerts =  myStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, subjectName, true);
    var result=&quot;&quot;;

    for(i = 1; i<span class="kwrd">&lt;</span>= myStoreCerts.Count; i++)
    {
        var validToDate=new Date(myStoreCerts.Item(i).ValidToDate+&quot;&quot;);
        var currentDate=new Date();
        var diff=(validToDate-currentDate)/(3600*24*1000);

        if(diff <span class="kwrd">&gt;</span>31){
            result=&quot;证书&quot;+myStoreCerts.Item(i).subjectName+&quot; 有效期为：&quot;+formatDate(validToDate);
        }
        else if(diff<span class="kwrd">&lt;</span>=31 &amp;&amp; diff <span class="kwrd">&gt;</span>0){
            result=&quot;证书&quot;+myStoreCerts.Item(i).subjectName+&quot; &quot;+diff+&quot;后即将过期，请更新证书&quot;;
                alert(result);
            return result;
        }
        else{
                result=&quot;证书&quot;+myStoreCerts.Item(i).subjectName+&quot; 已经过期，请更新证书&quot;;
                    alert(result);
                return result;
        }
    }
    if(result==&quot;&quot;)
        return &quot;没有有效期&quot;;
    return result;

}

function listCert()
{
    var myStore = new ActiveXObject(&quot;CAPICOM.Store&quot;);
    try
    {
        var storeName = frmStore.storeName.options(frmStore.storeName.selectedIndex).value;
        myStore.Open(CAPICOM_CURRENT_USER_STORE, storeName, CAPICOM_STORE_OPEN_READ_WRITE);
    }
    catch (e)
    {
        alert(&quot;打开证书库失败&quot;);
        return false;
    }    

    var count = frmStore.allCerts.options.length;
    for (i = 1; i <span class="kwrd">&lt;</span>= count; i++)
    {
        frmStore.allCerts.options.remove(count-i);
    }
    while (frmStore.allCerts.options.length) frmStore.allCerts.options[0] = null;    

    //只列出DN中有yeeach.com的证书
    var myStoreCerts = myStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, &quot;yeeach.com&quot;, true);
    for(i = 1; i<span class="kwrd">&lt;</span>= myStoreCerts.Count; i++)
    {
         var certInfo = new Option(&quot;cert: &quot; + myStoreCerts.Item(i).subjectName );
         certInfo.value=myStoreCerts.Item(i).subjectName ;
        frmStore.allCerts.options.add(certInfo, i);
    }
}

function getCertCN(dn){
    //对于CAPICOM_CA_STORE、CAPICOM_OTHER_STORE、CAPICOM_ROOT_STORE不适用，需要调整
        i=dn.indexOf('CN=');
    if(i==-1){
        return &quot;没有CN&quot;;
    }else{
            cn=dn.substr(i+3);
            return cn;
    }
}

function formatDate(inputDate){
    if(null == inputDate){
        return &quot;&quot;;
    }
    //var year = 1900+date.getYear();
        var year = inputDate.getYear();
    var month = inputDate.getMonth()+1;
    if(month <span class="kwrd">&lt;</span> 10) month = &quot;0&quot;+month;

    var day = inputDate.getDate();
    if(day <span class="kwrd">&lt;</span> 10) day = &quot;0&quot;+day;

    var hour = inputDate.getHours();
    if(hour <span class="kwrd">&lt;</span> 10) hour = &quot;0&quot;+hour;
    var minute = inputDate.getMinutes();
    if(minute <span class="kwrd">&lt;</span> 10) minute = &quot;0&quot;+minute;
    var second = inputDate.getSeconds();
    if(second <span class="kwrd">&lt;</span> 10) second = &quot;0&quot;+second;
    return year+&quot;-&quot;+month+&quot;-&quot;+day;
}</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>&#160;</p>
<p><a href="http://www.yeeach.com/upload/Capicom.rar" >测试代码打包下载</a></p>
<p>&#160;</p>
<h3><strong>3、参考文档：</strong></h3>
<p><a title="http://msdn.microsoft.com/en-us/library/aa375732%28VS.85%29.aspx" href="http://msdn.microsoft.com/en-us/library/aa375732%28VS.85%29.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://msdn.microsoft.com/en-us/library/aa375732%28VS.85%29.aspx');">CAPICOM Reference</a></p>
<p><a title="http://www.blogjava.net/security/archive/2006/07/11/java_cryptoapi_csp_signature.html" href="http://www.blogjava.net/security/archive/2006/07/11/java_cryptoapi_csp_signature.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.blogjava.net/security/archive/2006/07/11/java_cryptoapi_csp_signature.html');">How to use Java produce Signature by USBKey under CryptoAPI/CSP</a></p>
<p><a title="http://bozhobg.wordpress.com/2009/04/16/how-to-create-a-digital-signing-solution-with-only-javascript/" href="http://bozhobg.wordpress.com/2009/04/16/how-to-create-a-digital-signing-solution-with-only-javascript/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://bozhobg.wordpress.com/2009/04/16/how-to-create-a-digital-signing-solution-with-only-javascript/');">How to create a digital signing solution with only JavaScript</a></p>
<p><a title="http://bozhobg.wordpress.com/2009/07/02/how-to-obtain-signers-details-from-a-javascript-signed-data/" href="http://bozhobg.wordpress.com/2009/07/02/how-to-obtain-signers-details-from-a-javascript-signed-data/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://bozhobg.wordpress.com/2009/07/02/how-to-obtain-signers-details-from-a-javascript-signed-data/');">How to obtain signer’s details from a JavaScript signed data</a></p>
<p><a href="http://weblogs.asp.net/jsuarez/archive/2003/02/24/2903.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://weblogs.asp.net/jsuarez/archive/2003/02/24/2903.aspx');">Automatic sign of a text in with a web script using CAPICOM with an ActiveX</a></p>
<p><a title="http://blog.csdn.net/arlaichin/archive/2008/06/18/2562916.aspx" href="http://blog.csdn.net/arlaichin/archive/2008/06/18/2562916.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://blog.csdn.net/arlaichin/archive/2008/06/18/2562916.aspx');">数字证书在WEB应用中登录</a></p>
<p>&#160;</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a1946c75-3029-4bfa-9b0d-6b3182aaeab0" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6');" rel="tag">数字证书</a>,<a href="http://technorati.com/tags/CAPICOM" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/CAPICOM');" rel="tag">CAPICOM</a>,<a href="http://technorati.com/tags/cryptapi" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/cryptapi');" rel="tag">cryptapi</a>,<a href="http://technorati.com/tags/PKI" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/PKI');" rel="tag">PKI</a>,<a href="http://technorati.com/tags/%e6%95%b0%e5%ad%97%e7%ad%be%e5%90%8d" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e6%95%b0%e5%ad%97%e7%ad%be%e5%90%8d');" rel="tag">数字签名</a></div>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; chuanliang for <a href="http://www.yeeach.com" >出家如初，成佛有余</a>, 2010. |
	  <a href="http://www.yeeach.com/2010/02/16/%e4%bd%bf%e7%94%a8capicom%e5%ae%9e%e7%8e%b0%e8%af%81%e4%b9%a6%e7%ae%a1%e7%90%86/" >Permalink</a> |
	  <a href="http://www.yeeach.com/2010/02/16/%e4%bd%bf%e7%94%a8capicom%e5%ae%9e%e7%8e%b0%e8%af%81%e4%b9%a6%e7%ae%a1%e7%90%86/#comments" >No comment</a></p>
	<p>Add to <a href="http://del.icio.us/post?url=http://www.yeeach.com/2010/02/16/%e4%bd%bf%e7%94%a8capicom%e5%ae%9e%e7%8e%b0%e8%af%81%e4%b9%a6%e7%ae%a1%e7%90%86/&amp;title=使用CAPICOM实现证书管理" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://del.icio.us/post?url=http://www.yeeach.com/2010/02/16/%e4%bd%bf%e7%94%a8capicom%e5%ae%9e%e7%8e%b0%e8%af%81%e4%b9%a6%e7%ae%a1%e7%90%86/&amp;title=使用CAPICOM实现证书管理');">del.icio.us</a></p>
	<p>Search blogs linking this post with <a href="http://www.technorati.com/search/http://www.yeeach.com/2010/02/16/%e4%bd%bf%e7%94%a8capicom%e5%ae%9e%e7%8e%b0%e8%af%81%e4%b9%a6%e7%ae%a1%e7%90%86/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.technorati.com/search/http://www.yeeach.com/2010/02/16/%e4%bd%bf%e7%94%a8capicom%e5%ae%9e%e7%8e%b0%e8%af%81%e4%b9%a6%e7%ae%a1%e7%90%86/');" title="Search on Technorati">Technorati</a></p>
	<p>Want more on these topics ? Browse the archive of posts filed under <a href="http://www.yeeach.com/category/%e6%8a%80%e6%9c%af-%e8%bd%af%e4%bb%b6/"  title="查看 技术相关 的全部文章" rel="category tag">技术相关</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.yeeach.com/2010/02/16/%e4%bd%bf%e7%94%a8capicom%e5%ae%9e%e7%8e%b0%e8%af%81%e4%b9%a6%e7%ae%a1%e7%90%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IE中自动安装用户数字证书</title>
		<link>http://www.yeeach.com/2010/02/14/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e7%94%a8%e6%88%b7%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/</link>
		<comments>http://www.yeeach.com/2010/02/14/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e7%94%a8%e6%88%b7%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 16:27:05 +0000</pubDate>
		<dc:creator>chuanliang</dc:creator>
				<category><![CDATA[技术相关]]></category>
		<category><![CDATA[ejbca，数字证书，pki，CertEnroll，XEnroll，createPKCS10，acceptPKCS7]]></category>

		<guid isPermaLink="false">http://www.yeeach.com/2010/02/14/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e7%94%a8%e6%88%b7%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/</guid>
		<description><![CDATA[&#160;&#160;&#160; 在基于ejbca搭建数字证书时候，需要实现用户自助申请数字证书（Certificate signing request）并自动安装到IE浏览器中的功能（Certificate enrollment）。
&#160;&#160;&#160; 相关的资料极其缺少，好在ejbca中有相关的例子可以参考，尽管不是很完整。整理一下研究的大致成果。
1、基本思路：
&#160;&#160;&#160; 1）、Certificate signing request（CSR）
&#160;&#160;&#160;&#160; 证书签发请求（CSR），也叫做证书请求，是从请求者浏览器发送到证书中心来申请一个数字身份证书的一条信息，在公共密钥基础架构系统中。在创建一个 CSR 之前，这个请求者首先产生一个密钥对，为这个私有密钥保密。CSR 包括鉴别请求者一条的信息，和由这个请求者选择的公共密钥。相应的私有密钥不包含在 CSR 中，但是被用于数位签名整个请求。
&#160;&#160;&#160; 在XP、Windows 2003的IE上，通过XEnroll.dll控件的createPKCS10方法来生成CSR（Certificate signing request）。
&#160;&#160; 在Vista,Windows 2008，Windows 7 的IE上，需要使用CertEnroll.dll的X509Enrollment.CX509CertificateRequestPkcs10方法来生成CSR（Certificate signing request）。
&#160; 2）、用户数字证书的自动安装
&#160;&#160;&#160; 要实现用户数字证书在IE浏览器中自动安装，首先要客户端浏览器提交CSR到证书中心服务器，证书中心服务器端根据CSR对用户私钥和公钥进行签名并将签名后的证书返回给客户端。
&#160;&#160; 在XP、Windows 2003的IE上，通过XEnroll.dll控件的acceptPKCS7方法实现证书自动安装到客户端浏览器，大致步骤如下：

&#160;&#160;&#160;&#160;&#160;&#160; &#60;object id=&#8221;XEnroll&#8221; classid=&#8221;clsid:127698e4-e730-4e5c-a2b1-21490a70c8a1&#8243; codebase=&#8221;xenroll.dll&#8221;&#62;&#60;/object&#62; 
&#160;&#160;&#160;&#160;&#160;&#160;&#160; XEnroll.acceptPKCS7
&#160;&#160; 在Vista,Windows 2008，Windows 7 的IE上，需要使用CertEnroll.dll控件的InstallResponse方法来实现自动安装到客户端浏览器，大致过程如下：
&#160;&#160;&#160;&#160;&#160;&#160; &#60;object id=&#8221;CertEnroll&#8221; classid=&#8221;clsid:884e2049-217d-11da-b2a4-000e7bbb2b09&#8243; codebase=&#8221;CertEnroll.dll&#8221;&#62;&#60;/object&#62; 
&#160;&#160;&#160;&#160;&#160;&#160; var objEnroll = CertEnroll.CreateObject(“X509Enrollment.CX509Enrollment”)
&#160;&#160;&#160;&#160;&#160;&#160; Call objEnroll.Initialize(1)
&#160;&#160;&#160;&#160;&#160;&#160; objEnroll.InstallResponse 
&#160;&#160;&#160; 此处安装用户数字证书时候并没有自动安装根证书，根证书自动安装的实现方式可以参考：IE中自动安装根数字证书 
&#160;&#160; 3）、服务器端的处理逻辑
&#160;&#160;&#160;&#160;&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;&nbsp;&nbsp; 在基于ejbca搭建数字证书时候，需要实现用户自助申请数字证书（Certificate signing request）并自动安装到IE浏览器中的功能（Certificate enrollment）。</p>
<p>&nbsp;&nbsp;&nbsp; 相关的资料极其缺少，好在ejbca中有相关的例子可以参考，尽管不是很完整。整理一下研究的大致成果。</p>
<h3><strong>1、基本思路：</strong></h3>
<p>&nbsp;&nbsp;&nbsp; <strong>1）、Certificate signing request（CSR）</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 证书签发请求（CSR），也叫做证书请求，是从请求者浏览器发送到证书中心来申请一个数字身份证书的一条信息，在公共密钥基础架构系统中。在创建一个 CSR 之前，这个请求者首先产生一个密钥对，为这个私有密钥保密。CSR 包括鉴别请求者一条的信息，和由这个请求者选择的公共密钥。相应的私有密钥不包含在 CSR 中，但是被用于数位签名整个请求。</p>
<p>&nbsp;&nbsp;&nbsp; 在XP、Windows 2003的IE上，通过XEnroll.dll控件的createPKCS10方法来生成CSR（Certificate signing request）。</p>
<p>&nbsp;&nbsp; 在Vista,Windows 2008，Windows 7 的IE上，需要使用CertEnroll.dll的X509Enrollment.CX509CertificateRequestPkcs10方法来生成CSR（Certificate signing request）。
<p>&nbsp; <strong>2）、用户数字证书的自动安装</strong></p>
<p>&nbsp;&nbsp;&nbsp; 要实现用户数字证书在IE浏览器中自动安装，首先要客户端浏览器提交CSR到证书中心服务器，证书中心服务器端根据CSR对用户私钥和公钥进行签名并将签名后的证书返回给客户端。</p>
<p>&nbsp;&nbsp; 在XP、Windows 2003的IE上，通过XEnroll.dll控件的acceptPKCS7方法实现证书自动安装到客户端浏览器，大致步骤如下：
<pre></pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;object id=&#8221;XEnroll&#8221; classid=&#8221;clsid:127698e4-e730-4e5c-a2b1-21490a70c8a1&#8243; codebase=&#8221;xenroll.dll&#8221;&gt;&lt;/object&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XEnroll.acceptPKCS7</p>
<p>&nbsp;&nbsp; 在Vista,Windows 2008，Windows 7 的IE上，需要使用CertEnroll.dll控件的InstallResponse方法来实现自动安装到客户端浏览器，大致过程如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;object id=&#8221;CertEnroll&#8221; classid=&#8221;clsid:884e2049-217d-11da-b2a4-000e7bbb2b09&#8243; codebase=&#8221;CertEnroll.dll&#8221;&gt;&lt;/object&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var objEnroll = CertEnroll.CreateObject(“X509Enrollment.CX509Enrollment”)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Call objEnroll.Initialize(1)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objEnroll.InstallResponse </p>
<p>&nbsp;&nbsp;&nbsp; 此处安装用户数字证书时候并没有自动安装根证书，根证书自动安装的实现方式可以参考：<a href="http://www.yeeach.com/2010/02/11/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e6%a0%b9%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/" >IE中自动安装根数字证书 </a></p>
<p>&nbsp;&nbsp; <strong>3）、服务器端的处理逻辑</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在ejbca中src\java\org\ejbca\ui\web\pub\DemoCertReqServlet.java、src\publicweb\publicweb\templates\certInstTemplate.jsp可以作为例子来理解服务器端对CSR请求处理及服务器响应客户端实现证书自动安装的实现机制。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上思路其实应用于openssl的方案也可以。</p>
<h3><strong>2、测试页面</strong></h3>
<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">HTML</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">HEAD</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">meta</span> <span class="attr">http-equiv</span><span class="kwrd">="Content-Type"</span> <span class="attr">content</span><span class="kwrd">="text/html; charset=GBK"</span> <span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">TITLE</span><span class="kwrd">&gt;</span>VBScript Certificate Enrollment Control Request 例子（使用XEnroll）
    <span class="kwrd">&lt;/</span><span class="html">TITLE</span><span class="kwrd">&gt;</span>

<span class="kwrd">&lt;</span><span class="html">OBJECT</span> <span class="attr">classid</span><span class="kwrd">="clsid:127698E4-E730-4E5C-A2b1-21490A70C8A1"</span>
    <span class="attr">codebase</span><span class="kwrd">="xenroll.dll"</span>
    <span class="attr">id</span>=<span class="attr">XEnroll</span> <span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">OBJECT</span><span class="kwrd">&gt;</span>

<span class="kwrd">&lt;</span><span class="html">form</span> <span class="attr">name</span><span class="kwrd">="form1"</span> <span class="attr">id</span><span class="kwrd">="form1"</span> <span class="attr">action</span><span class="kwrd">="http://192.168.1.16/ejbca/democertreq"</span> <span class="attr">method</span><span class="kwrd">="post"</span> <span class="attr">onsubmit</span><span class="kwrd">="cert()"</span><span class="kwrd">&gt;</span>  

<span class="kwrd">&lt;</span><span class="html">center</span><span class="kwrd">&gt;</span>Certificate Enrollment Control Request 例子<span class="kwrd">&lt;</span><span class="html">br</span><span class="kwrd">/&gt;&lt;</span><span class="html">br</span><span class="kwrd">/&gt;</span>
这里只演示使用XEnroll.dll(XP、Windows 2003的IE)来生成CSR的例子<span class="kwrd">&lt;</span><span class="html">br</span><span class="kwrd">/&gt;</span>
在Vista,Windows 2008，Windows 7 的IE上需要使用CertEnroll.dll,与此类似<span class="kwrd">&lt;</span><span class="html">br</span><span class="kwrd">/&gt;</span>

    <span class="rem">&lt;!--ejbca 中设定的Certificate Profile--&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">input</span> <span class="attr">name</span><span class="kwrd">="certificateprofile"</span> <span class="attr">value</span><span class="kwrd">="liang"</span> <span class="attr">type</span><span class="kwrd">="hidden"</span><span class="kwrd">&gt;</span>
    <span class="rem">&lt;!--ejbca 中设定的End Entity Profile--&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">input</span> <span class="attr">name</span><span class="kwrd">="entityprofile"</span> <span class="attr">value</span><span class="kwrd">="liang"</span> <span class="attr">type</span><span class="kwrd">="hidden"</span><span class="kwrd">&gt;&lt;</span><span class="html">br</span><span class="kwrd">&gt;</span>
  <span class="rem">&lt;!-- XEnroll.createPKCS10产生的CSR值 --&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">input</span> <span class="attr">name</span><span class="kwrd">="pkcs10req"</span> <span class="attr">id</span><span class="kwrd">="pkcs10req"</span>  <span class="attr">type</span><span class="kwrd">="hidden"</span><span class="kwrd">&gt;&lt;</span><span class="html">br</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">br</span><span class="kwrd">&gt;</span>
  <span class="rem">&lt;!-- DemoCertReqServlet需要user参数 --&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">input</span> <span class="attr">name</span><span class="kwrd">="user"</span> <span class="attr">value</span><span class="kwrd">="C=CN,O=yeeach.com,OU=yeeach.com,CN=liang"</span>  <span class="attr">type</span><span class="kwrd">="hidden"</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">table</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">tr</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">td</span> <span class="attr">align</span><span class="kwrd">="right"</span><span class="kwrd">&gt;</span>用户DN之Canonical Name(CN):<span class="kwrd">&lt;/</span><span class="html">td</span><span class="kwrd">&gt;&lt;</span><span class="html">td</span><span class="kwrd">&gt;&lt;</span><span class="html">input</span> <span class="attr">name</span><span class="kwrd">="canonical_name"</span> <span class="attr">value</span><span class="kwrd">="liang"</span>  <span class="attr">type</span><span class="kwrd">="text"</span><span class="kwrd">&gt;&lt;/</span><span class="html">td</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;/</span><span class="html">tr</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">tr</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">td</span> <span class="attr">align</span><span class="kwrd">="right"</span><span class="kwrd">&gt;</span>用户DN之Organization(O):<span class="kwrd">&lt;/</span><span class="html">td</span><span class="kwrd">&gt;&lt;</span><span class="html">td</span><span class="kwrd">&gt;&lt;</span><span class="html">input</span> <span class="attr">name</span><span class="kwrd">="organization"</span> <span class="attr">value</span><span class="kwrd">="yeeach.com"</span>  <span class="attr">type</span><span class="kwrd">="text"</span><span class="kwrd">&gt;&lt;/</span><span class="html">td</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;/</span><span class="html">tr</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">tr</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">td</span> <span class="attr">align</span><span class="kwrd">="right"</span><span class="kwrd">&gt;</span>用户DN之Organization Unit(C):<span class="kwrd">&lt;/</span><span class="html">td</span><span class="kwrd">&gt;&lt;</span><span class="html">td</span><span class="kwrd">&gt;&lt;</span><span class="html">input</span> <span class="attr">name</span><span class="kwrd">="organization_unit"</span> <span class="attr">value</span><span class="kwrd">="R&amp;D"</span>  <span class="attr">type</span><span class="kwrd">="text"</span><span class="kwrd">&gt;&lt;/</span><span class="html">td</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;/</span><span class="html">tr</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">tr</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">td</span> <span class="attr">align</span><span class="kwrd">="right"</span><span class="kwrd">&gt;</span>用户DN之County(C):<span class="kwrd">&lt;/</span><span class="html">td</span><span class="kwrd">&gt;&lt;</span><span class="html">td</span><span class="kwrd">&gt;&lt;</span><span class="html">input</span> <span class="attr">name</span><span class="kwrd">="country"</span> <span class="attr">value</span><span class="kwrd">="CN"</span>  <span class="attr">type</span><span class="kwrd">="text"</span><span class="kwrd">&gt;&lt;/</span><span class="html">td</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;/</span><span class="html">tr</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">tr</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">td</span> <span class="attr">align</span><span class="kwrd">="right"</span><span class="kwrd">&gt;</span>用户密码：<span class="kwrd">&lt;/</span><span class="html">td</span><span class="kwrd">&gt;&lt;</span><span class="html">td</span><span class="kwrd">&gt;&lt;</span><span class="html">input</span> <span class="attr">name</span><span class="kwrd">="password"</span> <span class="attr">value</span><span class="kwrd">="liang"</span> <span class="attr">type</span><span class="kwrd">="password"</span><span class="kwrd">&gt;&lt;/</span><span class="html">td</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;/</span><span class="html">tr</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">tr</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">td</span> <span class="attr">align</span><span class="kwrd">="right"</span><span class="kwrd">&gt;</span>邮箱:<span class="kwrd">&lt;/</span><span class="html">td</span><span class="kwrd">&gt;&lt;</span><span class="html">td</span><span class="kwrd">&gt;&lt;</span><span class="html">input</span> <span class="attr">name</span><span class="kwrd">="email"</span> <span class="attr">type</span><span class="kwrd">="text"</span> <span class="attr">value</span><span class="kwrd">="chuanliang@gmail.com"</span><span class="kwrd">&gt;&lt;/</span><span class="html">td</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;/</span><span class="html">tr</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">tr</span><span class="kwrd">&gt;&lt;</span><span class="html">td</span><span class="kwrd">&gt;&lt;/</span><span class="html">td</span><span class="kwrd">&gt;&lt;</span><span class="html">td</span><span class="kwrd">&gt;&lt;/</span><span class="html">td</span><span class="kwrd">&gt;&lt;/</span><span class="html">tr</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">tr</span><span class="kwrd">&gt;&lt;</span><span class="html">td</span><span class="kwrd">&gt;&lt;/</span><span class="html">td</span><span class="kwrd">&gt;&lt;</span><span class="html">td</span><span class="kwrd">&gt;&lt;/</span><span class="html">td</span><span class="kwrd">&gt;&lt;/</span><span class="html">tr</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">tr</span><span class="kwrd">&gt;&lt;</span><span class="html">td</span> <span class="attr">align</span><span class="kwrd">="center"</span> <span class="attr">colspan</span><span class="kwrd">="2"</span><span class="kwrd">&gt;&lt;</span><span class="html">input</span> <span class="attr">value</span><span class="kwrd">="申请证书"</span> <span class="attr">name</span><span class="kwrd">="submit"</span> <span class="attr">type</span><span class="kwrd">="submit"</span> <span class="kwrd">&gt;&lt;/</span><span class="html">td</span><span class="kwrd">&gt;&lt;/</span><span class="html">tr</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;/</span><span class="html">table</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">input</span> <span class="attr">name</span><span class="kwrd">="includeemail"</span> <span class="attr">value</span><span class="kwrd">="true"</span> <span class="attr">type</span><span class="kwrd">="hidden"</span><span class="kwrd">&gt;</span>

 <span class="kwrd">&lt;/</span><span class="html">form</span><span class="kwrd">&gt;</span>

  <span class="kwrd">&lt;</span><span class="html">SCRIPT</span> <span class="attr">language</span><span class="kwrd">="VBScript"</span><span class="kwrd">&gt;</span>
  Sub   cert
&lt;!--
<span class="str">' Declare the distinguished name variable.
Dim strDN

'</span> Declare the request variable.
Dim strReq

<span class="str">' Enable error handling.
On Error Resume Next

'</span> Declare consts used by CertRequest <span class="kwrd">object</span>.
<span class="kwrd">const</span> CR_IN_BASE64 = &amp;H1
<span class="kwrd">const</span> CR_IN_PKCS10 = &amp;H100

<span class="str">' Build the DN.

strDN =  "CN="+document.getElementById("canonical_name").value  _
      &amp; ",OU="+document.getElementById("organization_unit").value _
      &amp; ",O="+document.getElementById("organization").value _
      &amp; ",C="+document.getElementById("country").value

'</span> Attempt to use the control, <span class="kwrd">in</span> <span class="kwrd">this</span> <span class="kwrd">case</span>, to create a PKCS #10.
MsgBox(<span class="str">"Creating PKCS #10 "</span> &amp; strDN)
document.getElementById(<span class="str">"user"</span>).value=strDN
strReq = XEnroll.createPKCS10(strDN,<span class="str">" "</span>)
<span class="str">' If above line failed, Err.Number will not be 0.
if ( Err.Number &lt;&gt; 0 ) then
    MsgBox("Error in call to createPKCS10 " &amp; Err.Number)
    err.clear
else
    '</span>MsgBox(<span class="str">"Submitting request "</span> &amp; strReq)

    ' If the preceding line failed, Err.Number will not be 0.
    <span class="kwrd">if</span> ( Err.Number &lt;&gt; 0 ) then
        MsgBox(<span class="str">"Error in Request Submit "</span> &amp; Err.Number)
        err.clear
        <span class="kwrd">return</span> <span class="kwrd">false</span>
    <span class="kwrd">else</span>
        document.getElementById(<span class="str">"pkcs10req"</span>).value=_
        <span class="str">"-----BEGIN NEW CERTIFICATE REQUEST-----"</span> + _
        CHR(13) + _
        strReq + _
        <span class="str">"-----END NEW CERTIFICATE REQUEST-----"</span>

    end <span class="kwrd">if</span>

end <span class="kwrd">if</span>
  Exit   Sub
  End   Sub
--&gt;
<span class="kwrd">&lt;/</span><span class="html">SCRIPT</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">body</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">html</span><span class="kwrd">&gt;</span>
</pre>
<p>&nbsp;</p>
<h3><strong>3、certInstTemplate.jsp</strong></h3>
<pre class="csharpcode"><span class="rem">&lt;!-- Header --&gt;</span>

<span class="kwrd">&lt;!</span><span class="html">DOCTYPE</span> <span class="attr">html</span> <span class="attr">PUBLIC</span> <span class="kwrd">"-//W3C//DTD XHTML 1.0 Transitional//EN"</span>
     <span class="kwrd">"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">html</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">head</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">meta</span> <span class="attr">http-equiv</span><span class="kwrd">="Content-Type"</span> <span class="attr">content</span><span class="kwrd">="text/html; charset=ISO-8859-1"</span> <span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">title</span><span class="kwrd">&gt;</span>EJBCA Certification Authority<span class="kwrd">&lt;/</span><span class="html">title</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">link</span> <span class="attr">rel</span><span class="kwrd">="stylesheet"</span> <span class="attr">href</span><span class="kwrd">="styles.css"</span> <span class="attr">type</span><span class="kwrd">="text/css"</span> <span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">script</span> <span class="attr">type</span><span class="kwrd">="text/javascript"</span> <span class="attr">src</span><span class="kwrd">="scripts/functions.js"</span><span class="kwrd">&gt;&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span>
    &lt;script type=<span class="str">"text/vbscript"</span> src=<span class="str">"scripts/functions.vbs"</span>&gt;&lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;

    &lt;div <span class="kwrd">class</span>=<span class="str">"main"</span>&gt;
      &lt;div <span class="kwrd">class</span>=<span class="str">"content"</span>&gt;
&lt;!-- Header --&gt;

&lt;<span class="kwrd">object</span> classid=<span class="str">"$CLASSID"</span> id=<span class="str">"g_objClassFactory"</span>&gt;&lt;/<span class="kwrd">object</span>&gt;
&lt;!-- Updated w CertEnroll <span class="kwrd">for</span> Vista
Class ID: {884e2049-217d-11da-b2a4-000e7bbb2b09}
--&gt;
&lt;!-- New updated enrollment activeX-control 2002-09-02 (Q323172)
New Xenroll.dll information:
Class ID: {127698e4-e730-4e5c-a2b1-21490a70c8a1}
sXEnrollVersion=<span class="str">"5,131,3659,0"</span>

New Scrdenrl.dll information:
Class ID: {c2bbea20-1f2b-492f-8a06-b1c5ffeace3b}
sScrdEnrlVersion=<span class="str">"5,131,3642,0"</span>
--&gt;
&lt;!-- Old Xenroll.dll information:
Class ID: {43F8F289-7A20-11D0-8F06-00C04FC295E1}

Old Scrdenrl.dll information:
Class ID: {80CB7887-20DE-11D2-8D5C-00C04FC29D45}
--&gt;

    &lt;script language=<span class="str">"VBScript"</span> type=<span class="str">"text/vbscript"</span>&gt;
        cert = <span class="str">"MIICdgYJKoZIhvcNAQcCoIICZzCCAmMCAQExADALBgkqhkiG9w0BBwGgggJLMIIC"</span> &amp; _

        <span class="str">' This function can be moved to functions.vbs when the header is parsed as jsp
        Sub installcertvista
            Dim objEnroll
            Set objEnroll = g_objClassFactory.CreateObject("X509Enrollment.CX509Enrollment")
            Call objEnroll.Initialize(1)    '</span>EnrollmentContext UserContext
            err.clear
            On Error Resume Next
            Call objEnroll.InstallResponse(0, cert, 6, <span class="str">""</span>)    <span class="str">'AllowNone, , XCN_CRYPT_STRING_BASE64_ANY, pw
            If err.number = -2146762487    Then    '</span> 0x800b0109 Not trusted root
                r = Msgbox(<span class="str">"Could not complete the request since, the CAs' certificates were not properly installed."</span>, , <span class="str">"Certificate Management"</span>)
            ElseIf err.number &lt;&gt; 0 Then
                r = Msgbox(<span class="str">"The certificate could not be installed"</span>, , <span class="str">"Certificate Management"</span>)
            Else
                r = Msgbox(<span class="str">"A new certificate has been installed"</span>, , <span class="str">"Certificate Management"</span>)
            End If
        End Sub

        Sub installcert
            Err.Clear
            On Error Resume Next
            g_objClassFactory.acceptPKCS7(cert)
            If Err.Number &lt;&gt; 0 Then
                r = Msgbox(<span class="str">"The certificate could not be installed in this web browser"</span>, , <span class="str">"Certificate Management"</span>)
            Else
                r = Msgbox (<span class="str">"A new certificate has been installed"</span>, , <span class="str">"Certificate Management"</span>)
            End <span class="kwrd">if</span>
        End Sub

        If InStr(navigator.userAgent, <span class="str">"Windows NT 6"</span>) &lt;&gt; 0 Then
            installcertvista
        Else
            installcert
        End If
    <span class="kwrd">&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span>

    <span class="kwrd">&lt;</span><span class="html">h1</span> <span class="attr">class</span><span class="kwrd">="title"</span><span class="kwrd">&gt;</span>Internet Explorer Certificate enrollment.<span class="kwrd">&lt;/</span><span class="html">h1</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">p</span><span class="kwrd">&gt;</span>If the installation was completed without any errors, your certificate has
    been installed in your web browser and you may now start using your certificate.<span class="kwrd">&lt;</span><span class="html">br</span> <span class="kwrd">/&gt;</span>
    You can look at your certificate with <span class="attr">&amp;quot;</span><span class="kwrd">&lt;</span><span class="html">tt</span><span class="kwrd">&gt;</span>Tools-<span class="attr">&amp;gt;</span>Internet
    Options-<span class="attr">&amp;gt;</span>Content-<span class="attr">&amp;gt;</span>Certificates<span class="kwrd">&lt;/</span><span class="html">tt</span><span class="kwrd">&gt;</span><span class="attr">&amp;quot;</span>.<span class="kwrd">&lt;/</span><span class="html">p</span><span class="kwrd">&gt;</span>

<span class="rem">&lt;!-- Footer --&gt;</span>
      <span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;/</span><span class="html">body</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">html</span><span class="kwrd">&gt;</span>
<span class="rem">&lt;!-- Footer --&gt;</span>
</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<h3>&nbsp; </h3>
<h3><strong>4、参考资料</strong></h3>
<p><font color="#404040">&nbsp;&nbsp; </font><a href="http://www.yeeach.com/2010/02/11/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e6%a0%b9%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/" >IE中自动安装根数字证书</a> </p>
<p>&nbsp;&nbsp; <a href="http://msdn.microsoft.com/en-us/library/aa374863%28VS.85%29.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://msdn.microsoft.com/en-us/library/aa374863%28VS.85%29.aspx');">Certificate Enrollment API</a></p>
<p>&nbsp;&nbsp; <a href="http://dgiakoumakis.wordpress.com/2008/01/02/certificate-web-requestenrollment-on-windows-vistaserver-2008/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://dgiakoumakis.wordpress.com/2008/01/02/certificate-web-requestenrollment-on-windows-vistaserver-2008/');">Certificate Web Request/Enrollment on Windows Vista/Server 2008</a></p>
<p>&nbsp;&nbsp; <a href="http://www.itillious.com/insight/articles/simplepki.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.itillious.com/insight/articles/simplepki.html');">Simple PKI</a></p>
<p>&nbsp;&nbsp; <a href="http://www.jroller.com/whoami/entry/browser_generated_certificate_requests" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.jroller.com/whoami/entry/browser_generated_certificate_requests');">Browser-generated Certificate Requests</a></p>
<p>&nbsp;</p>
</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c2f9a826-6a9e-453a-a2d0-7994bbb0e37f" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/ejbca" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/ejbca');" rel="tag">ejbca</a>,<a href="http://technorati.com/tags/%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6');" rel="tag">数字证书</a>,<a href="http://technorati.com/tags/pki" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/pki');" rel="tag">pki</a>,<a href="http://technorati.com/tags/CertEnroll" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/CertEnroll');" rel="tag">CertEnroll</a>,<a href="http://technorati.com/tags/XEnroll" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/XEnroll');" rel="tag">XEnroll</a>,<a href="http://technorati.com/tags/createPKCS10" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/createPKCS10');" rel="tag">createPKCS10</a>,<a href="http://technorati.com/tags/acceptPKCS7" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/acceptPKCS7');" rel="tag">acceptPKCS7</a></div>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; chuanliang for <a href="http://www.yeeach.com" >出家如初，成佛有余</a>, 2010. |
	  <a href="http://www.yeeach.com/2010/02/14/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e7%94%a8%e6%88%b7%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/" >Permalink</a> |
	  <a href="http://www.yeeach.com/2010/02/14/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e7%94%a8%e6%88%b7%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/#comments" >One comment</a></p>
	<p>Add to <a href="http://del.icio.us/post?url=http://www.yeeach.com/2010/02/14/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e7%94%a8%e6%88%b7%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/&amp;title=IE中自动安装用户数字证书" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://del.icio.us/post?url=http://www.yeeach.com/2010/02/14/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e7%94%a8%e6%88%b7%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/&amp;title=IE中自动安装用户数字证书');">del.icio.us</a></p>
	<p>Search blogs linking this post with <a href="http://www.technorati.com/search/http://www.yeeach.com/2010/02/14/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e7%94%a8%e6%88%b7%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.technorati.com/search/http://www.yeeach.com/2010/02/14/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e7%94%a8%e6%88%b7%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/');" title="Search on Technorati">Technorati</a></p>
	<p>Want more on these topics ? Browse the archive of posts filed under <a href="http://www.yeeach.com/category/%e6%8a%80%e6%9c%af-%e8%bd%af%e4%bb%b6/"  title="查看 技术相关 的全部文章" rel="category tag">技术相关</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.yeeach.com/2010/02/14/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e7%94%a8%e6%88%b7%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>IE中自动安装根数字证书</title>
		<link>http://www.yeeach.com/2010/02/11/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e6%a0%b9%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/</link>
		<comments>http://www.yeeach.com/2010/02/11/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e6%a0%b9%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 14:27:13 +0000</pubDate>
		<dc:creator>chuanliang</dc:creator>
				<category><![CDATA[技术相关]]></category>
		<category><![CDATA[数字证书，根证书，ejbca，pki，CertEnroll，XEnroll]]></category>

		<guid isPermaLink="false">http://www.yeeach.com/2010/02/11/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e6%a0%b9%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/</guid>
		<description><![CDATA[基本思路：
1、在XP、Windows 2003的IE上，通过XEnroll.dll控件来完成根数字证书的自动安装。
2、在Vista,Windows 2008，Windows 7 的IE上，需要使用CertEnroll.dll来自动完成根数字证书的自动安装。
3、XEnroll.InstallPKCS7只适用于自动安装根证书。XEnroll.acceptPKCS7 用于安装用户数字证书，但需要配合CSR（Certificate signing request）才能够使用。要实现自动安装用户证书:
在IE中：需要配合Enroll.createPKCS10CSR来生成CSR（Certificate signing request）
在Firefox中：需要配合使用html的keygen标签来生成CSR
4、如果只需要能够下载证书并安装，而不要在IE浏览器中完成证书注销、证书申请等功能，可以采用下载证书文件的方式，MIME Type可以采用
application/x-pkcs12、application/pkcs-12
几个与PKI证书相关的MIME Type：
application/x-x509-ca-cert、application/x-x509-user-cert、application/pkcs10、application/x-pkcs10、application/pkcs-12、
application/x-pkcs12、application/x-pkcs7-signature、application/pkcs7-mime、application/x-pkcs7-mime、
application/pkcs7-mime、application/x-pkcs7-mime、application/x-pkcs7-certreqresp、application/pkcs7-signature
  测试代码:

&#60;%@ page language="java" import="java.util.*" pageEncoding="GBK"%&#62;
&#60;%@ page import="java.lang.*,java.io.*" %&#62;
&#60;html&#62;
&#60;head&#62;
&#60;title&#62;IE中自动安装数字证书测试&#60;/title&#62;
&#60;/head&#62;

&#60;body&#62;
IE中使用XEnroll.InstallPKCS7自动安装根数字证书&#60;br/&#62;
 备注：这里测试的根证书采用Base64编码 X.509格式(CER)&#60;br/&#62;
&#60;%     

StringBuffer server_cert =new StringBuffer();
try {
    String realPath = this.getClass().getClassLoader().getResource("liangchuan.cer").getPath();
    File file = new File(realPath);
    if (!file.exists()) {
     [...]]]></description>
			<content:encoded><![CDATA[<p>基本思路：</p>
<p>1、在XP、Windows 2003的IE上，通过XEnroll.dll控件来完成根数字证书的自动安装。</p>
<p>2、在Vista,Windows 2008，Windows 7 的IE上，需要使用CertEnroll.dll来自动完成根数字证书的自动安装。</p>
<p>3、XEnroll.InstallPKCS7只适用于自动安装根证书。XEnroll.acceptPKCS7 用于安装用户数字证书，但需要配合CSR（Certificate signing request）才能够使用。要实现自动安装用户证书:</p>
<p>在IE中：需要配合Enroll.createPKCS10CSR来生成CSR（Certificate signing request）</p>
<p>在Firefox中：需要配合使用html的keygen标签来生成CSR</p>
<p>4、如果只需要能够下载证书并安装，而不要在IE浏览器中完成证书注销、证书申请等功能，可以采用下载证书文件的方式，MIME Type可以采用</p>
<p>application/x-pkcs12、application/pkcs-12</p>
<p>几个与PKI证书相关的MIME Type：</p>
<p>application/x-x509-ca-cert、application/x-x509-user-cert、application/pkcs10、application/x-pkcs10、application/pkcs-12、</p>
<p>application/x-pkcs12、application/x-pkcs7-signature、application/pkcs7-mime、application/x-pkcs7-mime、</p>
<p>application/pkcs7-mime、application/x-pkcs7-mime、application/x-pkcs7-certreqresp、application/pkcs7-signature</p>
<pre class="csharpcode"><span class="asp"> </span> 测试代码:</pre>
<pre class="csharpcode"></pre>
<pre class="csharpcode"><span class="asp">&lt;%@ page language="java" import="java.util.*" pageEncoding="GBK"%&gt;</span>
<span class="asp">&lt;%@ page import="java.lang.*,java.io.*" %&gt;</span>
<span class="kwrd">&lt;</span><span class="html">html</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">head</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">title</span><span class="kwrd">&gt;</span>IE中自动安装数字证书测试<span class="kwrd">&lt;/</span><span class="html">title</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">head</span><span class="kwrd">&gt;</span>

<span class="kwrd">&lt;</span><span class="html">body</span><span class="kwrd">&gt;</span>
IE中使用XEnroll.InstallPKCS7自动安装根数字证书<span class="kwrd">&lt;</span><span class="html">br</span><span class="kwrd">/&gt;</span></pre>
<pre class="csharpcode"><span class="kwrd"> </span>备注：这里测试的根证书采用Base64编码 X.509格式(CER)<span class="kwrd">&lt;</span><span class="html">br</span><span class="kwrd">/&gt;</span>
<span class="asp">&lt;%</span>     

StringBuffer server_cert =<span class="kwrd">new</span> StringBuffer();
<span class="kwrd">try</span> {
    String realPath = <span class="kwrd">this</span>.getClass().getClassLoader().getResource(<span class="str">"liangchuan.cer"</span>).getPath();
    File file = <span class="kwrd">new</span> File(realPath);
    <span class="kwrd">if</span> (!file.exists()) {
        <span class="kwrd">out</span>.println(<span class="str">"&lt;HTML&gt;&lt;BODY&gt;&lt;P&gt;"</span>);
        <span class="kwrd">out</span>.println(<span class="str">"&lt;h2&gt;根证书文件不存在&lt;/h2&gt; &lt;br/&gt;"</span>);
        <span class="kwrd">out</span>.println(<span class="str">"&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;"</span>);
        <span class="kwrd">out</span>.flush();
        <span class="kwrd">out</span>.close();
    }<span class="kwrd">else</span>{
        BufferedReader bf=<span class="kwrd">new</span> BufferedReader(<span class="kwrd">new</span> FileReader(file));
        String line=<span class="kwrd">null</span>;
        <span class="kwrd">while</span>((line=bf.readLine())!=<span class="kwrd">null</span>)
            server_cert.append(line);

        bf.close();

    }
}<span class="kwrd">catch</span>(Exception e){
    <span class="kwrd">out</span>.println(<span class="str">"&lt;HTML&gt;&lt;BODY&gt;&lt;P&gt;"</span>);
    <span class="kwrd">out</span>.println(<span class="str">"&lt;h2&gt;读取证书文件出错&lt;/h2&gt; &lt;br/&gt;"</span>);
    <span class="kwrd">out</span>.println(e.toString());
    <span class="kwrd">out</span>.println(<span class="str">"&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;"</span>);
    <span class="kwrd">out</span>.flush();
    <span class="kwrd">out</span>.close();
}

String Agent = request.getHeader(<span class="str">"User-Agent"</span>);
StringTokenizer st = <span class="kwrd">new</span> StringTokenizer(Agent,<span class="str">";"</span>);
st.nextToken();
String userBrowser = st.nextToken();
String userOS = st.nextToken();
<span class="kwrd">out</span>.println(<span class="str">"你的操作系统为："</span>);
<span class="kwrd">out</span>.println(userOS);
String activexLib=<span class="str">"XEnroll"</span>;

<span class="rem">//检查是否是Windows Vista,Windows 2008,Windows 7,在Vista,Windows 2008，Windows 7上，需要使用 CertEnroll.dll</span>
<span class="rem">//Windows 2008 Server, IE7 User-Agent header: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2;...</span>
<span class="rem">//Windows Vista, IE7 User-Agent header: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0;...</span>
<span class="rem">//Windows 7,IE8 User-Agent header: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1;...</span>

<span class="kwrd">if</span>(userOS.equals(<span class="str">"Windows NT 6.0"</span>) || userOS.equals(<span class="str">"Windows NT 6.1"</span>)|| userOS.equals(<span class="str">"Windows NT 5.2"</span>))
    activexLib=<span class="str">"CertEnroll"</span>;

String sPKCS7=server_cert.toString();
<span class="asp">%&gt;</span>

<span class="asp">&lt;%</span> <span class="kwrd">if</span>(activexLib.equals(<span class="str">"XEnroll"</span>))
{ <span class="asp">%&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">object</span> <span class="attr">id</span><span class="kwrd">="XEnroll"</span> <span class="attr">classid</span><span class="kwrd">="clsid:127698e4-e730-4e5c-a2b1-21490a70c8a1"</span> <span class="attr">codebase</span><span class="kwrd">="xenroll.dll"</span><span class="kwrd">&gt;&lt;/</span><span class="html">object</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">SCRIPT</span> <span class="attr">language</span><span class="kwrd">="VBSCRIPT"</span><span class="kwrd">&gt;</span>
        ON ERROR resume next
        sPKCS7 = <span class="str">"&lt;%= sPKCS7 %&gt;"</span>
        <span class="rem">//XEnroll.InstallPKCS7用于安装根证书。</span>
        XEnroll.InstallPKCS7(sPKCS7)

        <span class="kwrd">if</span> err.Number &lt;&gt; 0 then
            <span class="kwrd">if</span> err.number = -2146885628 then
                MsgBox <span class="str">"Keyset does not exist"</span>
            <span class="kwrd">else</span>
                MsgBox <span class="str">"证书下载时出错,错误号="</span>&amp;err.description
            end <span class="kwrd">if</span>
        <span class="kwrd">else</span>
            MsgBox <span class="str">"证书已成功装入"</span>
        end <span class="kwrd">if</span>
<span class="kwrd">&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span>
&lt;% } <span class="kwrd">else</span> {%&gt;

<span class="rem">//方法来源：</span>
<span class="rem">//http://blogs.msdn.com/alejacma/archive/2009/01/28/how-to-create-a-certificate-request-with-certenroll-javascript.aspx</span>
<span class="rem">//Vista下由于暂时没有测试环境，方法尚待验证</span>

    &lt;<span class="kwrd">object</span> id=<span class="str">"objCertEnrollClassFactory"</span> classid=<span class="str">"clsid:884e2049-217d-11da-b2a4-000e7bbb2b09"</span>&gt;&lt;/<span class="kwrd">object</span>&gt;
    &lt;script language=<span class="str">"javascript"</span>&gt;
    <span class="kwrd">function</span> InstallCert()
    {
        document.write(<span class="str">"&lt;br&gt;Installing certificate..."</span>);
        <span class="kwrd">try</span> {
            <span class="rem">// Variables</span>
            <span class="kwrd">var</span> objEnroll = objCertEnrollClassFactory.CreateObject(<span class="str">"X509Enrollment.CX509Enrollment"</span>)
            <span class="kwrd">var</span> sPKCS7 = <span class="str">"&lt;%= sPKCS7 %&gt;"</span>
            objEnroll.Initialize(1); <span class="rem">// ContextUser</span>
            objEnroll.InstallResponse(0, sPKCS7, 6, <span class="str">""</span>); <span class="rem">// AllowNone = 0, XCN_CRYPT_STRING_BASE64_ANY = 6</span>
        }
        <span class="kwrd">catch</span> (ex) {
            document.write(<span class="str">"&lt;br&gt;"</span> + ex.description);
            <span class="kwrd">return</span> <span class="kwrd">false</span>;
        }

    <span class="kwrd">return</span> <span class="kwrd">true</span>;
    }

    InstallCert(); 

    <span class="kwrd">&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span>

<span class="asp">&lt;%</span> } <span class="asp">%&gt;</span></pre>
<pre class="csharpcode"><span class="asp">&lt;%</span>
<span class="rem">/*</span>
<span class="rem">out.println("用下载方式下载p12格式的文件下载后安装"); </span>
<span class="rem">ClassLoader cl = this.getClass().getClassLoader();</span>
<span class="rem">try {</span>
<span class="rem">    InputStream is = cl.getResourceAsStream("liangchuan.p12");</span>
<span class="rem">    //response.setContentType("application/x-x509-ca-cert");</span>
<span class="rem">    response.setContentType("application/x-pkcs12");</span>
<span class="rem">    response.addHeader("Content-Disposition", "attachment; filename=liangchuan.p12");</span>
<span class="rem">    OutputStream os = response.getOutputStream();</span>
<span class="rem">    //InputStream is = new FileInputStream(fileName);</span>
<span class="rem">    while (is.available() &gt; 0) {</span>
<span class="rem">        char c = (char) is.read();</span>
<span class="rem">        os.write(c);</span>
<span class="rem">    }</span>
<span class="rem">    os.flush();</span>
<span class="rem">    is.close(); </span>
<span class="rem">} catch (Exception e) { </span>

<span class="rem">    out.println("&lt;HTML&gt;&lt;BODY&gt;&lt;P&gt;");</span>
<span class="rem">    out.println("&lt;h2&gt;下载证书文件出错&lt;/h2&gt; &lt;br/&gt;");</span>
<span class="rem">    out.println(e.toString());</span>
<span class="rem">    out.println("&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;");</span>
<span class="rem">    out.flush();</span>
<span class="rem">    out.close(); </span>

<span class="rem">}</span>
<span class="rem">*/</span>
<span class="asp">%&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">body</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">html</span><span class="kwrd">&gt;</span></pre>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<pre class="csharpcode">参考资料：</pre>
<p><a title="http://blogs.msdn.com/alejacma/archive/2009/01/28/how-to-create-a-certificate-request-with-certenroll-javascript.aspx" href="http://blogs.msdn.com/alejacma/archive/2009/01/28/how-to-create-a-certificate-request-with-certenroll-javascript.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://blogs.msdn.com/alejacma/archive/2009/01/28/how-to-create-a-certificate-request-with-certenroll-javascript.aspx');">How to create a certificate request with CertEnroll (JavaScript)</a></p>
<p><a title="http://technet.microsoft.com/en-us/library/cc749280%28WS.10%29.aspx" href="http://technet.microsoft.com/en-us/library/cc749280%28WS.10%29.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technet.microsoft.com/en-us/library/cc749280%28WS.10%29.aspx');">Certificate-Related Changes for Windows Vista</a></p>
<p><a href="http://support.microsoft.com/kb/922706/en-us/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://support.microsoft.com/kb/922706/en-us/');">How to use Certificate Services Web enrollment pages together with Windows Vista or Windows Server 2008</a></p>
<h3></h3>
<p><a title="http://www.javaeye.com/topic/120783" href="http://www.javaeye.com/topic/120783" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.javaeye.com/topic/120783');"></a></p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5b2a8ee1-9b07-437b-8b16-789de132ff83" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">Technorati 标签: <a rel="tag" href="http://technorati.com/tags/%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6');">数字证书</a>,<a rel="tag" href="http://technorati.com/tags/%e6%a0%b9%e8%af%81%e4%b9%a6" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e6%a0%b9%e8%af%81%e4%b9%a6');">根证书</a>,<a rel="tag" href="http://technorati.com/tags/ejbca" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/ejbca');">ejbca</a>,<a rel="tag" href="http://technorati.com/tags/pki" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/pki');">pki</a>,<a rel="tag" href="http://technorati.com/tags/CertEnroll" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/CertEnroll');">CertEnroll</a>,<a rel="tag" href="http://technorati.com/tags/XEnroll" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/XEnroll');">XEnroll</a></div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; chuanliang for <a href="http://www.yeeach.com" >出家如初，成佛有余</a>, 2010. |
	  <a href="http://www.yeeach.com/2010/02/11/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e6%a0%b9%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/" >Permalink</a> |
	  <a href="http://www.yeeach.com/2010/02/11/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e6%a0%b9%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/#comments" >One comment</a></p>
	<p>Add to <a href="http://del.icio.us/post?url=http://www.yeeach.com/2010/02/11/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e6%a0%b9%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/&amp;title=IE中自动安装根数字证书" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://del.icio.us/post?url=http://www.yeeach.com/2010/02/11/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e6%a0%b9%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/&amp;title=IE中自动安装根数字证书');">del.icio.us</a></p>
	<p>Search blogs linking this post with <a href="http://www.technorati.com/search/http://www.yeeach.com/2010/02/11/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e6%a0%b9%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.technorati.com/search/http://www.yeeach.com/2010/02/11/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e6%a0%b9%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/');" title="Search on Technorati">Technorati</a></p>
	<p>Want more on these topics ? Browse the archive of posts filed under <a href="http://www.yeeach.com/category/%e6%8a%80%e6%9c%af-%e8%bd%af%e4%bb%b6/"  title="查看 技术相关 的全部文章" rel="category tag">技术相关</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.yeeach.com/2010/02/11/ie%e4%b8%ad%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85%e6%a0%b9%e6%95%b0%e5%ad%97%e8%af%81%e4%b9%a6/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>为何ipad没有flash？</title>
		<link>http://www.yeeach.com/2010/02/07/%e4%b8%ba%e4%bd%95ipad%e6%b2%a1%e6%9c%89flash%ef%bc%9f/</link>
		<comments>http://www.yeeach.com/2010/02/07/%e4%b8%ba%e4%bd%95ipad%e6%b2%a1%e6%9c%89flash%ef%bc%9f/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 01:04:26 +0000</pubDate>
		<dc:creator>chuanliang</dc:creator>
				<category><![CDATA[互联网观察]]></category>
		<category><![CDATA[apple，ipad，flash，开放平台，互联网观察，平台战略]]></category>

		<guid isPermaLink="false">http://www.yeeach.com/2010/02/07/%e4%b8%ba%e4%bd%95ipad%e6%b2%a1%e6%9c%89flash%ef%bc%9f/</guid>
		<description><![CDATA[&#160;&#160;&#160; iPad发布后，围绕Flash及HTML5，Apple与Adobe之间展开了热闹的争吵。
&#160;&#160;&#160; 乔布斯说：Adobe很懒惰，他们有潜力去做很有意义的事情，但却拒绝这样做，他们缺乏像苹果一样的行事方法；Flash漏洞太多，Mac计算机出现崩溃时，大多都是因为Flash出错。将来，没人再会用Flash了，都将改用HTML5。
&#160;&#160;&#160; 其实乔布斯的理由都不成其为理由。iPad之所以没有提供对Flash的支持，根本的原因在于Apple自己的战略需要：
&#160;&#160;&#160; 1、Apple要保证自己对开发平台绝对掌控权
&#160;&#160;&#160;&#160;&#160; 一个平台是否有区隔与其他平台的杀手级应用以及应用的丰富性很大程度上决定了平台的成功与否。而单靠平台提供商自身并不能提供所有这些东西，于是乎对第三方开发人员争夺成为所有平台厂商争夺的焦点。每一个平台厂商都希望开发人员只为自己平台开发专属的产品，没有那一家平台提供商愿意提供跨平台的开发。对于开发人员而言，肯定更愿意采用能够跨平台的技术来开发应用，以降低学习成本、开发成本。
&#160;&#160;&#160;&#160;&#160; 因此如果Apple允许开发人员基于Flash及Flex这样跨平台的开发技术来开发iPhone、iPad的应用，那这些应用（Mac上的Flash就是例子）及开发人员很容易迁移到其他平台，iPhone、iPad平台的独特性无疑大打折扣。这也是为何Apple一直不同意在iPhone中引入Flash的原因之一。
&#160;&#160;&#160; 2、Apple要保证自己平台及平台上各种产品独特的体验，提高用户的迁移成本&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
&#160;&#160;&#160; 3、对于重要的产品应用，Apple要保证自己的产品是最佳选择，不允许有竞争产品出现
&#160;&#160;&#160;&#160;&#160; 在iPad、iPhone角力中，Flash与Safari就是竞争者。正如iPhone之于Android。
&#160;&#160;&#160; 4、自己定义产业链游戏规则，不允许有强势竞争者出现
&#160;&#160;&#160;&#160; 正如乔布斯所说：“Adobe很懒惰，他们有潜力去做很有意义的事情，但却拒绝这样做，他们缺乏像苹果一样的行事方法”。言外之意是，如果Adobe如果能够做得再稍稍好一点，那就会影响Apple作为游戏规则制定者的地位。同样，这也是Apple与Google分道扬镳的原因。所以：“没有永远的朋友，只有永远的利益”。&#160;&#160; 
&#160;&#160;&#160; Apple是一家很有品位和创新精神的公司，在这个商业社会中，能够像Apple这样始终坚持自己的信仰、品位、创新精神的公司无疑是值得尊敬的，尽管偶不是Apple的粉丝。但Apple的封闭程度又让人诟病，很难想象一家公司扮演如此的双重角色能够如此成功。
&#160;&#160;&#160; 我们可以列举众多的理由来说明开封闭平台的弊端及开放平台的优势，但Apple寻求与众不同（Think Different）的创新成就了其成功。
&#160;&#160;&#160; 成功没有定法，成功者自有道。
&#160;&#160;&#160;  

Technorati 标签: apple,ipad,flash,开放平台,互联网观察,平台战略
	
	
	&#169; chuanliang for 出家如初，成佛有余, 2010. &#124;
	  Permalink &#124;
	  No comment
	Add to del.icio.us
	Search blogs linking this post with Technorati
	Want more on these topics ? Browse the archive of posts filed under 互联网观察.]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; iPad发布后，围绕Flash及HTML5，Apple与Adobe之间展开了热闹的争吵。</p>
<p>&#160;&#160;&#160; 乔布斯说：<em>Adobe很懒惰，他们有潜力去做很有意义的事情，但却拒绝这样做，他们缺乏像苹果一样的行事方法；</em><em>Flash漏洞太多，Mac计算机出现崩溃时，大多都是因为Flash出错。将来，没人再会用Flash了，都将改用HTML5。</em></p>
<p>&#160;&#160;&#160; 其实乔布斯的理由都不成其为理由。iPad之所以没有提供对Flash的支持，根本的原因在于Apple自己的战略需要：</p>
<p>&#160;&#160;&#160; 1、Apple要保证自己对开发平台绝对掌控权</p>
<p>&#160;&#160;&#160;&#160;&#160; 一个平台是否有区隔与其他平台的杀手级应用以及应用的丰富性很大程度上决定了平台的成功与否。而单靠平台提供商自身并不能提供所有这些东西，于是乎对第三方开发人员争夺成为所有平台厂商争夺的焦点。每一个平台厂商都希望开发人员只为自己平台开发专属的产品，没有那一家平台提供商愿意提供跨平台的开发。对于开发人员而言，肯定更愿意采用能够跨平台的技术来开发应用，以降低学习成本、开发成本。</p>
<p>&#160;&#160;&#160;&#160;&#160; 因此如果Apple允许开发人员基于Flash及Flex这样跨平台的开发技术来开发iPhone、iPad的应用，那这些应用（Mac上的Flash就是例子）及开发人员很容易迁移到其他平台，iPhone、iPad平台的独特性无疑大打折扣。这也是为何Apple一直不同意在iPhone中引入Flash的原因之一。</p>
<p>&#160;&#160;&#160; 2、Apple要保证自己平台及平台上各种产品独特的体验，提高用户的迁移成本&#160;&#160;&#160;&#160;&#160;&#160;&#160; </p>
<p>&#160;&#160;&#160; 3、对于重要的产品应用，Apple要保证自己的产品是最佳选择，不允许有竞争产品出现</p>
<p>&#160;&#160;&#160;&#160;&#160; 在iPad、iPhone角力中，Flash与Safari就是竞争者。正如iPhone之于Android。</p>
<p>&#160;&#160;&#160; 4、自己定义产业链游戏规则，不允许有强势竞争者出现</p>
<p>&#160;&#160;&#160;&#160; 正如乔布斯所说：“Adobe很懒惰，他们有潜力去做很有意义的事情，但却拒绝这样做，他们缺乏像苹果一样的行事方法”。言外之意是，如果Adobe如果能够做得再稍稍好一点，那就会影响Apple作为游戏规则制定者的地位。同样，这也是Apple与Google分道扬镳的原因。所以：“没有永远的朋友，只有永远的利益”。&#160;&#160; </p>
<p>&#160;&#160;&#160; Apple是一家很有品位和创新精神的公司，在这个商业社会中，能够像Apple这样始终坚持自己的信仰、品位、创新精神的公司无疑是值得尊敬的，尽管偶不是Apple的粉丝。但Apple的封闭程度又让人诟病，很难想象一家公司扮演如此的双重角色能够如此成功。</p>
<p>&#160;&#160;&#160; 我们可以列举众多的理由来说明开封闭平台的弊端及开放平台的优势，但Apple寻求与众不同（Think Different）的创新成就了其成功。</p>
<p>&#160;&#160;&#160; 成功没有定法，成功者自有道。</p>
<p>&#160;&#160;&#160; <a href="http://www.yeeach.com/wp-content/uploads/2010/02/ThinkDifferent.jpg" ><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="apple，ipad，flash，开放平台，互联网观察，平台战略" border="0" alt="apple，ipad，flash，开放平台，互联网观察，平台战略" src="http://www.yeeach.com/wp-content/uploads/2010/02/ThinkDifferent_thumb.jpg" width="244" height="184" /></a> </p>
</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c6d3975b-5ccc-4681-9393-39e42762fc24" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/apple" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/apple');" rel="tag">apple</a>,<a href="http://technorati.com/tags/ipad" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/ipad');" rel="tag">ipad</a>,<a href="http://technorati.com/tags/flash" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/flash');" rel="tag">flash</a>,<a href="http://technorati.com/tags/%e5%bc%80%e6%94%be%e5%b9%b3%e5%8f%b0" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e5%bc%80%e6%94%be%e5%b9%b3%e5%8f%b0');" rel="tag">开放平台</a>,<a href="http://technorati.com/tags/%e4%ba%92%e8%81%94%e7%bd%91%e8%a7%82%e5%af%9f" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e4%ba%92%e8%81%94%e7%bd%91%e8%a7%82%e5%af%9f');" rel="tag">互联网观察</a>,<a href="http://technorati.com/tags/%e5%b9%b3%e5%8f%b0%e6%88%98%e7%95%a5" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e5%b9%b3%e5%8f%b0%e6%88%98%e7%95%a5');" rel="tag">平台战略</a></div>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; chuanliang for <a href="http://www.yeeach.com" >出家如初，成佛有余</a>, 2010. |
	  <a href="http://www.yeeach.com/2010/02/07/%e4%b8%ba%e4%bd%95ipad%e6%b2%a1%e6%9c%89flash%ef%bc%9f/" >Permalink</a> |
	  <a href="http://www.yeeach.com/2010/02/07/%e4%b8%ba%e4%bd%95ipad%e6%b2%a1%e6%9c%89flash%ef%bc%9f/#comments" >No comment</a></p>
	<p>Add to <a href="http://del.icio.us/post?url=http://www.yeeach.com/2010/02/07/%e4%b8%ba%e4%bd%95ipad%e6%b2%a1%e6%9c%89flash%ef%bc%9f/&amp;title=为何ipad没有flash？" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://del.icio.us/post?url=http://www.yeeach.com/2010/02/07/%e4%b8%ba%e4%bd%95ipad%e6%b2%a1%e6%9c%89flash%ef%bc%9f/&amp;title=为何ipad没有flash？');">del.icio.us</a></p>
	<p>Search blogs linking this post with <a href="http://www.technorati.com/search/http://www.yeeach.com/2010/02/07/%e4%b8%ba%e4%bd%95ipad%e6%b2%a1%e6%9c%89flash%ef%bc%9f/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.technorati.com/search/http://www.yeeach.com/2010/02/07/%e4%b8%ba%e4%bd%95ipad%e6%b2%a1%e6%9c%89flash%ef%bc%9f/');" title="Search on Technorati">Technorati</a></p>
	<p>Want more on these topics ? Browse the archive of posts filed under <a href="http://www.yeeach.com/category/%e4%ba%92%e8%81%94%e7%bd%91%e8%a7%82%e5%af%9f/"  title="查看 互联网观察 的全部文章" rel="category tag">互联网观察</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.yeeach.com/2010/02/07/%e4%b8%ba%e4%bd%95ipad%e6%b2%a1%e6%9c%89flash%ef%bc%9f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>域名clientHold后的解锁流程</title>
		<link>http://www.yeeach.com/2010/02/03/%e5%9f%9f%e5%90%8dclienthold%e5%90%8e%e7%9a%84%e8%a7%a3%e9%94%81%e6%b5%81%e7%a8%8b/</link>
		<comments>http://www.yeeach.com/2010/02/03/%e5%9f%9f%e5%90%8dclienthold%e5%90%8e%e7%9a%84%e8%a7%a3%e9%94%81%e6%b5%81%e7%a8%8b/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 14:22:57 +0000</pubDate>
		<dc:creator>chuanliang</dc:creator>
				<category><![CDATA[技术相关]]></category>
		<category><![CDATA[clienthold，域名解锁，域名，dns]]></category>

		<guid isPermaLink="false">http://www.yeeach.com/2010/02/03/%e5%9f%9f%e5%90%8dclienthold%e5%90%8e%e7%9a%84%e8%a7%a3%e9%94%81%e6%b5%81%e7%a8%8b/</guid>
		<description><![CDATA[&#160;&#160;&#160; 一个听朋友道听途说的流程，供参考：
&#160;&#160;&#160; 1、 公司写整顿报告提交给DNS提供商所在地公安局
&#160;&#160;&#160; 2、 公安局上报整顿报告到公安部11局（互联网信息中心）
&#160;&#160;&#160; 3、 公安部11局对整顿报告进行审理并批复
&#160;&#160;&#160; 4、 公安部11局把解除域名锁定的批复抄送给工信部
&#160;&#160;&#160; 5、 工信部接到公安部11局的批复后把解除域名锁定的通知下达给通信管理局
&#160;&#160;&#160; 6、 通信管理局通知DNS提供商解锁
&#160;
Technorati 标签: clienthold,域名解锁,域名,dns
	
	
	&#169; chuanliang for 出家如初，成佛有余, 2010. &#124;
	  Permalink &#124;
	  No comment
	Add to del.icio.us
	Search blogs linking this post with Technorati
	Want more on these topics ? Browse the archive of posts filed under 技术相关.]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 一个听朋友道听途说的流程，供参考：</p>
<p>&#160;&#160;&#160; 1、 公司写整顿报告提交给DNS提供商所在地公安局</p>
<p>&#160;&#160;&#160; 2、 公安局上报整顿报告到公安部11局（互联网信息中心）</p>
<p>&#160;&#160;&#160; 3、 公安部11局对整顿报告进行审理并批复</p>
<p>&#160;&#160;&#160; 4、 公安部11局把解除域名锁定的批复抄送给工信部</p>
<p>&#160;&#160;&#160; 5、 工信部接到公安部11局的批复后把解除域名锁定的通知下达给通信管理局</p>
<p>&#160;&#160;&#160; 6、 通信管理局通知DNS提供商解锁</p>
<p>&#160;</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a75ef1e5-eaca-4601-a3a7-8a6f68eedf98" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/clienthold" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/clienthold');" rel="tag">clienthold</a>,<a href="http://technorati.com/tags/%e5%9f%9f%e5%90%8d%e8%a7%a3%e9%94%81" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e5%9f%9f%e5%90%8d%e8%a7%a3%e9%94%81');" rel="tag">域名解锁</a>,<a href="http://technorati.com/tags/%e5%9f%9f%e5%90%8d" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/%e5%9f%9f%e5%90%8d');" rel="tag">域名</a>,<a href="http://technorati.com/tags/dns" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/dns');" rel="tag">dns</a></div>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; chuanliang for <a href="http://www.yeeach.com" >出家如初，成佛有余</a>, 2010. |
	  <a href="http://www.yeeach.com/2010/02/03/%e5%9f%9f%e5%90%8dclienthold%e5%90%8e%e7%9a%84%e8%a7%a3%e9%94%81%e6%b5%81%e7%a8%8b/" >Permalink</a> |
	  <a href="http://www.yeeach.com/2010/02/03/%e5%9f%9f%e5%90%8dclienthold%e5%90%8e%e7%9a%84%e8%a7%a3%e9%94%81%e6%b5%81%e7%a8%8b/#comments" >No comment</a></p>
	<p>Add to <a href="http://del.icio.us/post?url=http://www.yeeach.com/2010/02/03/%e5%9f%9f%e5%90%8dclienthold%e5%90%8e%e7%9a%84%e8%a7%a3%e9%94%81%e6%b5%81%e7%a8%8b/&amp;title=域名clientHold后的解锁流程" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://del.icio.us/post?url=http://www.yeeach.com/2010/02/03/%e5%9f%9f%e5%90%8dclienthold%e5%90%8e%e7%9a%84%e8%a7%a3%e9%94%81%e6%b5%81%e7%a8%8b/&amp;title=域名clientHold后的解锁流程');">del.icio.us</a></p>
	<p>Search blogs linking this post with <a href="http://www.technorati.com/search/http://www.yeeach.com/2010/02/03/%e5%9f%9f%e5%90%8dclienthold%e5%90%8e%e7%9a%84%e8%a7%a3%e9%94%81%e6%b5%81%e7%a8%8b/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.technorati.com/search/http://www.yeeach.com/2010/02/03/%e5%9f%9f%e5%90%8dclienthold%e5%90%8e%e7%9a%84%e8%a7%a3%e9%94%81%e6%b5%81%e7%a8%8b/');" title="Search on Technorati">Technorati</a></p>
	<p>Want more on these topics ? Browse the archive of posts filed under <a href="http://www.yeeach.com/category/%e6%8a%80%e6%9c%af-%e8%bd%af%e4%bb%b6/"  title="查看 技术相关 的全部文章" rel="category tag">技术相关</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.yeeach.com/2010/02/03/%e5%9f%9f%e5%90%8dclienthold%e5%90%8e%e7%9a%84%e8%a7%a3%e9%94%81%e6%b5%81%e7%a8%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用Varnish+ESI实现静态页面的局部缓存（思路篇）</title>
		<link>http://www.yeeach.com/2010/01/31/%e4%bd%bf%e7%94%a8varnishesi%e5%ae%9e%e7%8e%b0%e9%9d%99%e6%80%81%e9%a1%b5%e9%9d%a2%e7%9a%84%e5%b1%80%e9%83%a8%e7%bc%93%e5%ad%98%ef%bc%88%e6%80%9d%e8%b7%af%e7%af%87%ef%bc%89/</link>
		<comments>http://www.yeeach.com/2010/01/31/%e4%bd%bf%e7%94%a8varnishesi%e5%ae%9e%e7%8e%b0%e9%9d%99%e6%80%81%e9%a1%b5%e9%9d%a2%e7%9a%84%e5%b1%80%e9%83%a8%e7%bc%93%e5%ad%98%ef%bc%88%e6%80%9d%e8%b7%af%e7%af%87%ef%bc%89/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 07:10:06 +0000</pubDate>
		<dc:creator>chuanliang</dc:creator>
				<category><![CDATA[技术相关]]></category>
		<category><![CDATA[fragment caching，varnish，ngnix，haproxy，load balancing]]></category>

		<guid isPermaLink="false">http://www.yeeach.com/2010/01/31/%e4%bd%bf%e7%94%a8varnishesi%e5%ae%9e%e7%8e%b0%e9%9d%99%e6%80%81%e9%a1%b5%e9%9d%a2%e7%9a%84%e5%b1%80%e9%83%a8%e7%bc%93%e5%ad%98%ef%bc%88%e6%80%9d%e8%b7%af%e7%af%87%ef%bc%89/</guid>
		<description><![CDATA[&#160;&#160;&#160; 页面静态化是搭建高性能网站必用的招式之一，页面静态化可以有效提升系统响应速度，同时也有利于搜索引擎优化。但在页面静态化后，静态页面之间包含（例如所有的静态页面包含页头、页脚）以及静态页面中的局部信息的动态更新又成为新的问题。
&#160;&#160;&#160; 静态页面之间的包含一般有如下一些方案：
&#160;&#160; 1、Client Side Includes(CSI)：通过frame、iframe、javascript、javacript+ajax等方式将另外一个页面的内容动态包含进来。像现在流行的jquery等javascript库对此有较好的支持。
&#160;&#160;&#160;&#160;&#160; 优点：能够利用浏览器客户端并行处理及装载的机制；通过浏览器缓存机制可以降低网络传输时间，提高性能；计算放在客户端，能够降低服务器端压力
&#160;&#160;&#160;&#160;&#160; 缺点：搜索引擎优化问题；javascript兼容性问题；客户端缓存可能导致服务器端内容更新后不能及时生效；XSS等安全隐患
&#160;&#160; 2、Server Side Includes(SSI)：
&#160;&#160;&#160;&#160;&#160;&#160; 优点：SSI技术是通用技术，不受具体语言限制，只需要Web服务器或应用服务器支持即可，Ngnix、Apache、Tomcat、Jboss等对此都有较好的支持
&#160;&#160;&#160;&#160;&#160;&#160; 缺点：SSI在语法上不能够直接包含其他服务器的url（当然也可以通过redirect等来变通实现），因此在需要充分利用缓存及负载均衡的环境下相对不是很灵活。&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160;&#160; 当然如果不使用单独的缓存服务器，而是使用Ngnix，利用Ngnix对SSI及Memcached支持，通过NginxHttpSsiModule、NginxHttpMemcachedModule也可以实现页面缓存，但与专业的缓存服务器（例如Varnish）相比较，Ngnix作为缓存服务器只适合于中小规模的场合。
&#160;&#160;&#160; 3、Edge Side Includes (ESI)：
&#160;&#160;&#160;&#160;&#160;&#160;&#160; Edge Side Includes(ESI) 和Server Side Includes(SSI)和功能类似。SSI需要特殊的文件后缀(shtml,inc)。ESI可以直接通过URI包含远程服务器文件，ESI更适合用于缓存服务器上，缓存整个页面或页面片段，因此ESI特别适合用于缓存。像当下流行的缓存服务器Varnish对此有所支持。
&#160;
&#160;&#160;&#160; SSI可以很容易满足让所有静态页面include其他静态页面的需求。
&#160;&#160;&#160; 大部分的网站都有这样的需求：在整个静态页面的局部有需要动态更新的内容片段，包括：
&#160;&#160;&#160; 1、与用户个性化无关的信息，所有用户进来看到的内容都一样。例如最热新闻、最活跃的用户等
&#160;&#160;&#160; 2、与用户个性化信息相关。例如用户登录信息、用户好友等
&#160;&#160; 以上两种情况，一般情况下都采用ajax方式来实现静态页面局部信息的刷新，ajax直接提交给Web服务器或应用服务器获取动态数据。或者采用Ajax+Memcached的模式，将动态变化的内容放入Memcached中，ajax直接存取Memcached，这样能够缓解Web服务器或应用服务器压力。但采用ajax的方案，直接绕过了缓存服务器，并没有充分利用缓存服务器对于静态页面的缓存支持。
&#160;&#160;&#160; 使用Varnish及其对ESI的支持很容易实现对以上两种需求的较好支持：
&#160;&#160; 1、与用户个性化无关的信息：直接由Varnish+ESI就可以实现。对于动态变化的局部页面，可以在ESI制定的url地址返回的http header的Cache-Control来指定缓存策略，实现局部页面缓存（fragment caching）。
&#160; 2、与用户个性化信息相关：对于整个页面的缓存策略仍然使用Varnish+ESI方式。而需要fragment caching的局部页面，可以根据用户Cookie信息获得用户身份标识信息（例如userid），然后在ESI的URL中带上用户身份信息提交到后端的Web服务器或应用服务器以获取与用户个性化相关的信息。可以参考：Caching logged in users 。
&#160;&#160;&#160; 简单梳理了一下基于Varnish+ESI实现静态页面缓存的思路，有空再写代码具体测试一下。
&#160;&#160;&#160; Varnish作为一个高性能的缓存服务器，值得好好研究一下。
&#160;&#160;&#160; 尽管Varnish和Ngnix都具有Load Balancing的功能，但Ngnix只能根据客户端IP进行负载均衡，不支持基于Session状态维护（session persistence）方式，无法维护Session状态；而Varnish的Load Balancing都不支持。而这正是HAproxy的强项。
&#160;&#160;&#160; 由此得到一个相对理想的架构：
&#160;&#160;&#160;&#160;&#160; Nginx (用于HTTP compression及https) &#8211;&#62; Varnish (用于reverse proxy caching) [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 页面静态化是搭建高性能网站必用的招式之一，页面静态化可以有效提升系统响应速度，同时也有利于搜索引擎优化。但在页面静态化后，静态页面之间包含（例如所有的静态页面包含页头、页脚）以及静态页面中的局部信息的动态更新又成为新的问题。</p>
<p>&#160;&#160;&#160; 静态页面之间的包含一般有如下一些方案：</p>
<p>&#160;&#160; 1、<strong>Client Side Includes(CSI)：</strong>通过frame、iframe、javascript、javacript+ajax等方式将另外一个页面的内容动态包含进来。像现在流行的jquery等javascript库对此有较好的支持。</p>
<p>&#160;&#160;&#160;&#160;&#160; 优点：能够利用浏览器客户端并行处理及装载的机制；通过浏览器缓存机制可以降低网络传输时间，提高性能；计算放在客户端，能够降低服务器端压力</p>
<p>&#160;&#160;&#160;&#160;&#160; 缺点：搜索引擎优化问题；javascript兼容性问题；客户端缓存可能导致服务器端内容更新后不能及时生效；XSS等安全隐患</p>
<p>&#160;&#160; 2、<strong>Server Side Includes(SSI)：</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; 优点：SSI技术是通用技术，不受具体语言限制，只需要Web服务器或应用服务器支持即可，Ngnix、Apache、Tomcat、Jboss等对此都有较好的支持</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; 缺点：SSI在语法上不能够直接包含其他服务器的url（当然也可以通过redirect等来变通实现），因此在需要充分利用缓存及负载均衡的环境下相对不是很灵活。&#160;&#160;&#160;&#160; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; 当然如果不使用单独的缓存服务器，而是使用Ngnix，利用Ngnix对SSI及Memcached支持，通过NginxHttpSsiModule、NginxHttpMemcachedModule也可以实现页面缓存，但与专业的缓存服务器（例如Varnish）相比较，Ngnix作为缓存服务器只适合于中小规模的场合。</p>
<p><strong>&#160;&#160;&#160; 3、Edge Side Includes (ESI)：</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Edge Side Includes(<b>ESI</b>) 和Server Side Includes(<b>SSI</b>)和功能类似。SSI需要特殊的文件后缀(shtml,inc)。ESI可以直接通过URI包含远程服务器文件，ESI更适合用于缓存服务器上，缓存整个页面或页面片段，因此ESI特别适合用于缓存。像当下流行的缓存服务器Varnish对此有所支持。</p>
<p>&#160;</p>
<p>&#160;&#160;&#160; SSI可以很容易满足让所有静态页面include其他静态页面的需求。</p>
<p>&#160;&#160;&#160; 大部分的网站都有这样的需求：在整个静态页面的局部有需要动态更新的内容片段，包括：</p>
<p>&#160;&#160;&#160; 1、与用户个性化无关的信息，所有用户进来看到的内容都一样。例如最热新闻、最活跃的用户等</p>
<p>&#160;&#160;&#160; 2、与用户个性化信息相关。例如用户登录信息、用户好友等</p>
<p>&#160;&#160; 以上两种情况，一般情况下都采用ajax方式来实现静态页面局部信息的刷新，ajax直接提交给Web服务器或应用服务器获取动态数据。或者采用Ajax+Memcached的模式，将动态变化的内容放入Memcached中，ajax直接存取Memcached，这样能够缓解Web服务器或应用服务器压力。但采用ajax的方案，直接绕过了缓存服务器，并没有充分利用缓存服务器对于静态页面的缓存支持。</p>
<p>&#160;&#160;&#160; 使用Varnish及其对ESI的支持很容易实现对以上两种需求的较好支持：</p>
<p>&#160;&#160; 1、与用户个性化无关的信息：直接由Varnish+ESI就可以实现。对于动态变化的局部页面，可以在ESI制定的url地址返回的http header的<code>Cache-Control来指定缓存策略，实现局部页面缓存（fragment caching）。</code></p>
<p><code>&#160; 2、与用户个性化信息相关：对于整个页面的缓存策略仍然使用Varnish+ESI方式。而需要fragment caching的局部页面，可以根据用户Cookie信息获得用户身份标识信息（例如userid），然后在ESI的URL中带上用户身份信息提交到后端的Web服务器或应用服务器以获取与用户个性化相关的信息。可以参考：</code><a title="http://varnish-cache.org/wiki/VCLExampleCachingLoggedInUsers" href="http://varnish-cache.org/wiki/VCLExampleCachingLoggedInUsers" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://varnish-cache.org/wiki/VCLExampleCachingLoggedInUsers');">Caching logged in users</a> 。</p>
<p>&#160;&#160;&#160; 简单梳理了一下基于Varnish+ESI实现静态页面缓存的思路，有空再写代码具体测试一下。</p>
<p>&#160;&#160;&#160; Varnish作为一个高性能的缓存服务器，值得好好研究一下。</p>
<p>&#160;&#160;&#160; 尽管Varnish和Ngnix都具有Load Balancing的功能，但Ngnix只能根据客户端IP进行负载均衡，不支持基于Session状态维护（session persistence）方式，无法维护Session状态；而Varnish的Load Balancing都不支持。而这正是HAproxy的强项。</p>
<p>&#160;&#160;&#160; 由此得到一个相对理想的架构：</p>
<p>&#160;&#160;&#160;&#160;&#160; Nginx (用于HTTP compression及https) &#8211;&gt; Varnish (用于reverse proxy caching) &#8211;&gt;HAProxy（用作Load Balancing）&#8211;&gt;Ngnix(Web Server)或Tomcat</p>
<p>&#160; </p>
<h3><strong>参考文档：</strong></h3>
<p>&#160;&#160;&#160; <a title="http://www.trygve-lie.com/blog/entry/esi_explained_simple" href="http://www.trygve-lie.com/blog/entry/esi_explained_simple" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.trygve-lie.com/blog/entry/esi_explained_simple');">http://www.trygve-lie.com/blog/entry/esi_explained_simple</a></p>
<p>&#160;&#160;&#160; <a title="http://jimmyg.org/blog/2009/ssi-memcached-nginx.html" href="http://jimmyg.org/blog/2009/ssi-memcached-nginx.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://jimmyg.org/blog/2009/ssi-memcached-nginx.html');">http://jimmyg.org/blog/2009/ssi-memcached-nginx.html</a></p>
<p>&#160;&#160;&#160; <a title="http://docs.heroku.com/http-caching" href="http://docs.heroku.com/http-caching" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://docs.heroku.com/http-caching');">http://docs.heroku.com/http-caching</a></p>
<p>&#160;&#160;&#160; <a title="http://docs.heroku.com/memcached" href="http://docs.heroku.com/memcached" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://docs.heroku.com/memcached');">http://docs.heroku.com/memcached</a></p>
<p>&#160;&#160;&#160; <a title="http://kovyrin.net/2007/08/05/using-nginx-ssi-and-memcache-to-make-your-web-applications-faster/" href="http://kovyrin.net/2007/08/05/using-nginx-ssi-and-memcache-to-make-your-web-applications-faster/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://kovyrin.net/2007/08/05/using-nginx-ssi-and-memcache-to-make-your-web-applications-faster/');">http://kovyrin.net/2007/08/05/using-nginx-ssi-and-memcache-to-make-your-web-applications-faster/</a></p>
<p>&#160;&#160;&#160; <a title="http://www.ibm.com/developerworks/opensource/library/os-php-varnish/index.html" href="http://www.ibm.com/developerworks/opensource/library/os-php-varnish/index.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.ibm.com/developerworks/opensource/library/os-php-varnish/index.html');">http://www.ibm.com/developerworks/opensource/library/os-php-varnish/index.html</a></p>
<p>&#160;</p>
</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:471be9ef-f600-488d-bc5b-1f20eb76c1ed" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/fragment+caching" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/fragment+caching');" rel="tag">fragment caching</a>,<a href="http://technorati.com/tags/varnish" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/varnish');" rel="tag">varnish</a>,<a href="http://technorati.com/tags/ngnix" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/ngnix');" rel="tag">ngnix</a>,<a href="http://technorati.com/tags/haproxy" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/haproxy');" rel="tag">haproxy</a>,<a href="http://technorati.com/tags/load+balancing" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://technorati.com/tags/load+balancing');" rel="tag">load balancing</a></div>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; chuanliang for <a href="http://www.yeeach.com" >出家如初，成佛有余</a>, 2010. |
	  <a href="http://www.yeeach.com/2010/01/31/%e4%bd%bf%e7%94%a8varnishesi%e5%ae%9e%e7%8e%b0%e9%9d%99%e6%80%81%e9%a1%b5%e9%9d%a2%e7%9a%84%e5%b1%80%e9%83%a8%e7%bc%93%e5%ad%98%ef%bc%88%e6%80%9d%e8%b7%af%e7%af%87%ef%bc%89/" >Permalink</a> |
	  <a href="http://www.yeeach.com/2010/01/31/%e4%bd%bf%e7%94%a8varnishesi%e5%ae%9e%e7%8e%b0%e9%9d%99%e6%80%81%e9%a1%b5%e9%9d%a2%e7%9a%84%e5%b1%80%e9%83%a8%e7%bc%93%e5%ad%98%ef%bc%88%e6%80%9d%e8%b7%af%e7%af%87%ef%bc%89/#comments" >No comment</a></p>
	<p>Add to <a href="http://del.icio.us/post?url=http://www.yeeach.com/2010/01/31/%e4%bd%bf%e7%94%a8varnishesi%e5%ae%9e%e7%8e%b0%e9%9d%99%e6%80%81%e9%a1%b5%e9%9d%a2%e7%9a%84%e5%b1%80%e9%83%a8%e7%bc%93%e5%ad%98%ef%bc%88%e6%80%9d%e8%b7%af%e7%af%87%ef%bc%89/&amp;title=使用Varnish+ESI实现静态页面的局部缓存（思路篇）" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://del.icio.us/post?url=http://www.yeeach.com/2010/01/31/%e4%bd%bf%e7%94%a8varnishesi%e5%ae%9e%e7%8e%b0%e9%9d%99%e6%80%81%e9%a1%b5%e9%9d%a2%e7%9a%84%e5%b1%80%e9%83%a8%e7%bc%93%e5%ad%98%ef%bc%88%e6%80%9d%e8%b7%af%e7%af%87%ef%bc%89/&amp;title=使用Varnish+ESI实现静态页面的局部缓存（思路篇）');">del.icio.us</a></p>
	<p>Search blogs linking this post with <a href="http://www.technorati.com/search/http://www.yeeach.com/2010/01/31/%e4%bd%bf%e7%94%a8varnishesi%e5%ae%9e%e7%8e%b0%e9%9d%99%e6%80%81%e9%a1%b5%e9%9d%a2%e7%9a%84%e5%b1%80%e9%83%a8%e7%bc%93%e5%ad%98%ef%bc%88%e6%80%9d%e8%b7%af%e7%af%87%ef%bc%89/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.technorati.com/search/http://www.yeeach.com/2010/01/31/%e4%bd%bf%e7%94%a8varnishesi%e5%ae%9e%e7%8e%b0%e9%9d%99%e6%80%81%e9%a1%b5%e9%9d%a2%e7%9a%84%e5%b1%80%e9%83%a8%e7%bc%93%e5%ad%98%ef%bc%88%e6%80%9d%e8%b7%af%e7%af%87%ef%bc%89/');" title="Search on Technorati">Technorati</a></p>
	<p>Want more on these topics ? Browse the archive of posts filed under <a href="http://www.yeeach.com/category/%e6%8a%80%e6%9c%af-%e8%bd%af%e4%bb%b6/"  title="查看 技术相关 的全部文章" rel="category tag">技术相关</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.yeeach.com/2010/01/31/%e4%bd%bf%e7%94%a8varnishesi%e5%ae%9e%e7%8e%b0%e9%9d%99%e6%80%81%e9%a1%b5%e9%9d%a2%e7%9a%84%e5%b1%80%e9%83%a8%e7%bc%93%e5%ad%98%ef%bc%88%e6%80%9d%e8%b7%af%e7%af%87%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
