打造安全的WebService服务


   场景
   一台公网中的Web服务器,使用windwos2003 + IIS6.0 + .net2.0 ,现在需要在服务器上部署WebService,为使能安全的访问WebService 现在打算起用SSL,在IIS6.0中启用SSL需要你安装证书,使用XX$一年的官方证书显然很不合算,但这个估计对程序员来说最方便,在编程中你遇到的问题最少. 另外就是自己架一个CA站点,自己发证书,虽然这个也谈不上麻烦,你只需要卖一张全国统一价格5RMB的windows2003光盘安装上即可,不过还是会有不少人嫌麻烦,与其这样我宁可直接使用明文发送信息,
---------------一些题外话,适合消遣,找资料的请跳过
毕竟公司的Web服务器经常被黑,毕竟黑进来的多是些骇客,使用网上公认的无IQ办法,无奈我是一个爱好写程序的网管,宁原多装系统,也不愿意研究系统常规安全设置,另外我对在服务器桌面上(远程桌面)留条的访问者向来都是很礼貌的从不骂人,直到前段时间一个老是光顾服务器的朋友把服务器上的网站跟数据库全部删除,连备份都不放过,反正任何.rar文件多没了,数据库也只有log文件了,而在桌面上赫然放着"个看看看.txt",里面书要数据请联系vipmax$@126.com(也许是163.com或263.com不是很清楚了)时我也是轻轻的把文件拖到回收站,心想我一直对这些朋友多很客气的,他们为什么这么绝呢,黑就黑吧没必要把全部数据删了,难道是我上次拿一百块钱诱惑一个说黑了我们服务器的人,结果又没把钱给他,以致他怀恨在心下了狠手,不过想想也不对啊,我是说过他要能指出什么漏洞后才以个人名义给他100RMB当学费,结果他告诉我首页有漏洞,(当时首页是定时生成的静态页)问他具体什么漏洞他又不说,于是就没给了,当然如果他能说出那个连张一个表单元素多没的静太页上什么漏洞的话我会很震惊并且很大方的拿出我工资的5.2%(也就是100元给他)并且会面壁三天,从此以后逢人遍提此事...,
并且改行去卖茶叶蛋,以讽刺我在IT混沌3年,不过终究他没具体指出事后,导致我现在还混沌于IT的底层社会,每天研究一些类似太阳能手电筒的程序辽以度日,哎不说了..
----------------------------------------接上文--------

 服务器的配置

   通常情况下我们只在SSL方便使用的情况下才用,因此下面的方法也许是最方便的,
使用随.net2.0框架一起安装的命令行程序makecert生成一个自签名证书,如下便在C:\ 盘生成一个名为mycert.cer的证书
makecert -r -pe -n CN="MySQLServer" -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localmachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12  c:/mycert.cer 

安装后,在IIS6.0的对应站点中使用这个证书,并启用SSL访问,记的在防火墙中开放相应端口,为了更加安全的访问还取消了站点的匿名访问,使用基本的身份验证(以明文发送密码)(S),注意在启用SSL后使用基本身份认证是安全的,因为服务器不在AD环境中只能使用这个认证方式,另外注意的是调用这个Webservice 时不要用超绝管理员用户名跟密码,这样是没必要的,因为正常情况下asp.net运行的帐户为系统内置帐户,如Local System 等,你只需要建立一个Windows帐户,并将含webService的目录读权限分配给这个帐户即可,为保证安全你可以给这个帐户设置一个超级密码!这样做的目地是防止.asmx文件被恶意人士查看, 当然除此之外我们在每个WebService函数调用上也需要给身省份验证,这个是基于数据库实现的一套认证与授权系统,你可以简单的使用aspnet_regsql.exe(.net2.0SDK命令行程序)来配置一个出来,
完成以上工作后,服务器上的配置已经完成了,并且相当安全,当然如果你服务器本身的安全跟我服务器一样很豆腐渣的话那么建议你还是先把服务器安全搞好,而webService只要给每个函数调用加个密码就很安全了,如果你的WebService(加密码后,并且秘密不是6个1),而不是服务器被攻击话,那么要么你很倒霉,碰到了一个见习黑客,要么你服务器上的东西已经很有价值了,建议你花点钱去请人把服务器安全搞搞,所以不要放个WebService就要做N多的安全设置,一般做到基本认证就可以了,人家真真的黑客还没空来黑你呢.你需要防范的是骇客

---
  客户端代码
 
 根据上面的配置你访问服务器时需要提供2组的帐户跟密码,
 一组是你访问.asmx用的IIS认证密码,也就是那个windows帐户,另外一个就是你调用WebService具体方法时需要给出的帐户跟密码(保存在数据库里的)这个想必很熟悉了.
 代码如下:
   ServicePointManager.ServerCertificateValidationCallback = new   System.Net.Security.RemoteCertificateValidationCallback(RemoteCertificateValidationCallbackHandler); 
//因为你使用的是自签名的证书,客户端调用时会报警,使用上面行代码来忽略报警.
   WFServiece wfs=new WFServiece;  // WFService 客户端web服务的代理类
      wfs.Url = "https://域名:端口/某个.asmx"; //注意这里使用的https://
    NetworkCredential credential=new NetworkCredential("wow52.cn", "111111"); //访问凭证
    wfs.credential.GetCredential(new Uri( wfs.Url), "Basic") ;// 采用Basic方式-对应IIS里面设置的本认证方式
    wfs.HiMM("@$@^%&","用户名","密码");
------------------------
//上面代理的处理函数,直接返回true
        private bool RemoteCertificateValidationCallbackHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            return true;
        }


另外wfs有个UseDefaultCredentials 属性,一直很困惑,看MS的帮助后好象更困惑,(写代码时除了看代码,看其他的多容易困惑)
直到Reflector后,才发现是
public bool UseDefaultCredentials
 {
      get
        {
          if (this.credentials != CredentialCache.DefaultCredentials)
          {
            return false;
          }
            return true;
        }
     set
     {
        this.credentials = value ? CredentialCache.DefaultCredentials : null;
     }
  }

CredentialCahce.DefaultCredentials 是你本机当前使用用户的凭证,一般在AD环境中使用
     怪不得我在设置wfs.Credentials 属性后,不管设置它为false或true多出现401错误,而在设置前怎么设置,代码多运行正常,想想mS如果简单的在帮助里贴这么段代码能少我多少麻烦,能少大家多少麻烦....
------------------
最后开发的电脑最好不要去 $#$%$% 类型的网站了容易中标, 当然有个人专门下个套子给你,比方QQ先跟你套近呼,接着发个好玩的.rar给你,你打开后发现屏幕一闪(也许没闪),接着出来一个你并不感觉好玩的flash MTV之类的东西,也许比感动(因为这个QQ好友跟你比较熟悉了他了解你),然后..具体看你手上的东西值不值人家这样做了,不过看看是什么大家多是忍不住的....
原文地址:https://www.cnblogs.com/wdfrog/p/1212662.html