C# Window编程随记——ClickOnce程序部署(3):使用证书

在讲述证书的使用前,我们先来了解另外一个知识——发布网页。

在前面所说的ClickOnce部署中,如果大家细心的话,应该会发现这么个问题。

如上图,发布成功后,在"输出"窗口中提示无法查看发布网页。

好,我们先不管那是什么,现在我们不妨发布一个项目,但在"项目属性"窗口中的"发布"选项卡上,点击"选项"按钮,打开"发布选项"对话框。

在"说明"页中输入基本信息,产品名称和发布者。

然后进入到"部署"页,在部署网页处输入一个页面名称,最好用index.htm或default.htm之类的名字,因为IIS等服务器的默认页面通常是这些。并且勾选"每次发布后都自动生成部署网页"项。

单击确定回到发布页,然后我们点击一下"立即发布",仔细观察。这一次我们发现,"输出"窗口不再提示无法打开部署页面了,而且发布完成后打开了一个页面,就是我们刚才输入的发布网页,是VS为我们自动生成的。

 

我们可以用VS或其他网页编辑工具来修改这个页面,一旦我们修改后,记得回到项目属性中的发布页,再次打开发布选项对话框,去掉"每一次发布后自动生成部署网页"项前面的对勾,不然,你所修改的页面在下一次发布后会被自动生成的页面所覆盖。

 

好,这段内容就说到这儿。下面开始我们的正题。

 

 

大家还记得这个界面不?

我们在安装ClickOnce应用程序的时候,都会弹出这个安全警告,虽然点击"安装"就可以开始安装,但是,这就变成不是ClickOnce了,而是ClickTwice了,是吧,我们至少点击了两下。

这是由于没有识别到受信任的证书造成的。下面我们来看看如何自己来做证书。

其实VS在发布ClickOnce部署时是为我们生成了一个临时证书的,但这样不太好控制,我们希望自己来做一个符合我们要求的证书,至少在证书的过期日期上我们可以自己来定。对于我们小开发者或小团队来说,到证书机构购买证书似乎有点"装逼"了,反正证书就是用来标识我们发布者身份,确保我们的应用安装包在传播过程中不被修改,我们倒不如自己弄一个证书更简便。

 

在项目属性窗口中,我们切换到"签名"选项卡,这里看到VS生成的临时证书。

 

我们来自己做个证书吧,自己给自己颁发证书,非常有荣誉感的。要完成这件事,我们需要用到几个命令行工具,其实大家网上搜一下,也是有很多相关文章的,这里我也顺便给大家演示一遍。

a、首先粉墨登场的是makecert工具,大家看看它的名字就知道它的长相,有点帅,作用当然是创建一个.cer文件,即证书文件。至于是啥类型的证书,纯属理论课,大家维基百科一下就有了。

打开Visual Studio命令行窗口,不要告诉我你找不到,然后我们最好用CD命令修改一下当前目录,我们希望把创建的文件放到哪里就定位到哪里,我呢计划把这些荣誉证书文件放到C:\Users\Admin下,即我的个人目录。输入以下命令:

cd %USERPROFILE%\证书

这样,第一步也完成了,看:

 

b、用makecert命令生成一个证书文件my.cer,并且附带一个密钥my.pvk。输入以下命令:

makecert –r –n "CN=老周" –b 10/08/2013 –e 08/11/2016 –sv my.pvk my.cer

按回车后,提示创建密码,输入密码,你喜欢,为了好玩,我这里用123456789作为密码。

点击OK按钮,然后又弹出一个窗口,注意,这个和上面那个不同,上面那个是创建密码,下面这个是用刚才创建的密码来创建证书。刚才我设置了123456789,所以这里还是要输入123456789,不要输错密码,不然要从头再来了。

点击OK按钮,好,证书和私钥文件就创建完成了。就是这两个文件:

解释一下,-r参数表示自签名,说白了就是自己给自书颁发证书,一定要加上-r,-n是证书的名字,通常用你的大名或者你公司的名字,以CN开头,格式为CN=<your name>,比如我叫老周(本来收小周,就因为叫小周的人太多,所以我叫老周),就用CN=老周。

-b是证书有效期的开始日期,格式mm/dd/yyyy,注意,别写错,哪怕你是1月份也不要写成1,应该写成01;-e是证书有效期的过期日期,格式和前面一样。

-sv是创建密钥文件,文件名为*.pvk,-sv要加上,后面你会发现,有用的。

最后就是证书文件的名字,文件名为*.cer。

 

c、证书是生成了,但你会看到VS要的.pfx文件,不是.cer文件,所以我们必须转换,但是没有工具可以一部到位,所以,我们依次用两个工具来转换。

先是用cert2spc,把.cer文件转换为.spc文件,不要问为什么,到了后面一步你就知道为什么要转为.spc文件了。继续在命令行中输入:

