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.");
    }
}
相关推荐
hqwest42 分钟前
C#WPF实战出真汁08--【消费开单】--餐桌面板展示
c#·wpf·ui设计·wpf界面设计
orangapple1 小时前
WPF 打印报告图片大小的自适应(含完整示例与详解)
c#·wpf
zzc92114 小时前
TLSv1.2协议与TCP/UDP协议传输数据内容差异
网络·测试工具·安全·wireshark·ssl·密钥·tlsv1.2
★YUI★16 小时前
学习游戏制作记录(玩家掉落系统,删除物品功能和独特物品)8.17
java·学习·游戏·unity·c#
谷宇.16 小时前
【Unity3D实例-功能-拔枪】角色拔枪(二)分割上身和下身
游戏·unity·c#·游戏程序·unity3d·游戏开发·游戏编程
LZQqqqqo17 小时前
C# 中 ArrayList动态数组、List<T>列表与 Dictionary<T Key, T Value>字典的深度对比
windows·c#·list
Dm_dotnet20 小时前
Stylet启动机制详解:从Bootstrap到View显示
c#
三千道应用题21 小时前
WPF&C#超市管理系统(6)订单详情、顾客注册、商品销售排行查询和库存提示、LiveChat报表
开发语言·c#·wpf
唐青枫1 天前
别滥用 Task.Run:C# 异步并发实操指南
c#·.net
我好喜欢你~1 天前
C#---StopWatch类
开发语言·c#