You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core Ubuntu环境下用TPM私钥搭建TLS服务器的实现问询

问题

我希望在.NET Core类库中实现如下OpenSSL命令的等效功能:搭建一个TLS服务器,其私钥存储在TPM中,引用标识为0x8100001:

openssl s_server -cert rsa.crt -key 0x8100001-keyform engine -engine tpm2tss -accept 8443

该功能需运行在Ubuntu系统的.NET Core环境中。在Windows系统中,我们可通过证书存储(其已封装TPM访问逻辑)实现等效功能,代码如下:

X509Store store = new X509Store(storeName, StoreLocation.CurrentUser);  
store.Open(OpenFlags.ReadOnly);  
X509Certificate2Collection col = store.Certificates.Find(X509FindType.FindBySubjectName, commonName,false);  

但Ubuntu系统中无类似机制,请问是否有可用的工具包示例?

解决方案

在Ubuntu的.NET Core环境中,可通过以下两种方式实现基于TPM私钥的TLS服务器功能:

1. 使用 Tpm2Lib 结合.NET Core TLS API

Tpm2Lib 是微软官方维护的TPM 2.0操作库,可直接与TPM硬件交互,获取存储的私钥引用。

步骤示例:

  • 安装 Tpm2Lib NuGet包:
    dotnet add package Tpm2Lib
    
  • 核心代码实现:
    using System;
    using System.Net.Security;
    using System.Net.Sockets;
    using System.Security.Cryptography.X509Certificates;
    using Tpm2Lib;
    
    class TpmTlsServer
    {
        static void Main(string[] args)
        {
            // 初始化TPM连接
            using var tpm = Tpm2Device.GetTpm2Device();
            tpm.Connect();
    
            // 指定TPM中私钥的引用标识
            var privateKeyHandle = new TpmHandle(0x8100001);
    
            // 加载对应公钥证书
            var cert = new X509Certificate2("rsa.crt");
    
            // 启动TCP监听
            var listener = new TcpListener(System.Net.IPAddress.Any, 8443);
            listener.Start();
            Console.WriteLine("TLS Server running on port 8443...");
    
            while (true)
            {
                using var client = listener.AcceptTcpClient();
                using var sslStream = new SslStream(client.GetStream(), false);
                try
                {
                    // 自定义签名逻辑:将TLS握手的签名请求委托给TPM
                    // 需要扩展X509Certificate2,替换默认私钥提供者为TPM签名实现
                    sslStream.AuthenticateAsServer(cert, false, System.Security.Authentication.SslProtocols.Tls12, false);
                    // 后续处理客户端请求
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Handshake failed: {ex.Message}");
                }
            }
        }
    }
    
    注意:默认SslStream无法直接绑定TPM私钥,需实现自定义签名逻辑,通过Tpm2Lib的Sign方法完成TPM侧的签名操作。

2. 使用 OpenSSL.NET 调用tpm2tss引擎

通过OpenSSL.NET直接调用OpenSSL的tpm2tss引擎,复用OpenSSL的TPM密钥处理逻辑,与你给出的OpenSSL命令逻辑完全对齐。

步骤示例:

  • 先在系统层面安装tpm2-tss-engine:
    apt install tpm2-tss-engine
    
  • 安装OpenSSL.NET NuGet包:
    dotnet add package OpenSSL.NET
    
  • 核心代码实现:
    using System;
    using System.Net.Sockets;
    using OpenSSL;
    using OpenSSL.SSL;
    using OpenSSL.X509;
    
    class OpenSslTpmTlsServer
    {
        static void Main(string[] args)
        {
            // 加载并初始化tpm2tss引擎
            var engine = Engine.Load("tpm2tss");
            engine.Init();
    
            // 加载证书文件
            using var cert = new X509Certificate("rsa.crt");
            // 从TPM引擎加载指定标识的私钥
            using var key = EVP.PKey.FromEngine(engine, "0x8100001");
    
            // 配置SSL上下文
            using var context = new SslContext(SslMethod.TLSv1_2_server_method);
            context.UseCertificate(cert);
            context.UsePrivateKey(key);
            context.CheckPrivateKey();
    
            // 启动TCP监听
            var listener = new TcpListener(System.Net.IPAddress.Any, 8443);
            listener.Start();
            Console.WriteLine("TLS Server running on port 8443...");
    
            while (true)
            {
                using var client = listener.AcceptTcpClient();
                using var sslStream = new SslStream(context, client.GetStream(), false);
                sslStream.Accept();
                // 处理客户端请求
            }
        }
    }
    

内容的提问来源于stack exchange,提问作者appcoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 17:48:13