我正在编写一个简单的应用程序来生成证书,CSR或密钥的指纹,并将其打印到txtBox以比较它们以查看它们是否匹配。我能够使用现有的Microsoft documentation获取证书的指纹。但我无法用充满活力的城堡为CSR或私钥做这件事。我发现this thread从CSR中提取主题信息。我还发现了一些文档here,它建议使用这个Java代码来完成私钥。但我不确定这里发生了什么,不知道如何将其转换为C#。
public String getFingerprint() throws IOException {
Security.addProvider(new
org.bouncycastle.jce.provider.BouncyCastleProvider());
Reader r = new BufferedReader(new StringReader(privateKey.toString()));
PEMReader pem = new PEMReader(r);
KeyPair pair = (KeyPair) pem.readObject();
if(pair==null) return null;
PrivateKey key = pair.getPrivate();
return digest(key);
}
目前,我有以下代码,它似乎给我指纹,但它与OpenSSL创建的指纹不匹配。我确定这是因为我使用了错误的输入来生成十六进制字符串。但我不确定我应该给它什么输入。
public static string GetCsrMd5(string input)
{
using (System.Security.Cryptography.MD5 md5 =
System.Security.Cryptography.MD5.Create())
{
string header = "-----BEGIN NEW CERTIFICATE REQUEST-----";
string footer = "-----END NEW CERTIFICATE REQUEST-----";
byte[] csr = Convert.FromBase64String(input.Replace(header,
"").Replace(footer, ""));
byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
byte[] hashBytes = md5.ComputeHash(inputBytes);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
{
sb.Append(hashBytes[i].ToString("x2"));
}
return sb.ToString();
}
}
要生成指纹,需要为hashBytes
分配什么值?或者是否存在这种通过充气城堡的现有方法?
更新:
基于OpenSSL,我需要将模数或公钥从CSR / KEY传递给sig
进行哈希处理。以下是我用来比较指纹的OpenSSL命令:
openssl req -noout -modulus -in domain.csr | openssl md5
openssl rsa -noout -modulus -in domain.key | openssl md5
openssl x509 -noout -modulus -in domain.crt | openssl md5
我修复了原始代码中的一些错误,但在计算sig
的哈希值时遇到错误。
Error CS1503 Argument 1: cannot convert from
'Org.BouncyCastle.Crypto.AsymmetricKeyParameter' to 'System.IO.Stream'
奇怪的是,我可以运行带有错误的代码但生成指纹只返回0??0??
。我已经尝试将sig
变量设为byte [],string,stream,但每个错误几乎都是相同的“无法隐式转换”。但是我得到了同样不可读的字符。我确定我需要将公钥导入某些RSA实例然后导出字节,但缺少使用C#中的BouncyCastle的文档使这很困难。一旦我弄明白,我会再次更新。
更新的代码:
public static string GetCsr(string input)
{
string header = "-----BEGIN NEW CERTIFICATE REQUEST-----";
string footer = "-----END NEW CERTIFICATE REQUEST-----";
// Remove header and footer
byte[] csr = Convert.FromBase64String(input.Replace(header,
"").Replace(footer, ""));
// Load CSR body into a PKCS10 instance
Pkcs10CertificationRequest csrBytes = new
Pkcs10CertificationRequest(csr);
// Get Public Key from existing instance
byte[] sig = csrBytes.GetPublicKey();
System.Security.Cryptography.HashAlgorithm create =
System.Security.Cryptography.MD5.Create();
// Compute MD5 hash and convert to hex string
byte[] test = create.ComputeHash(sig);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < test.Length; i++)
{
sb.Append(test[i].ToString("x2"));
}
string fingerprint = sb.ToString();
// Return hex string
return fingerprint;
}