2017-01-27 22 views
9

Tôi có một số mã hoạt động tạo ra chữ ký chính xác của một chuỗi nếu tôi tải chứng chỉ từ một tệp hoặc từ cửa hàng của người dùng hiện tại. Tuy nhiên, nếu tôi tải cùng một chứng chỉ giống nhau (cùng một tệp .p12 và cùng một dấu vân tay) từ cửa hàng Chứng chỉ máy, nó sẽ hoạt động khác nhau. Khi được nạp từ kho lưu trữ đó, các chữ ký được tạo bởi mã C# của tôi là một nửa chiều dài (1024 bit thay vì 2048) và không chính xác. Khóa riêng dường như đang tải đúng trong cả hai trường hợp.Mật mã: Tại sao tôi nhận được các chữ ký RSA khác nhau tùy thuộc vào chứng chỉ lưu trữ chứng chỉ được tải từ đâu?

Tại sao lưu trữ chứng chỉ được tải từ bất kỳ sự khác biệt nào về chữ ký nào được tạo? Và tại sao chữ ký sẽ bằng một nửa chiều dài?

Loaded từ CurrentUser:

Thumbprint: FBBE05A1C5F2AEF637CDE20A7985CD1011861651 
Has private key:True 
rsa.KeySize (bits) =2048 
Signature Length (bits): 2048 
Signature: kBC2yh0WCo/AU8aVo+VUbRoh67aIJ7SWM4dRMkNvt... 

(đúng)

Loaded từ LocalMachine:

Thumbprint: FBBE05A1C5F2AEF637CDE20A7985CD1011861651 
Has private key: True 
rsa.KeySize (bits) = 1024 
Signature Length (bits): 1024 
Signature: RijmdQ73DXHK1IUYkOzov2R+WRdHW8tLqsH.... 

(không chính xác - và lưu ý kích thước và chữ ký dài 1.024 chút chính)

Đây là C# Tôi đang sử dụng:

 string s = "AE0DE01564,1484821101811,http://localhost:8080/example_site/CallBack"; 

     var inputData = Encoding.UTF8.GetBytes(s); 

     var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
     store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); 

     string thumbprint = CleanThumbPrint("fb be 05 a1 c5 f2 ae f6 37 cd e2 0a 79 85 cd 10 11 86 16 51"); 
     X509Certificate2Collection col = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false); 

     // TODO: close store. 
     X509Certificate2 certificate = null; 

     Console.WriteLine("Cert count: " + col.Count); 
     if (col.Count == 1) 
     { 
      certificate = col[0]; 
      RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)col[0].PrivateKey; 

      // Force use of the Enhanced RSA and AES Cryptographic Provider with openssl-generated SHA256 keys 
      var enhCsp = new RSACryptoServiceProvider().CspKeyContainerInfo; 

      var cspparams = new CspParameters(enhCsp.ProviderType, enhCsp.ProviderName, rsa.CspKeyContainerInfo.KeyContainerName); 

      rsa = new RSACryptoServiceProvider(cspparams); 
      Console.WriteLine("Name: " + certificate.SubjectName.Name); 
      Console.WriteLine("Thumbprint: " + certificate.Thumbprint); 
      Console.WriteLine("Has private key: " + certificate.HasPrivateKey); 
      Console.WriteLine("Sig algorithm: " + certificate.SignatureAlgorithm); 
      Console.WriteLine("rsa.KeySize (bits) =" + rsa.KeySize); 

      var sha256 = CryptoConfig.CreateFromName("SHA256"); 
      byte[] signature = rsa.SignData(inputData, sha256); 

      Console.WriteLine("Signature Length (bits): " + signature.Length * 8); 
      Console.WriteLine("Signature: " + System.Convert.ToBase64String(signature)); 
      Console.WriteLine(); 
     } 
+1

bạn có thể kiểm tra các tổ chức phát hành và số serial của giấy chứng nhận trở lại? –

+0

@MaartenBodewes Nhà phát hành và số sê-ri giống hệt nhau. – NickG

+0

Điều duy nhất tôi có thể nghĩ là khóa riêng không khớp với chứng chỉ. Có lẽ P12 không được xây dựng chính xác. Tôi khó có thể tưởng tượng được rằng cửa hàng chứng nhận của Microsoft không chính xác (mặt khác, MS đã làm tôi kinh ngạc trước đây). –

Trả lời

2

Hóa ra nó là cái gì để làm với các định dạng tệp của chứng chỉ Tôi đã sử dụng mà tôi tạo ra với OpenSSL và thực tế là các nhà cung cấp crypto không bộ. Lệnh quan trọng là số 5 dưới đây:

Dưới đây là các lệnh tôi đã sử dụng để tạo ra các giấy chứng nhận làm việc:

  1. Tạo một cặp khóa:

openssl genrsa -out private_key.pem 2048

  1. Trích xuất khóa công khai:

openssl rsa -pubout -in private_key.pem -out public_key.pem

  1. Tạo Chứng chỉ CSR Yêu cầu ký từ khóa riêng:

openssl req -new -key private_key.pem -out csr.csr

  1. Tạo một chứng chỉ tự ký :

openssl x509 -req -days 1095 -in csr.csr -signkey private_key.pem -out certificate.crt

    012.
  1. Tạo một giấy chứng nhận dạng PFX với CSP quy định:

openssl pkcs12 -export -in certificate.crt -inkey private_key.pem -CSP "Microsoft Enhanced RSA and AES Cryptographic Provider" -out TEST_pfx.pfx

Các vấn đề liên quan