После большой детективной работы мне удалось отправить сообщение конечной точке, которое может быть декодировано компонентом CAPICOM.Ниже приведено рабочее решение:
public string Sign(string dataToSign)
{
// Default to SHA1; required if targeting .Net Framework 4.7.1 or above
AppContext.SetSwitch("Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms", true);
// The dataToSign byte array holds the data to be signed.
ContentInfo contentInfo = new ContentInfo(Encoding.Unicode.GetBytes(dataToSign));
// Create a new, nondetached SignedCms message.
SignedCms signedCms = new SignedCms(contentInfo, false);
X509Certificate2 cert = GetCertificate();
CmsSigner signer = new CmsSigner(cert);
// Sign the message.
signedCms.ComputeSignature(signer);
// Encode the message.
var encoded = signedCms.Encode();
// mimic default EncodingType; CAPICOM_ENCODE_BASE64 Data is saved as a base64 - encoded string.
return Convert.ToBase64String(encoded, Base64FormattingOptions.InsertLineBreaks);
}
Сводка изменений:
AppContext.SetSwitch("Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms", true);
Если нацелена на .NET Framework 4.7.1+ (мое приложение нацелено на .NET 4.7.1) SHA256по умолчанию включен для этих операций.Это изменение необходимо, поскольку SHA1 больше не считается безопасным. Источник
ContentInfo contentInfo = new ContentInfo(Encoding.Unicode.GetBytes(dataToSign));
Изменено с кодировки UTF8 на Unicode.
return Convert.ToBase64String(encoded, Base64FormattingOptions.InsertLineBreaks);
Используйте параметр разрыва строки для соответствия с выходом Capicom.