默认情况下从SQL Server 2005开始SQL Server会使用自动生成的证书来加密与客户的连接和数据包传输。你也可以给SQL Server配置你自己的证书来实现更高的安全性。
证书从哪里获得
你可以从第三方的证书颁发机构获得证书。你也可以选择使用工具制作自签名的证书用作测试的用途,或者你可以从你企业内部的证书的服务器来申请证书用作企业内部使用。
要制作自签名的证书,你可以使用IIS 6.0 Resource Kit中的SelfSSL工具(如果你的机器上有安装IIS的话)。在命令行中,输入以下命令:
selfssl.exe /N:CN=<FQDN> /K:1024 /V:7 /S:1 /P:442 /T
注意你需要将<FQDN>替换成你SQL Server服务器主机的实际FQDN。然后你会被询问“Do you want to replace the SSL settings for site 1 (Y/N)”。输入”Y”。这样证书就会被自动安装到本机的Certificate store中去。
如果你的机器上没安装IIS的话,你可以使用.NET SDK中的makecert工具来制作自签名的证书。命令行如下:
makecert -r -pe -n "CN=<FQDN>" -b 01/01/2000 -e 01/01/2036 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localMachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 c:/test.cer
请注意你仍需要将<FQDN>替换成你SQL Server服务器主机的实际FQDN。得到证书后,你需要将 证书安装到 certificate store(根据SQL Sever的启动账号决定是local computer或current user store)的personal以及"Trusted Root Certification Authorities"目录下 。
如果你的企业内部有证书服务器的话,你也可以从那里来申请证书。这里我用Windows Server自带的Certificate Authority(CA)为例。
1. 访问CA的网站来申请证书。申请时,name部分要填写SQL Server主机的FQDN,Type of Certificate Needed需要选择Server Authentication Certificate。Key Options要选exchange或者Both。如果你需要证书可以被重复导入导出,要勾选"Mark keys as exportable"。你也可以勾选"Store certificate in the local computer certificate store",这样你在下载证书的时候就可以直接安装到本机的certificate store里去了。
2. 等到证书被核发之后,你就可以通过CA的网站来下载证书了。同样的,也需要将证书安装到Certificate store的personal以及"Trusted Root Certification Authorities"目录下。
证书的配置
我们先来了解下SQL Server装载证书的步骤。
1. SQL Server 搜索HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SQL Server/MSSQL.1/MSSQLServer/SuperSocketNetLib/Certificate。通过Certificate键值中记录的证书的thumbprint来到certificate store中寻找相应的证书。如果找不到该证书,则SQL Server启动失败。
2. 如果Certificate键值为空,则SQL Server到certificate store中去寻找subject CN与SQL Server服务器主机的FQDN相同的证书。如果有这样的证书存在,SQL Server就读取第一个它找到的证书,装载并启动。
3. 如果还是找不到证书,则SQL Server就自动生成一个证书并使用这个证书启动。
有人可能是通过SQL Server configuration manager来选择证书并将它配置给SQL Server的。其实SQL Server configuration manager也是通过写Certificate键值来达到配置证书的目的。另外要注意的是SQL Server configuration manager中的下拉列表只能显示那些subject CN与SQL Server服务器主机的FQDN相同的证书。因此如果你需要配置一个CN与SQL Server服务器主机的FQDN不同的证书的话(除非是cluster环境,否则不推荐这样做,可能导致客户端连接问题),就需要使用手动修改Certificate键值的方法。
其次,如果不指定Certificate键值的话,则SQL Server自动搜索Certificate store中符合要求的证书。此时如果存在多个证书的话,我们是无法控制SQL Server选择哪个证书的。理论上SQL Server使用它找到的“第一个”证书,但是我们不能确定第一个证书是哪个。
基于上述的考虑,为了确定SQL Server使用我们想要的证书,我们推荐永远使用编辑Certificate注册表键值的方式来配置证书。具体的配置方式是:
1. 在Certificate中打开要使用的证书,复制其thumbprint。
2. 如果HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SQL Server/MSSQL.1/MSSQLServer/SuperSocketNetLib/Certificate不存在的话,就手动创建一个。需要注意的是,对于SQL Server 2000的,键值的类型是binary,对于SQL Server 2005及以后版本的SQL Server,键值的类型是string。
3. 对于SQL Server 2000,将thunbprint的值逐个输入到certificate键值中去。对于SQL Server 2005及以后版本的SQL Server,将thumbprint中的空格全部删除,然后复制到certificate键值中去。
最后,对于cluster环境下的SQL Server,由于证书的subject CN域等于SQL Server的虚拟网络名而不是某个节点的FQDN,因此无论你在哪个节点使用SQL Server Configuration Manager都是看不到该证书的,所以cluster环境下我们需要在所有cluster节点上手动编辑Certificate键值来为SQL Server配置证书。
当证书被成功配置后,我们启动SQL Server,然后检查SQL Server的error log。如果看到这么一句话:
The certificate was successfully loaded for encryption. |
那么我就可以确认证书配置成功了。从SQL Server 2008开始,上述信息后面还会附带所装载证书的thumbprint,方便你进一步确认SQL Server确实使用了你所指定的证书。