WCF服务通过HTTPS和事务实现

在生产环境中,WCF服务使用SSL时需要绑定一个有效的证书。而在开发环境中,可以使用自签名证书。本文将介绍如何创建自签名证书,并将其绑定到WCF服务运行的端口上。此外,还将介绍如何编辑配置文件以及如何运行服务和客户端。

为了让WCF服务使用SSL,必须将证书绑定到服务运行的端口上。本文将介绍三种创建和绑定自签名证书的方法:

  • 使用IIS管理器
  • 使用命令行工具makecert和netsh http
  • 使用提供的CreateCert.bat脚本,该脚本使用makecert、certutil和netsh http

使用IIS管理器创建证书

启动IIS管理器,例如通过“开始/运行/inetmgr.exe”。选择计算机名称的顶级节点。双击“服务器证书”图标。点击“创建自签名证书”链接。为证书指定一个友好的名称,例如“IIS自签名”。证书将被添加到证书列表中。选择“默认网站”节点并点击“绑定”链接。设置端口为“44400”,选择SSL证书“IIS自签名”,然后点击“确定”。

使用makecert和netsh http创建证书

首先检查端口“44400”是否已经注册了证书:

netsh http show sslcert ipport=0.0.0.0:44400

如果证书已经存在,使用以下命令删除它:

netsh http delete sslcert ipport=0.0.0.0:44400

为localhost创建证书:

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\x64\makecert" -ss My -sr LocalMachine -n CN=localhost -r

这将创建一个名为localhost的证书,可以在“证书管理单元/证书(本地计算机)/个人/证书”中看到它。

使用CreateCert.bat创建证书

提供的CreateCert.bat脚本在“个人”存储中创建一个自签名证书,并将其文件保存为c:\localhost.cer,然后将其导入到“受信任的人”存储中,使用certutil找到证书的指纹,并将该证书注册到端口“44400”。

以管理员身份运行CreateCert.bat。输出将类似于以下内容:

C:\Windows\system32>"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\makecert" -r -sk COMPUTER1 -sr LocalMachine -ss My -n CN=COMPUTER1,CN=localhost,CN=COMPUTER1 c:\localhost.cer Succeeded ... C:\Windows\system32>netsh http delete sslcert ipport=0.0.0.0:44400 SSL Certificate deletion failed, Error: 2 The system cannot find the file specified. ... C:\Windows\system32>netsh http add sslcert ipport=0.0.0.0:44400 certhash=fa5ee6c56c066a5349ba64245e09580996ec5d56 appid={12345678-1234-1234-1234-123456789012} SSL Certificate successfully added

可以使用以下命令检查端口“44400”是否绑定了证书:

netsh http show sslcert ipport=0.0.0.0:44400

使用代码

解决方案包含两个项目:WCFService(托管WCF服务的控制台应用程序)和WCFClient(调用WCF服务的控制台应用程序)。服务只实现了一个方法:

<ServiceContract()> Interface ITestService <OperationContract()> <TransactionFlow(TransactionFlowOption.Mandatory)> Function GetResult() As String End Interface <ServiceBehavior(TransactionIsolationLevel:=System.Transactions.IsolationLevel.Serializable, TransactionTimeout:="00:00:30", ReleaseServiceInstanceOnTransactionComplete:=False, TransactionAutoCompleteOnSessionClose:=False, IncludeExceptionDetailInFaults:=True)> Public Class TestService Implements ITestService <OperationBehavior(TransactionScopeRequired:=True, TransactionAutoComplete:=True)> Public Function GetResult() As String Implements ITestService.GetResult Return String.Format("Hello, busy World. {0}", DateTime.Now.ToShortTimeString()) End Function End Class

客户端只调用服务一次:

Sub Main() Try Using tx As New TransactionScope() Dim client = New ServiceReference1.TestServiceClient() Dim result = client.GetResult() client.Close() Console.WriteLine(result) tx.Complete() End Using Catch ex As Exception Console.WriteLine(ex.ToString) End Try Console.ReadKey() End Sub

WCFService的地址是https://computer1.domain1.com:44400,并在WCFClient和WCFService的app.config文件中注册。需要将这个地址更改为在证书管理单元中显示的地址。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485