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);
后,问题解决。
IIS6与IIS7在编程实现HTTPS绑定时的细微差别的更多相关文章
- IIS7 HTTPS 绑定主机头
IIS7下面默认HTTPS绑定是无法指定主机头的,但我们可以通过手工修改IIS配置来实现主机头绑定. 打开C:\Windows\system32\inetsrv\config\applicationH ...
- IIS7的网站通过https访问提示ssl_error_rx_record_too_long
IIS7的网站通过https访问,提示ssl_error_rx_record_too_long,如下图所示: 解决办法: 一.导入服务器的SSL证书至IIS 1.打开IIS,找到服务器证书 2.导入本 ...
- IIS6.0 IIS7.5应用程序池自动停止的解决方法
前边提到由win2003升级到win2008 server r2 64位系统,然后用了几个小时配置IIS7.5+PHP+MYSQL等的环境,先是遇到IIS7.5下PHP访问慢的问题,解决之后又出了新的 ...
- Migration of ASP.NET app from IIS6 to IIS7 (7.5)
For many of us familiar problem. You developing applications under IIS6 and you're about to move the ...
- IIS6.0 IIS7.5应用程序池自动停止的解决方法 搜集整理
来源:http://www.guchengnet.com/1499.html IIS6.0 IIS7.5应用程序池自动停止的解决方法 搜集整理 发表于2016年12月14日 有2.3个月没有用本地的i ...
- WCF自寄宿实现Https绑定
一.WCF配置 1 Address 将服务端发布地址和客户端访问地址都配置为https开始的安全地址.参考如下. <add key="SrvUrl" value=" ...
- IIS6、IIS7.5设置网站默认首页方法(Directory Listing Denied)
这篇文章主要介绍了IIS6.IIS7.5设置网站默认首页方法,如果不设置访问目录就会提示Directory Listing Denied,就是不允许列出文档,为了安全网站都会设置不设置默认,需要的朋友 ...
- EzHttp 使用Https协议时证书如何部署
今天为EzHttp增加了https支持, EzHttp介绍见这里:使用EzHttp框架 开发基于HTTP协议的CS轻应用 服务端启动时会创建自签名证书,并将其绑定到启动参数url对应的端口上. 服务端 ...
- Effective Java 第三版——70. 对可恢复条件使用检查异常,对编程错误使用运行时异常
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
随机推荐
- bug 问题
1. 图片 img 标签,在IE浏览器下会有空白 - 解决办法:display:block; 2. IE6 下父级没有宽高,不会触发haslayout. 触发原因:子级浮动,父级没有宽高,overfl ...
- CDMA学习
1.关于RC:http://www.mscbsc.com/askpro/question74915 2.CDMA知识要点:http://wenku.baidu.com/view/d4511442a89 ...
- JavaScript事件简述
事件简述 技术一般水平有限,有什么错的地方,望大家指正. 事件是我们平时经常使用,这次就来了解一下事件.首先我们要明确几个概念,JavaScript是单线程,浏览器是多线程的,并不是所有的事件处理函数 ...
- 使用存储过程非常慢,但是直接执行SQL很快
使用存储过程非常慢,但是直接执行SQL很快. 了解基本情况后,初步判断是参数嗅探问题 在对应的SQL语句后面使用 OPTION(OPTIMIZE FOR UNKNOWN) 参考了 http://www ...
- 关于Java Logger类的使用问题 - 内存不释放
原文地址:http://www.ihuxu.com/p/236.html 说明:这是一个利用Java Logger类的示例,完成简单的日志记录功能.代码中有部分类库没有说明,但不影响阅读. 本人技 ...
- ES Log4J配置信息
# 配置RollingFileappender appender.rolling.type = RollingFile appender.rolling.name = rolling # 日志名称 / ...
- ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: N O) MYSQL
ERROR 1045 (28000): Access denied for user ODBC@localhost 刚使用mysql, 碰到这个问题.. C:\Program Files\MySQL\ ...
- git的时候 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
更改Ubuntu服务器的时候,提交git出错: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: REMOTE ...
- 一年内自学MIT的33门课? 疯狂学习有方法
[导读]能快速掌握复杂信息,对成就卓越事业至关重要.ScottYoung的学习过程不只适用于学生,同样有助于学习复杂技能的专业知识. 能快速掌握复杂信息,对成就卓越事业至关重要.ScottYoung的 ...
- POJ 2585:Window Pains(拓扑排序)
Window Pains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2524 Accepted: 1284 Desc ...