如何为Ubuntu上运行的C# Secure WebSockets服务生成LAN访问可用证书
问题根因
你遇到的证书不信任问题本质是默认ASP.NET Core开发证书仅在主体备用名称(SAN)中配置了localhost域名,没有包含127.0.0.1、192.168.0.10这类IP地址,浏览器校验访问地址与证书绑定地址不匹配就会触发安全警告。
证书生成步骤
以下操作全部在Ubuntu服务器上执行,系统默认预装openssl,缺失的话先执行sudo apt install openssl安装。
- 生成自签根CA证书(用于给服务器证书签名,后续客户端信任这个根CA即可信任所有它签发的证书)
- 生成根CA私钥:
openssl genrsa -out myLocalCA.key 2048 - 生成根CA公钥证书(有效期设为3650天可自行调整):
openssl req -x509 -new -nodes -key myLocalCA.key -sha256 -days 3650 -out myLocalCA.crt
执行后按提示填写信息即可,Common Name可填写自定义名称比如MyHomeDevCA
- 生成服务器证书
- 新建证书配置文件
server.conf,写入以下内容,注意替换对应地区、组织信息,IP地址改为你服务器的实际局域网IP:
[req] default_bits = 2048 prompt = no default_md = sha256 distinguished_name = dn req_extensions = req_ext [dn] C = CN ST = 你所在省份 L = 你所在城市 O = 你的开发组织名 OU = 开发组 CN = 192.168.0.10 [req_ext] subjectAltName = @alt_names extendedKeyUsage = serverAuth [alt_names] DNS.1 = localhost IP.1 = 127.0.0.1 IP.2 = 192.168.0.10
- 生成服务器私钥:
openssl genrsa -out server.key 2048 - 生成服务器证书签名请求:
openssl req -new -key server.key -out server.csr -config server.conf - 用根CA签发服务器证书(有效期设为365天可自行调整):
openssl x509 -req -in server.csr -CA myLocalCA.crt -CAkey myLocalCA.key -CAcreateserial -out server.crt -days 365 -sha256 -extensions req_ext -extfile server.conf - 导出为ASP.NET Core需要的PFX格式,执行后按提示设置PFX密码,记得留存后续配置要用:
openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt
- 校验证书是否正确
执行命令查看证书SAN配置,确认包含你需要的所有访问地址:openssl x509 -in server.crt -text -noout | grep -A 1 "Subject Alternative Name"
服务端配置
- 把生成的
server.pfx文件放到你的C#项目根目录,或者指定一个固定路径比如/etc/ssl/certs/server.pfx,设置正确权限:sudo chmod 644 /path/to/server.pfx - 修改C#项目的Kestrel配置,在Program.cs中添加以下配置,替换为你自己的PFX路径和密码:
builder.WebHost.UseKestrel(options => { options.ListenAnyIP(5000, listenOptions => { listenOptions.UseHttps("server.pfx", "你设置的PFX密码"); }); });
- 重新编译启动后端服务即可。
客户端信任配置
所有需要访问该服务的局域网设备,都需要安装之前生成的myLocalCA.crt根证书到受信任根证书存储区:
- Windows设备:双击crt文件,选择安装证书→本地计算机→将所有证书放入下列存储→浏览选择「受信任的根证书颁发机构」→完成安装
- Linux设备:将crt文件复制到
/usr/local/share/ca-certificates/目录,执行sudo update-ca-certificates - 移动设备:将crt文件传到设备后点击安装,选择信任为VPN/应用级根证书
额外安全配置建议
- 服务器证书有效期不要超过1年,根CA证书不要超过3年,到期前及时更新
- 私钥文件(myLocalCA.key、server.key、server.pfx)严格保管,不要提交到代码仓库、不要公开对外泄露
- Kestrel配置中禁用不安全的TLS版本,仅启用TLS1.2和TLS1.3:
listenOptions.UseHttps(opt => { opt.SslProtocols = System.Security.Authentication.SslProtocols.Tls12 | System.Security.Authentication.SslProtocols.Tls13; });
- 后期如果需要新增域名/IP访问,直接在server.conf的alt_names下添加对应条目,重新签发服务器证书即可
内容的提问来源于stack exchange,提问作者Mihnea Cristian Marin
相关产品推荐
相关产品推荐

