在 SuperSocket 中启用传输层加密 (TLS)

    SuperSocket 内置对 TLS 的支持。你不需要对你的代码做任何改动而让你的 Socket 服务器支持传输层加密。

    有两种提供证书的方式:

    1. 一个有私钥的 X509 证书文件 (*.pfx)
      • 生成用于测试的证书文件,你可以使用这个开源的 CertificateCreator;()
      • 在生产环境之中,你应该从一个证书机构购买证书;
    2. 使用你本地证书仓库中的证书;

    你应该通过下面的步骤更新配置来使用证书文件:

    1. 设置 listener 的 security 属性;此属性的值是 listener 支持的 TLS 协议类型;适用的值包括 “Tls11”, “Tls12”, “Tls13” 等等; 多个协议种类用逗号分隔开, 例如 “Tls11,Tls12,Tls13”;

    注意: certificate options中的 password 是证书文件的私钥;

    另外还有一个额外的选项 “keyStorageFlags“ 用于证书加载:

    1. "filePath": "supersocket.pfx",
    2. "password": "supersocket",
    3. "keyStorageFlags": "UserKeySet"
    4. }

    你可以阅读下面这篇 MSDN 文章 获取这个选项的更多信息: http://msdn.microsoft.com/zh-cn/library/system.security.cryptography.x509certificates.x509keystorageflags(v=vs.110).aspx.aspx)

    其他可选选项:

    • storeLocation - CurrentUser, LocalMachine

      1. "certificateOptions": {
      2. "thumbprint": "‎f42585bceed2cb049ef4a3c6d0ad572a6699f6f3",
      3. "storeLocation": "LocalMachine"

    在 TLS 通信中,客户端证书不是必须的。但是有些系统需要更高的安全性。此功能允许你在服务器端验证客户端的证书。

    然后你应该在你配置服务器选项的时候通过 CertificateOptions 的 RemoteCertificateValidationCallback 定义你的客户端证书验证逻辑:

    1. var host = SuperSocketHostBuilder.Create<TextPackageInfo, LinePipelineFilter>(args)
    2. .ConfigureSuperSocket(options =>
    3. foreach (var certOptions in options.Listeners.Where(l => l.CertificateOptions != null && l.CertificateOptions.ClientCertificateRequired))
    4. {
    5. certOptions.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
    6. }
    7. }).Build();
    8. await host.RunAsync();