本文背景

最近项目上用到微软的技术栈,需要用到Windows Server支持服务的运行。应用层采用Self-Hosting的形式提供HTTP REST API服务,考虑到安全性需升级支持SSL,并将证书绑定至端口。常见的通过IIS/Apache/Nginx等宿主的形式部署HTTPS服务很方便,涉及到自定义应用程序的Self-Hosting,需要做一些简单的端口绑定操作。虽不是本职工作,考虑到帮队友分担任务,协助研究如何配置。这里我将配置的过程及配置说明记录,以帮助其他有此需求的网友。

操作步骤

证书的安装及指纹查看

  1. 获取已颁发的SSL证书,双击打开证书查看常规信息,如果先前尚未安装此证书,则双击安装证书,按照流程安装证书即可,如下图所示:

  1. 在详细信息Tab页查看及复制证书指纹,这里是后面需要用到的。如下图:

绑定证书到端口配置

在Server 2008及以上版本中,使用 Netsh.exe 工具查看当前端口配置。打开CMD,输入:

netsh http show sslcert  

即可查看当前已经绑定的证书明细,该操作主要了解当前已绑定的端口号及证书信息。如果你要绑定的端口是100端口,那么执行以下操作命令:

netsh http add sslcert ipport=0.0.0.0:100 certhash=1d12a7c3e39524777730c13e017724b4c146aaaa appid={3fa83ee8-a2e9-11e5-bf7f-feff819caaaa} clientcertnegotiation=enable  

注意certhash是先前查看及复制的证书指纹,而Appid则是唯一的程序标示符(可来自于应用程序集的GUID,也可以是随机生成,便于以后查看哪个程序绑定了该端口的证书)。需要注意的是同一个应用程序对于同一个端口的监听要么是HTTP要么是HTTPS,否则会发生冲突(同一个端口已启用HTTP监听,再启用HTTPS监听会冲突报错)。

执行成功之后,打开https://xxx.com:100 即可访问,这里的xxx.com域名必须是注册证书对应的域名。如果添加及测试完毕之后,需要删除绑定,则执行以下命令:

netsh http delete sslcert ipport=0.0.0.0:100  

可能会遇到的问题

  1. 执行netsh时遇到1312的错误,具体表现为提示错误“未能添加SSL证书,错误:1312。指定的登录会话不存在,可能已被终止。

如果出现上述问题,是因为生成证书的服务器与要安装此证书的服务器不是同一台。如果在证书管理器中查看证书时,会发现少了左下角的一个提示“您有一个与该证书对应的私钥”。那么只需要导入证书时导入带私钥的pfx文件即可。相关证书区别如下:

1.带有私钥的证书
由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。

2.二进制编码的证书
证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名。