Cert2spc my.cer my.spc

完成后我们看到又多了一个文件:

我们离真相越来越近了,还剩最后一个,我们的.pfx证书就要完工了。最后一步就是把.pvk文件转为.pfx文件。所以用pvk2pfx,继续在命令行中输入以下命令:

pvk2pfx -pvk my.pvk -spc my.spc -pfx my.pfx -pi 123456789 –po 123456789 –f

这个工具比较复杂,-pvk指定刚才生成的.pvk文件;-spc就是刚才生成的.spc文件;-pfx是要生成的.pfx文件的名字,-pi是.pvk文件的密码,即我们前面创建的123456789,-po是生成的.pfx文件的密码,你可以重新设,我这里还是用123456789。

 

pfx弄好了,现在我们把它放进VS中。VS解决方案中,可以把<项目名>_TemporaryKey.pfx删了,那个是VS生成的临时证书,现在我们有自己的证书了,临时证书就没用了,我们可以送它去见列宁了。

打开项目属性窗口,切换到"签名"选项卡,点击"从文件选取"按钮,导入刚才生成的.pfx证书。

 

然后输入密码,密码就是上面执行pvk2pfx命令时-po参数指定的密码,我仍使用了123456789。

 

OK,证书就替换了。

 

你只要把刚才的.cer文件(即证书)发给客户,客户在安装你的ClickOnce包之前先把证书安装到他的计算中的可信任区域中,然后再去安装你的应用,就不会有安全提示了。以后你发布的应用都用这个证书就行了,不过,注意证书不要过期了,过期了就重新生成一个日期较新的。

在客户的机子上,打开控制面板,搜索"证书",然后打开基于计算机的证书管理器,注意不是基于当前用户。

 

打开证书管理,在"受信任的根证书颁发机构"节上右击,从菜中选择导入。

 

在"受信任的发布者"节上的也用同样的方法导入一次。随后我们再发布一次ClickOnce部署包,现在就真正ClickOnce了,一点击就全自动安装了,没有安全提示了。

展开阅读全文

通过clickonce部署,证书问题

07-23

sign the clickonce manifestsrn请问需要什么样的证书?是否只要是购买微软代码签名证书就可以呢?如以下这个.是否多用途的和标准版的都可以呢?rnrnrnrn使得软件开发者能对其开发的软件代码进行数字签名,让其用户通过网络平台( 互联网或内部网 )下载时能确信此代码没有被非法篡改和来源可信,从而保护了代码的完整性、保护了用户不会被病毒、恶意代码和间谍软件所侵害,当然也就保护了软件开发商的利益,使得软件开发商能安全地快速地通过网络发布软件。 rnrn特点和优势 rnrn • 支持 Windows .exe, .dll, .cab, .ocx(ActiveX)等文件数字签名rn • 支持 XML 文件数字签名rn • 支持 .js文件(Java Script)数字签名rn • 支持 微软徽标认证rn • 支持 微软Office VBA宏数字签名 rn • 支持 J2SE Jar文件数字签名(1.5.008 以上版本)rn • 支持 火狐浏览器插件.XPI文件数字签名rn • 保护您的代码的完整性(未被篡改或破坏)rn • 让最终用户能确信此代码确实是您提供的rn • 免费提供时间戳服务,确保已经签名的代码长期有效 rn • 证书有效期内不限签名代码次数rnrnrn1. 微软代码签名证书 - 标准版rn 标准版微软代码签名证书使得软件开发者(企业)能对其开发的微软软件代码(.ocx/.dll/.cab/.exe等)和微软Office VBA宏进行数字签名,显示单位名称(中文或英文)。可同时用于微软徽标认证。rnrn 该版本证书主题信息中含有“OU = Class 3 - for Microsoft Authenticode Signing”。 rnrn2. 微软代码签名证书 - 多用途版rn 多用途版微软代码签名证书使得软件开发者(企业)能对其开发的微软软件代码(.ocx/.dll/.cab/.exe等)、微软Office VBA宏、Java 代码(J2SE .Jar,1.5.008 以上版本)和火狐浏览器(FireFox)插件.XPI文件进行数字签名,显示单位名称(中文或英文)。可同时用于微软徽标认证。rnrn 论坛

ClickOnce 部署 问题

12-11

