证书可以购买或者使用openssl.exe工具生成。
一.
首先我这里使用openssl.exe生成自认证证书
openssl.exe genrsa -des3 -out private-rsa.key 1024
openssl.exe req -new -x509 -key private-rsa.key -days 3650 -out public-rsa.cer
openssl.exe pkcs12 -export -name “www.laocj.com” -in public-rsa.cer -inkey private-rsa.key -out user-rsa.pfx
重要之处!!
-密码设6位
-证书名称,填写域名或者ip,客户端访问时用域名或ip
-证书安装位置,两个位置都要安装
—本地计算机》个人》注册表
—本地计算机》受信任的根证书颁发机构》注册表
双击.pfx后缀文件安装
二.
证书安装正确后,cmd使用以下命令把证书与端口绑定.
删除端口证书绑定
netsh http delete sslcert ipport=0.0.0.0:8181
查看端口证书绑定
netsh http show sslcert
添加端口证书绑定 appid程序唯一id 双击.cer后缀文件 详细信息里面查看指纹certhash
netsh http add sslcert ipport=0.0.0.0:8181 certhash=82a438c70e657ff8988fd7f5d9458cc02753c114 appid={3cdebb12-f6d5-4997-a4c2-be4fdc553c01}
三.
常见问题
1.端口证书绑定是提示:会话已丢失啥的,
是因为证书没有安装到本地计算机》个人》注册表,安装即可。
2.客户端wss连接时提示错误:RemoteCertificateNameMismatch,远程证书名称不匹配,
是因为证书的名称和wss请求的地址不同导致的,
即生成证书时名称用了ip,wss则需要用ip连接wss:192.168.1.1:4433,
生成证书时名称用了域名,wss则需要用域名连接wss:www.laocj.com:4433
2.客户端wss连接时提示错误:RemoteCertificateChainErrors,远程证书链错误,
是因为证书没有安装到本地计算机》受信任的根证书颁发机构》注册表,安装即可。
3.我还遇到过一种情况,服务端用HttpListener做监听时,第一次用wss连,连接不上,需要先用https在浏览器访问一次那个地址…
下面是c#自动加载安装证书并绑定到指定端口的代码
//var certPort = "443";
//var certName = "192.168.13.16";
//var certPath = @"F:\证书\openssl-0.9.8k_WIN32\bin\user-rsa.pfx";
//var certPwd = "111111";
private void X509Certificate(string certPath,string certPwd,string certName,string certPort)
{
X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.MaxAllowed);
X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySubjectName,
certName, false);
if (certs.Count == 0 || certs[0].NotAfter < DateTime.Now)
{
X509Certificate2 certificate =
new X509Certificate2(certPath, certPwd,
X509KeyStorageFlags.MachineKeySet |
X509KeyStorageFlags.Exportable |
X509KeyStorageFlags.PersistKeySet);
X509Store storeMy = new X509Store(StoreName.My, StoreLocation.LocalMachine);
storeMy.Open(OpenFlags.ReadWrite);
storeMy.Remove(certificate);
storeMy.Add(certificate);
storeMy.Close();
X509Store storeRoot = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
storeRoot.Open(OpenFlags.ReadWrite);
storeRoot.Remove(certificate);
storeRoot.Add(certificate);
storeRoot.Close();
ProcessStartInfo psi = new ProcessStartInfo();
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
psi.FileName = "netsh";
psi.Arguments = $"http delete sslcert ipport=0.0.0.0:{certPort}";
Process proc = Process.Start(psi);
proc.WaitForExit();
psi.Arguments = $"http add sslcert ipport=0.0.0.0:{certPort}" +
$" certhash={certificate.Thumbprint}" +
$" appid={{{Guid.NewGuid().ToString()}}}";
proc = Process.Start(psi);
proc.WaitForExit();
}
}