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中的,所 ...
随机推荐
- 7dynamic_cast用法
已知下面的class层次,其中每一个class都定义有一个default constructor和一个virtual destructor: class X{……}; class A{……}; cla ...
- bzoj1619
题解: 简单灌水 从最高的开始 代码: #include<bits/stdc++.h> ; typedef long long ll; using namespace std; ]={,, ...
- PHP生成GIF动态图片验证码
<?php /** * 调用示例 * */ session_start(); $randCode = ''; //验证码随机 $str="abcdefghjkmnpqrstuvwsyz ...
- Windows XP系统服役13年今正式退休
清明已过,服役13年的微软Windows XP系统也于今日正式“退休”.尽管这之后XP系统仍可以继续使用,但微软不再提供官方服务支持.对于中国数以亿计的XP用户来说,一方面是对已经使用了13年的操作系 ...
- [翻译]HTTP: Let’s GET It On!
原文地址:HTTP: Let’s GET It On! 简介 几周之前,我们了解到HTTP是一个应用级的协议.现在是时候探索我们应该如何在客户端和服务端的通信之间使用这个协议了. 从网络上获取资源 记 ...
- Matlab量化函数quantiz解析
在Matlab里,有一个量化函数quantiz,其函数形式有以下三种: 输入变量: sig代表的是原始信号; codebook代表的是量化值的集合; partition是分割向量,代表对量化范围分割等 ...
- ubuntu16安装mysql图形界面
之前在windows用sqlyog当做图形界面连接mysql,现在在ubuntu上需要连接测试环境的数据库,需要安装mysql图形界面.安装只需要条命令: sudo apt-get update su ...
- 接口测试之postman-简单使用
Postman功能(https://www.getpostman.com/features) 主要用于模拟网络请求包 快速创建请求 回放.管理请求 快速设置网络代理 安装 下载地址:https://w ...
- magento的布局文件之谜
magento的布局文件layout.xml文件详解 解析顺序 布局xml文件一般位于app/design/{area}/{package}/{theme}/layout/目录下.Layout文件一般 ...
- linux配置禁用启用IPv6
IPv6被认为是IPv4的替代产品,它用来解决现有IPv4地址空间即将耗尽的问题.但目前,开启IPv6可能会导致一些问题.因此有时我们需要关闭IPv6.下面是IPv6的关闭方法应该适用于所有主流的Li ...