#region 同步更新rn /**/rn /// rn /// 检测网络更新rn /// rn private void InstallUpdateSyncWithInfo()rn rn UpdateCheckInfo info = null;rnrnrn if (ApplicationDeployment.IsNetworkDeployed)rn rn ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;rnrn tryrn rn info = [color=#FF0000]ad.CheckForDetailedUpdate();[/color]rnrn rn catch (DeploymentDownloadException dde)rn rn MessageBox.Show("软件升级发现异常. \n\n请检测网络情况后重新升经. 错误原因为:" + dde.Message, "升级检测", MessageBoxButtons.OK, MessageBoxIcon.Error);rn return;rn rn catch (InvalidDeploymentException ide)rn rn MessageBox.Show("网络中无法检测到可更新的部署文件,请与软件开发商联系. 错误原因: " + ide.Message, "升级检测", MessageBoxButtons.OK, MessageBoxIcon.Error);rn return;rn rn catch (InvalidOperationException ioe)rn rn MessageBox.Show("软件无法更新. 请与软件开发商联系. 错误原因: " + ioe.Message, "升级检测", MessageBoxButtons.OK, MessageBoxIcon.Error);rn return;rn rnrn if (info.UpdateAvailable)rn rn Boolean doUpdate = true;rnrn if (!info.IsUpdateRequired)rn rn DialogResult dr = MessageBox.Show("检测到新版本,版本号为:" + info.AvailableVersion.ToString() + ",是否现在升级?", "升级检测", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);rn if (!(DialogResult.OK == dr))rn rn doUpdate = false;rn rn rnrn if (doUpdate)rn rn tryrn rn ad.Update();rn MessageBox.Show("升级完毕,请重启软件以使用新版本.", "升级检测", MessageBoxButtons.OK, MessageBoxIcon.Information);rn Application.Restart();rn rn catch (DeploymentDownloadException dde)rn rn MessageBox.Show("软件升级发现异常. \n\n请检测网络情况后重新升经. 错误原因为: " + dde, "升级检测", MessageBoxButtons.OK, MessageBoxIcon.Error);rn return;rn rn rn rn elsern rn //MessageBox.Show("您现在使用的已经是最新版本软件!", "升级检测", MessageBoxButtons.OK, MessageBoxIcon.Information);rn rn rn elsern rn MessageBox.Show("不是网络部署软件,无法更新", "升级检测", MessageBoxButtons.OK, MessageBoxIcon.Error);rn rnrn rnrnrnrn #endregion rnrn-----------------------------------------------------------------------rn以上是以编程方式的ClickOnce 部署,大家有没有发现当发布以后,客户端升级时如果选“取消”,那么在下一次启动程序时还是会弹出两个系统自动生成的“检测到新版本”和“更新可用”窗口,而这两个窗口是我不想看到的。 论坛

程序使用中的随记

12-06

如何判断一个电子信箱格式是否有效?rn很多用户在网站上会糊弄填写一个电子信箱,请问有什么办法可以阻止这种行为?rn rn我们通常用两种方法来进行判断:rn第一种,设定只有形如wapweb@***.net、wapweb@***.***.net、sadfsdf@***.***.***.net格式的信箱才符合要求,其它为错:rn rnrn第二种,一般来说,判断一个电子信箱格式是否有效,最简单的方法就是检查它里面是否含有“@”和“.”以及“.”是否排在“@”后面:rnlAt = False rn lDot = false rn for x = 2 to len(pInstring)-1rn if mid(pInString,x,1) = "@" then lAt = Truern if mid(pInString,x,1) = "." and lAt = True then lDot = True rn next rn if lAt = True and lDot = True then rn isEmail = True rn elsern isEmail = False rn end if rnend functionrn这个办法还可以作为对类似的有一定格式的东西进行判断的范本。rnrnrnrn如何判断SQL语句是否执行了?rnrnrn 我们可以利用err对象来判断:rnsql="insert into table(f1,f2) values('v1','v2')"rnconn.execute sqlrnif err.number<>0 then rn   response.write "哎呀,出错了:"& err.description err.clearrnelse rn    response.write "OK"rnend if  rnrnrnrnrn如何列举Error的所有对象?rnDim irnSet conn=Server.CreateObject("ADODB.Connection")rnconn.ConnectionString="Driver=Microsoft Access Driver (*.mdb);DBQ=" _rn&Server.Mappath("/source_asp")&"/property/employee.mdb;"rnconn.open rnif conn.errors.count>0 thenrn response.write "噢,数据库连接出错了!"&" "rnfor i =0 to conn.errors.count-1rn response.write conn.errors.item(i)&" "rn nextrnelsern response.write "恭喜,数据库连接成功!"rnend if rnconn.closern%>rnrnError对象的属性和方法:rn1、Count属性:用来统计Errors集合的数目;rn2、Clear方法:写法为Error.Clear,是用来清除Errors集合中的原有对象的,在统计新的Error对象时应该先使用此语句;rn3、Item方法:用来指定特定的一个错误,语法为Error.Item(number),其中number为一数字。由于默认Item方法,所以Error(number)的写法与前面的写法是相同的。rnrnrn 论坛

没有更多推荐了,返回首页