在生产环境中,WCF服务使用SSL时需要绑定一个有效的证书。而在开发环境中,可以使用自签名证书。本文将介绍如何创建自签名证书,并将其绑定到WCF服务运行的端口上。此外,还将介绍如何编辑配置文件以及如何运行服务和客户端。
为了让WCF服务使用SSL,必须将证书绑定到服务运行的端口上。本文将介绍三种创建和绑定自签名证书的方法:
启动IIS管理器,例如通过“开始/运行/inetmgr.exe”。选择计算机名称的顶级节点。双击“服务器证书”图标。点击“创建自签名证书”链接。为证书指定一个友好的名称,例如“IIS自签名”。证书将被添加到证书列表中。选择“默认网站”节点并点击“绑定”链接。设置端口为“44400”,选择SSL证书“IIS自签名”,然后点击“确定”。
首先检查端口“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脚本在“个人”存储中创建一个自签名证书,并将其文件保存为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文件中注册。需要将这个地址更改为在证书管理单元中显示的地址。