C#生成CSR或密钥的

时间:2017-10-02 00:16:55

标签: c# cryptography bouncycastle

我正在编写一个简单的应用程序来生成证书,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;
        }

0 个答案:

没有答案