提问人:Szyszka947 提问时间:12/30/2022 更新时间:12/30/2022 访问量:864
如何在 C 中使用 Ed25519 创建自签名证书#
How to create self-signed certificate using Ed25519 in C#
问:
我必须使用 Ed25519 生成 X509 证书。我知道我应该使用命名空间中的类,但似乎它不支持 ed25519。RequestCertificate
System.Security.Cryptography.X509Certificates
这就是我的场景:我有私钥 ed25519 密钥,基于它,我需要生成能够在双向 TLS 中使用的自签名 X509 证书。
我不知道在使用 ed25519 时如何做到这一点,因为似乎不支持这条曲线。我该怎么做?
答:
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 个证书。
评论
CertificateRequest