如何在 C 中使用 Ed25519 创建自签名证书#

How to create self-signed certificate using Ed25519 in C#

提问人:Szyszka947 提问时间:12/30/2022 更新时间:12/30/2022 访问量:864

问:

我必须使用 Ed25519 生成 X509 证书。我知道我应该使用命名空间中的类,但似乎它不支持 ed25519。RequestCertificateSystem.Security.Cryptography.X509Certificates

这就是我的场景:我有私钥 ed25519 密钥,基于它,我需要生成能够在双向 TLS 中使用的自签名 X509 证书。

我不知道在使用 ed25519 时如何做到这一点,因为似乎不支持这条曲线。我该怎么做?

C# x509证书 客户端证书 MTLS ED25519

评论

0赞 bartonjs 1/4/2023
内置的 .NET 加密类不支持 Edwards DSA (EdDSA)。如果您有 EdDSA 的实现,则可以创建一个 X509SignatureGenerator 来表示 EdDSA,并将其与类一起使用。否则,您将需要使用外部的东西(Bouncy Castle,直接使用OpenSSL,使用OpenSSL命令行工具等)。CertificateRequest

答:

3赞 Nora Söderlund 12/30/2022 #1

为 OpenSSL 创建一个配置文件,例如 openssl-25519.cnf:

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = DE
CN = www.example.com
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.example.com
DNS.2 = example.com

您可以将 File.WriteAllText 用于临时文件以在证书签名期间使用它,而 openSsl25519Configuration 是上述配置的字符串,您可以在其中插入动态值。

string tempCnfName = Path.GetTempFileName();

File.WriteAllText(tempCnfName, openSsl25519Configuration);

然后,使用 OpenSSL 使用您的私钥 (example.com.key) 请求证书签名请求文件。

openssl req -new -out example.com.csr -key example.com.key -config openssl-25519.cnf

如果您已有私钥,请在进程参数中引用 .key 文件的文件路径:

string tempCsrName = Path.GetTempFileName();

Process process = new Process() {
    StartInfo = {
        FileName = "openssl.exe",
        Arguments = $"req -new -out {tempCsrName} -key example.com.key -config {tempCnfName}"
    }
};

process.Start();
process.WaitForExit();

现在您可以再次使用 OpenSSL 进行自签名:example.com.csr

openssl x509 -req -days 700 -in example.com.csr -signkey example.com.key -out example.com.crt
string tempCrtName = Path.GetTempFileName();

Process process = new Process() {
    StartInfo = {
        FileName = "openssl.exe",
        Arguments = $"req x509 -req -days 700 -in {tempCsrName} -signkey example.com.key -out {tempCrtName}"
    }
};

process.Start();
process.WaitForExit();

现在,你有一个自签名ED25519证书,你可以根据需要通过 tempCrtName 移动或读取该证书。

如果您还没有私钥,可以生成一个

openssl genpkey -algorithm ED25519 > example.com.key

来源:https://blog.pinterjann.is/ed25519-certificates.html

评论

0赞 Szyszka947 12/30/2022
我知道OpenSSL是可能的。但是我需要在 C# 中“动态”生成这些证书。
0赞 Nora Söderlund 12/30/2022
您可以使用 C# 中的 Processes 获得相同的结果,我将更新我的答案以反映这一点。
0赞 Szyszka947 12/30/2022
一个聪明的解决方案。但这似乎不是一个性能解决方案,因为我们需要启动一个新进程(并且必须安装 OpenSSL),我们需要创建临时文件,稍后从中读取它。请原谅我,但我认为这不是最好的答案。
0赞 Nora Söderlund 12/30/2022
在性能方面,I/O 并不是一个真正的“问题”,除非我们当然在谈论将 I/O 用作大规模数据库——当然,是的。但是写入文件,从文件中读取,在一个有点大的操作中 2 次根本不是问题。
0赞 Szyszka947 12/30/2022
我预计每秒至少有 20 个证书。