- Подготовка производственной площадки к маркировке
- Сроки внедрения маркировки для производителей: что нужно знать малым, средним и крупным?
- Оборудование для маркировки: какое нужно и что пригодится из того, что у вас уже есть?
- Состав кода маркировки молочной продукции
Необходимо авторизоваться или зарегистрироваться на портале
Ошибка при поверке подписи. - API - CAPICOM_TLB.ISigner
Добрый день всем.
При попытке получить токен для работы с API, получаю ошибку «Ошибка при проверке подписи». Подпись формирую средствами Delphi через COM.
CAPICOM_TLB.ISigner
CAPICOM_TLB.ISigner
Создаю объекты, получаю сертификат, вызываю
oSignedData.Sign(oSigner, TRUE, CAPICOM_ENCODE_BASE64);
Получаю подпись, которая успешно проходит проверку через Инструменты КриптоПРО.
Но если её скормить сюда
https://markirovka.sandbox.crptech.ru/api/v3/true-api/auth/simpleSignIn
то получается ошибка «Ошибка при поверке подписи».
Для чистоты эксперимента та же строка была подписана через браузерный планиг КриптоПРО. На выходе была получена другая(!) подпись, которая уже нормально воспринимается сервером Честного знака.
В чём может быть проблема? Может у кого-то есть готовый пример для Delphi или любой другой среды?
S
У меня была подобная проблема. Во первых не надо было, как описано людьми в инете полученное data преобразовывать в base64. Надо сразу шифровать. Второе, при подписании поставить флаг False - присоединенная подпись в Dim signedCms As SignedCms = New SignedCms(contentInfo, False).
На vb.net мне удалось получить token следющим образом:
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim token As String = Await GetToketTrueAPI()
End Sub
Public Class RequestSimpleSignInCZ
Public Property uuid As String
Public Property data As String
Public Property inn As String
End Class
Public Class MyRequestData
End Class
Public Class ResponseKeyCZ
Public Property uuid As String
Public Property data As String
End Class
Private Function encode_text_detached_CZ(ByVal msg As String) As Byte()
Dim thumbprint As String = «НОМЕР ОТПЕЧАТКА ЭЛЕКТРОННОГО КЛЮЧА»
Dim encodedMsg As Byte()
Try
Dim msgBytes As Byte() = System.Text.Encoding.Unicode.GetBytes(msg)
Dim store As X509Store = New X509Store(StoreName.My, StoreLocation.CurrentUser)
store.Open(OpenFlags.ReadOnly)
Dim certs As X509Certificate2Collection = store.Certificates.Find(
X509FindType.FindByThumbprint, thumbprint , False)
store.Close()
encodedMsg = SignMsg(msgBytes, certs(0))
Catch ex As CryptographicException
Console.WriteLine(«Information could not be written out for this certificate.»)
encodedMsg = {0}
End Try
Return encodedMsg
End Function
Private Function SignMsg(ByVal msg As Byte(), ByVal signerCert As X509Certificate2) As Byte()
Dim contentInfo As ContentInfo = New ContentInfo(msg)
Dim signedCms As SignedCms = New SignedCms(contentInfo, False)
Dim cmsSigner As CmsSigner = New CmsSigner(signerCert)
signedCms.ComputeSignature(cmsSigner)
Return signedCms.Encode()
End Function
Private Async Function GetToketTrueAPI() As Task(Of String())
'Отправляем GET auth/key
Dim transaction As New MyRequestData
Dim data As New ResponseKeyCZ
Dim response As String = Await JSON_GET_CZ(«https://markirovka.crpt.ru/api/v3/true-api/auth/key», transaction)
data = Newtonsoft.Json.JsonConvert.DeserializeObject(Of ResponseKeyCZ)(response)
'Ответ data и uuid
Console.WriteLine(«Key_data: » & data.data)
Console.WriteLine(«Key_uuid: » & data.uuid)
'Подписываем полученную строку data
Dim signed_dataBase64 As String = Convert.ToBase64String(encode_text_detached_CZ(data.data))
'Отправляем POST на получение токена auth/simpleSignIn
Dim request As New RequestSimpleSignInCZ With
{
.uuid = data.uuid,
.data = signed_dataBase64
}
Dim data2 As New ResponseSimpleSignInCZ
Dim content As String = Newtonsoft.Json.JsonConvert.SerializeObject(request)
Dim httpClient As New HttpClient()
Dim httpRequestMessage As New HttpRequestMessage(HttpMethod.Post, «https://markirovka.crpt.ru/api/v3/true-api/auth/simpleSignIn»)
httpRequestMessage.Content = New StringContent(content, Encoding.UTF8, «application/json»)
Dim httpResponseMessage As HttpResponseMessage = Await httpClient.SendAsync(httpRequestMessage)
Dim jsonResult As String = Await httpResponseMessage.Content.ReadAsStringAsync()
Dim result As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonResult)
'Ответ
Console.WriteLine(«jsonResult: » & jsonResult)
Return result .token
End function
10.08.2024 18:11
0
S
Public Async Function JSON_GET_CZ(ByVal link As String, ByVal transaction As MyRequestData, Optional ByVal token As String = «») As Task(Of String)
Task.Delay(3000)
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 Or SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls
System.Net.ServicePointManager.ServerCertificateValidationCallback = (Function(sender, certificate, chain, sslPolicyErrors) True)
Dim content = Newtonsoft.Json.JsonConvert.SerializeObject(transaction)
Dim buffer = System.Text.Encoding.UTF8.GetBytes(content)
Dim bytes = New Net.Http.ByteArrayContent(buffer)
bytes.Headers.ContentType = New Net.Http.Headers.MediaTypeHeaderValue(«application/json»)
Dim responseBody = Nothing
Try
Using client As New System.Net.Http.HttpClient '(handler)
client.DefaultRequestHeaders.CacheControl = New Http.Headers.CacheControlHeaderValue()
Try
Using response As HttpResponseMessage = Await client.GetAsync(New Uri(link))
If (response.IsSuccessStatusCode) Then
response.EnsureSuccessStatusCode()
responseBody = Await response.Content.ReadAsStringAsync()
responseBody = Replace(responseBody, «}», «,»«responseCode»«:»«» & response.StatusCode & «»«,»«ReasonPhrase»«:»«» & response.ReasonPhrase & «»«}»)
Else
responseBody = «{»«responseCode»«:»«» & response.StatusCode & «»«,»«ReasonPhrase»«:»«» & response.ReasonPhrase & «»«}»
End If
End Using
Catch e As HttpRequestException
responseBody = «{»«responseCode»«:»«» & 0 & «»«,»«ReasonPhrase»«:»«» & e.Message & «»«}»
End Try
End Using
Catch e As HttpRequestException
responseBody = «{»«responseCode»«:»«» & 0 & «»«,»«ReasonPhrase»«:»«» & e.Message & «»«}»
End Try
Return responseBody
End Function
10.08.2024 18:14
0