当前位置: 首页 > news >正文

IIS6与IIS7在编程实现HTTPS绑定时的细微差别

本文章其实最主要信息是:

问题出在那个小小的*号上——IIS6中不支持通配符,第一部分为空时表示(All Unsigned),而IIS7中同时支持空或通配符的写法,如果为空则自动转为*:443:,我们将调用行改为:
AddHttpsBinding(":443:", "MY", hash);
后,问题解决。

文章转自:http://linwx1978.blog.163.com/blog/static/1504106920111281434624/

 

最近刚刚解决了一个困扰了很久的问题,发出来大家共享一下。
问题很简单,就是我们在做一个自动部署网站的程序,需要同时支持在IIS6与IIS7实现HTTPS,也就是要编程实现增加HTTPS绑定,开始的时候我的代码是这样的:

         private void WriteBinaryArrayToDirectoryEntry(PropertyValueCollection entry, byte[] data)
        {
            string[] arrStr = new string[data.Length];
            for (int i = 0; i < data.Length; i++)
            {
                arrStr[i] = String.Format("{0:x2}", data[i]);
            }
            object[] arrObj = new object[arrStr.Length];
            arrStr.CopyTo(arrObj, 0);

            entry.Clear();
            entry.Add(arrObj);
        }

       public void AddHttpsBinding(string binding, string nameStore, byte[] hash)
        {
            DirectoryEntry entry = new DirectoryEntry("IIS://localhost/W3SVC/1");//指向Default Web Site
 
           entry.Properties[”SecureBindings"].Clear();
            entry.Properties["SecureBindings"].Add(binding);
            WriteBinaryArrayToDirectoryEntry(entry.Properties["SSLCertHash"], hash);

            entry.CommitChanges();
        }
其中标出来的那一行需要注意,如果需要指向非缺省的网站就可能需要修改,当然,这是题外话。
调用如下:
AddHttpsBinding("*:443:", "MY", hash);
*:443:的意思是指定443端口,任意IP(All Unassigned IP)。

结果,在IIS7上运行良好,在IIS6及IIS5上就遇到了很多问题,HTTPS无法访问。

首先我们检查了HTTPS绑定,结果发现证书绑定失败。用Metabase Explorer检查/LM/W3SVC/1下应该有三项与HTTPS绑定有关的条目,分别是:
SecureBindings,指定端口、IP及HEADER信息。
SSLCertHash,指定目标证书的哈希值。
SSLStoreName,指定目标证书所在的目录。
绑定成功的情况下,这三个条目都应该出现,并且填入我们指定的值,但上述程序在IIS6上运行之后,只有前两个条目而没有SSLStoreName,导致HTTPS服务无法找到目标证书。
原因是,在IIS6中,必需设定SSLStoreName,而且还必需在设定SSLCertHash之前。但在IIS7中,SSLStoreName由系统自动设定,如果程序试图自行设定,系统会抛出异常:“A specified logon session does not exist. It may already have been terminated. (Exception from HRESULT: 0x80070520)”。

结果,我们只好把程序改成这样:
        public void AddHttpsBinding(string binding, string nameStore, byte[] hash)
        {
            DirectoryEntry entry = new DirectoryEntry("IIS://localhost/W3SVC/1");
            entry.Properties[”SecureBindings"].Clear();
            entry.Properties[”SecureBindings"]Add(binding);
            WriteBinaryArrayToDirectoryEntry(entry.Properties["SSLCertHash"], hash);

            entry.CommitChanges();

            if (TryGetValue("IIS://localhost/W3SVC/1""SSLStoreName") == "")
            {
                entry.Properties[
"SSLStoreName"].Clear();
                entry.Properties["SSLStoreName"].Add(nameStore);
                WriteBinaryArrayToDirectoryEntry(entry.Properties["SSLCertHash"
], hash);
                entry.CommitChanges();
            }
        }
加上了蓝色的部分,在前面的设定结束之后,测试SSLStoreName是否为空,如果为空,则依次设定SSLStoreName和SSLCertHash。在IIS6和IIS7上测试均成功。

然后我们就遇到了第二个问题:现在IIS6上绑定是成功的,从IIS管理器上也可以看到绑定的证书信息了,但仍然无法用HTTPS访问,下载了一个微软的SSL工具SSL Diagnostics测试了一下,说绑定的IP与SSL的IP不符,可能有问题。于是我们打开IIS管理器,在网站上点击右键,到属性->Web Site页,点击Advanced,在Multiple SSL identities for this Web Site一栏中,发现IP Address一栏写的居然是255.255.255.255,果然有问题!手动将其改为(All Unsigned)之后,问题解决。

使用Metabase Explorer检查,发现SecureBindings中写的是:443:,也就是说,问题出在那个小小的*号上——IIS6中不支持通配符,第一部分为空时表示(All Unsigned),而IIS7中同时支持空或通配符的写法,如果为空则自动转为*:443:,我们将调用行改为:
AddHttpsBinding(":443:", "MY", hash);
后,问题解决。

转载于:https://www.cnblogs.com/duanweishi/p/4273435.html

相关文章:

  • 【HDU】1847 Good Luck in CET-4 Everybody!
  • Javassist初体验
  • JavaScript高级程序设计--基本概念--笔记
  • javabean总结
  • Css布局系列-经典三列布局
  • msyql查表报InnoDB错误
  • Nodejs使用TLS
  • Overview
  • puppet注意事项
  • LAMP搭建小结
  • 【AngularJS】—— 5 表单
  • 用显微镜观察cpu芯片内部
  • 怎样获取android手机联系人并按字母展示(三)
  • C/C++产生随机数
  • Linux对文件归档和压缩(学习笔记八)
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【Amaple教程】5. 插件
  • 11111111
  • Codepen 每日精选(2018-3-25)
  • java8 Stream Pipelines 浅析
  • JS基础之数据类型、对象、原型、原型链、继承
  • Linux Process Manage
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • select2 取值 遍历 设置默认值
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 前嗅ForeSpider中数据浏览界面介绍
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 写代码的正确姿势
  • 用mpvue开发微信小程序
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​520就是要宠粉,你的心头书我买单
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • "无招胜有招"nbsp;史上最全的互…
  • #android不同版本废弃api,新api。
  • (8)STL算法之替换
  • (C++20) consteval立即函数
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (二)Eureka服务搭建,服务注册,服务发现
  • (二)JAVA使用POI操作excel
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET下的多线程编程—1-线程机制概述
  • .NET中统一的存储过程调用方法(收藏)
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [2016.7 test.5] T1
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [CSAWQual 2019]Web_Unagi ---不会编程的崽