c# - 在 .net Framework 4.7.2 中从 base64 字符串创建 certificateRequest
问题描述
过去我使用我们certTool
的 comCERTENROLLLib
来创建csr
. 从版本4.7.2
开始,您可以使用 .net 框架。
可以csr
通过在方法中传递所有必要的属性CreateSigningRequest
并将其转换为pem
base64
字符串来创建。
不幸的是,我找不到其他方法,在字段中复制 pem 格式的 csr 并csr
从中读取所有属性(cn、san、组织等)
我不想使用 com lib CERTENROLLLib
、 openssl 或其他 3rd 方。
这是我所做的(获取 csr pem 字符串)在这里和 MS Framework 类描述中找到了很好的示例,感谢您的帮助
protected void createButton_Click(object sender, EventArgs e)
{
string csr_cn = txtb_csr_cn.Text;
string csr_c = txtb_csr_c.Text;
string csr_l = txtb_csr_l.Text;
string csr_o = txtb_csr_o.Text;
string csr_ou = txtb_csr_ou.Text;
string csr_s = txtb_csr_s.Text;
csr_san = sanMemo.Text.Replace(" ", "");
if (csr_san.IndexOf(csr_cn) == -1)
{
if (csr_san == "")
{
csr_san = csr_cn;
}
else
{
csr_san = csr_cn + "," + csr_san;
}
}
csr_key_size = Convert.ToInt32(combobox_csr_key.Text);
csr_info = "CN=" + csr_cn + "," + "OU=" + csr_ou + "," + "O=" + csr_o + "," + "L=" + csr_l + "," + "S=" + csr_s + "," + "C=" + csr_c;
notesMemo.Text = CreateCSR(); //CreateRequest();
}
public static string CreateCSR()
{
string[] arrSeperator = new string[] { "," };
RSA keySize = RSA.Create(csr_key_size);
CertificateRequest parentReq = new CertificateRequest(csr_info,
//"CN=Experimental Issuing Authority",
keySize,
HashAlgorithmName.SHA256,
RSASignaturePadding.Pkcs1);
parentReq.CertificateExtensions.Add(
new X509BasicConstraintsExtension(true, false, 0, true));
parentReq.CertificateExtensions.Add(
new X509SubjectKeyIdentifierExtension(parentReq.PublicKey, false));
var sanBuilder = new SubjectAlternativeNameBuilder();
Array arrsan = csr_san.Split(arrSeperator, StringSplitOptions.RemoveEmptyEntries);
foreach (string sanvalue in arrsan)
{
sanBuilder.AddDnsName(sanvalue);
}
parentReq.CertificateExtensions.Add(sanBuilder.Build());
string csrdecrypt = PemEncodeSigningRequest(parentReq);
return csrdecrypt;
}
public static string PemEncodeSigningRequest(CertificateRequest request)
{
byte[] pkcs10 = request.CreateSigningRequest();
StringBuilder builder = new StringBuilder();
builder.AppendLine("-----BEGIN CERTIFICATE REQUEST-----");
string base64 = Convert.ToBase64String(pkcs10);
int offset = 0;
const int LineLength = 64;
while (offset < base64.Length)
{
int lineEnd = Math.Min(offset + LineLength, base64.Length);
builder.AppendLine(base64.Substring(offset, lineEnd - offset));
offset = lineEnd;
}
builder.AppendLine("-----END CERTIFICATE REQUEST-----");
string tester2 = builder.ToString();
return builder.ToString();
}
解决方案
没有第三方库,就没有纯托管的方式来阅读认证签名请求。
您可以尝试使用 P/Invoke 到CryptDecodeObjectEx,可能使用X509_CERT
(根据https://docs.microsoft.com/en-us/windows/desktop/SecCrypto/constants-for-cryptencodeobject-and-cryptdecodeobject)的结构标识符。
但是 CertificateRequest 类是没有阅读器的 PKCS#10 编写器。
推荐阅读
- ocaml - 是否可以在 then 或 else 之后让变量?
- f# - F# Computation Expression to build state and defer execution
- java - Eclipse Oxygen 安装错误 OS X 10.11.6
- google-apps-script - How to make a Google script call to a Django Rest framework
- regex - htacces target specific file
- amazon-web-services - AWS API Gateway Lambda 集成(非代理) - 如何发送自定义标头和二进制数据
- python - 使用张量流更快的 for 循环
- php - 无法使用 php 在 pami 包中获取来电显示号码、目的地号码和通话时间
- tls1.2 - 我正在使用最新版本的 websockify 0.8.0,但它不支持 TLS-1.2
- android - Android firebaseauth.getCurrentUser() 在 firebase 中返回 null