Get a free SSL certificate interface.

DeepSeek给出的代码,通过 NuGet 安装 ACMESharp 库

bash 复制代码
bash:

Install-Package ACMESharp
cs 复制代码
using System;
using System.IO;
using ACMESharp;
using ACMESharp.Providers.IIS;
using ACMESharp.Providers.AWS;

namespace LetsEncryptExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 初始化ACME客户端
            var acme = new AcmeClient();
            acme.Init();

            // 注册ACME账户
            var registration = acme.Register("your-email@example.com");
            acme.AgreeToTos();

            // 申请证书
            var identifier = acme.Identifier("your-domain.com", "dns");
            var challenge = acme.Challenge(identifier, "http-01");

            // 完成挑战(例如,通过HTTP或DNS验证)
            // 这里以HTTP挑战为例
            var httpChallenge = challenge.Http;
            File.WriteAllText(httpChallenge.FilePath, httpChallenge.FileContent);

            // 通知ACME服务器挑战已完成
            acme.CompleteChallenge(challenge);

            // 等待挑战验证完成
            acme.WaitForChallengeValidation(challenge);

            // 生成证书请求
            var csr = acme.GenerateCertificateRequest(identifier);

            // 申请证书
            var cert = acme.RequestCertificate(csr);

            // 保存证书
            File.WriteAllBytes("certificate.pfx", cert.GetPfxCertificate());

            Console.WriteLine("证书申请成功并已保存为 certificate.pfx");
        }
    }
}

豆包给出的代码,通过API接口处理

cs 复制代码
using System;
using ACMESharp;
using ACMESharp.ACME;
using ACMESharp.Protocol;
using ACMESharp.Protocol.Resources;

class Program
{
    static async System.Threading.Tasks.Task Main()
    {
        // 初始化ACME客户端
        using (var client = new AcmeProtocolClient(new Uri("https://acme-v02.api.letsencrypt.org/directory")))
        {
            await client.Init();

            // 注册账户
            var reg = await client.NewRegistration(new AccountRegistration
            {
                Contact = new[] { "mailto:your_email@example.com" },
                TermsOfServiceAgreed = true
            });

            // 创建订单
            var order = await client.NewOrder(new[] { "your_domain.com" });

            // 获取挑战
            var authz = await client.GetAuthorization(order.Authorizations[0]);
            var challenge = authz.Challenges.Find(x => x.Type == ChallengeType.HTTP_01);

            // 处理挑战(这里需要根据挑战类型实现具体逻辑)
            // 例如,对于HTTP-01挑战,需要在网站根目录下创建相应的文件

            // 通知ACME服务器挑战已完成
            await client.AnswerChallenge(challenge.Uri);

            // 等待挑战验证
            var authzStatus = await WaitForAuthorization(client, authz.Uri);

            if (authzStatus.Status == EntityStatus.VALID)
            {
                // 生成CSR(证书签名请求)
                var csr = new CsrInfo
                {
                    CommonName = "your_domain.com",
                    SubjectAlternativeNames = new[] { "your_domain.com" }
                };
                var csrPem = csr.ExportAsPem();

                // 最终确定订单
                await client.FinalizeOrder(order.Finalize, csrPem);

                // 下载证书
                var certPem = await client.DownloadCertificate(order.Certificate);

                Console.WriteLine("证书已成功下载:");
                Console.WriteLine(certPem);
            }
            else
            {
                Console.WriteLine("挑战验证失败。");
            }
        }
    }

    static async System.Threading.Tasks.Task<Authorization> WaitForAuthorization(AcmeProtocolClient client, string authzUri)
    {
        var authz = await client.GetAuthorization(authzUri);
        while (authz.Status == EntityStatus.PENDING)
        {
            await System.Threading.Tasks.Task.Delay(5000);
            authz = await client.GetAuthorization(authzUri);
        }
        return authz;
    }
}

百度给出的代码,通过API接口处理

cs 复制代码
using System;
using ACMESharp.API;
using ACMESharp.API.Resource;
using System.Threading.Tasks;
 
class Program
{
    static async Task Main(string[] args)
    {
        var api = new ApiClient(new Uri("https://acme-v02.api.letsencrypt.org/directory"));
        var account = await api.CreateAccountAsync(new AccountCreationRequest { Contact = new[] { "mailto:your-email@example.com" } });
        var domain = "yourdomain.com";
        var order = await api.CreateOrderAsync(domain);
        var challenge = await api.CreateChallengeAsync(order, domain, ChallengeType.Http01);
        Console.WriteLine("Please visit this URL to validate: " + challenge.Uri);
        Console.ReadLine(); // Wait for user to validate the challenge
        await api.ValidateChallengeAsync(order, domain, challenge);
        var certificate = await api.FetchCertificateAsync(order);
        Console.WriteLine("Certificate received.");
    }
}
相关推荐
cici158741 小时前
C#实现三菱PLC通信
java·网络·c#
CreasyChan4 小时前
Unity Shader 入门指南
unity·c#·游戏引擎·shader
ysdysyn6 小时前
C# Modbus RTU 多从站控制全攻略:一端口,双轴控制
开发语言·c#·mvvm·通讯·modbus rtu
TypingLearn6 小时前
2026年,让.NET再次伟大
windows·c#·.net·sdk·netcore
ServBay7 小时前
.NET 10 与 C# 14 更新速览,代码更少,性能更好
后端·c#·.net
万粉变现经纪人8 小时前
如何解决 pip install SSL 报错 ValueError: check_hostname requires server_hostname 问题
网络·python·网络协议·beautifulsoup·bug·ssl·pip
玩泥巴的9 小时前
如何设计易维护、低学习成本的飞书.NET SDK组件
c#·二次开发·飞书·roslyn
Fighting_p10 小时前
【预览word文档】使用插件 docx-preview 预览线上 word 文档
开发语言·c#·word
jiushidt13 小时前
Things About ArcGISPro
arcgis·c#·.net·arcgispro
雪雁14 小时前
CodeSpirit 多语言国际化使用指南(Beta)
c#·asp.net·.net 10·codespirit