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();
}
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? –
@MaartenBodewes Nhà phát hành và số sê-ri giống hệt nhau. – NickG
Đ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). –