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);
后,问题解决。
最新文章
- Android权限管理之RxPermission解决Android 6.0 适配问题
- 【Mutual Training for Wannafly Union #1 】
- windows下的mysql忘记root密码的解决方法
- SQL Server 2008 R2——以特定符号出现的次数来判断当前内容所在的层次
- WebPack常用功能介绍
- jQuery关于隐式迭代的个人理解~
- ASP.net(C#)批量上传图片(完整版)
- 基于Python,scrapy,redis的分布式爬虫实现框架
- GPIO的配置过程
- wamp的搭建-个人笔记
- for循环 重点题
- bzoj 1492: [NOI2007]货币兑换Cash
- 保存html上传文件过程中遇到的字节流和字符流问题总结
- 【英国毕业原版】-《博尔顿大学毕业证书》Bolton一模一样原件
- [Swift]LeetCode959. 由斜杠划分区域 | Regions Cut By Slashes
- 华为oj之质数因子
- SQL SERVER2008 数据库日志文件的收缩方法
- 【Teradata Utility】系统工具使用
- 【CSS】定义元素的对齐方式
- 微信小程序开发-滑动操作
热门文章
- POJ 2752 KMP中next数组的理解
- Python Django 前后端数据交互 之 前端向后端发送数据
- TListBox的项目个数
- L211
- 图片预加载 js css预加载
- WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable(spark加载hadoop本地库的时候出现不能加载的情况要怎么解决呢?)
- OK335xS Ubuntu 12.04.1 版本 Android 开发环境搭建
- NVIDIA GeForce GTX 960 设备是不可移动的,无法弹出
- 浅谈 React
- LG3372 【【模板】线段树 1】