Get a free SSL certificate interface.

发布于:2025-02-25 ⋅ 阅读:(12) ⋅ 点赞:(0)

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

bash:

Install-Package ACMESharp

 

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接口处理

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接口处理

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.");
    }
}