Статус: Активный участник
Группы: Участники
Зарегистрирован: 05.07.2018(UTC) Сообщений: 467
Сказал(а) «Спасибо»: 43 раз Поблагодарили: 69 раз в 61 постах
|
Добрый день! На сайте КриптоПро https://www.cryptopro.ru/certsrv/certrqma.asp создал запрос на сертификат формата PKCS#10 и сохранил его. Вот сам запрос: Код:-----BEGIN NEW CERTIFICATE REQUEST-----
MIIBJDCB0gIBADAOMQwwCgYDVQQDDANxd2UwZjAfBggqhQMHAQEBATATBgcqhQMC
AiQABggqhQMHAQECAgNDAARApGNbo/ApbmyH6f8XMfHj3qElyQdr8uti5XvVkefV
9tssA7q6cqzGIjMf7ZWJPGoGM6wpryjwfdxqenoIaj2eTqBVMFMGCSqGSIb3DQEJ
DjFGMEQwDgYDVR0PAQH/BAQDAgTwMBMGA1UdJQQMMAoGCCsGAQUFBwMCMB0GA1Ud
DgQWBBRaVf5bzGNLlxXArdHkYfYmsCcikDAKBggqhQMHAQEDAgNBAPIHUabC8bS/
sPxKZLpr/i28AIebL5qu9ys70p5fZ8vcq9Z3+dydFTzFbZYCuP5NqGdhkyIg8Jlf
zNA/nZecuZM=
-----END NEW CERTIFICATE REQUEST-----
Запрос PKCS#10 подписывается закрытым ключом будущего владельца сертификата (что-то вроде доказательства владения закрытым ключом). Но я никак не могу понять, что конкретно в запросе подписывается. Читал и RFC2986, и RFC4211, но все равно в недоумении... Никак не могу понять, что в итоге подписывается. Интересно также было и с CMC запросом разобраться, однако я не могу создать такой запрос (выделен только PKCS#10 серым, на CMC никак не переключается, даже при выборе другого криптопровайдера). Отредактировано пользователем 20 июля 2021 г. 17:09:36(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 05.07.2018(UTC) Сообщений: 467
Сказал(а) «Спасибо»: 43 раз Поблагодарили: 69 раз в 61 постах
|
Попробовал сделать следующее (сперва попробовал через BouncyCastle): Код:(Get-Content .\request.req)[1..7] -join "" | Set-Variable -Name "Base64Req";
[Org.BouncyCastle.Utilities.Encoders.Base64]::Decode($Base64Req) | Set-Variable -Name "DecodedReq";
[Org.BouncyCastle.Pkcs.Pkcs10CertificationRequest]::new($DecodedReq) | Set-Variable -Name "Pkcs10Req";
$Pkcs10Req.Verify() #Получаю исключение exception encoding TBS cert request
$Pkcs10Req.Verify($Pkcs10Req.GetPublicKey()) #Так же получаю исключение exception encoding TBS cert request
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 05.07.2018(UTC) Сообщений: 467
Сказал(а) «Спасибо»: 43 раз Поблагодарили: 69 раз в 61 постах
|
Пожалуйста, подскажите, как быть? |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 05.07.2018(UTC) Сообщений: 467
Сказал(а) «Спасибо»: 43 раз Поблагодарили: 69 раз в 61 постах
|
Я попробовал вручную проверить: снова не получается... Код:$ReqData = [Org.BouncyCastle.Utilities.Encoders.Base64]::Decode((gc -Path (gci '..\reqs\1 copy.txt').FullName))
$Request = [Org.BouncyCastle.Pkcs.Pkcs10CertificationRequest]::new($ReqData)
$signer = [Org.BouncyCastle.Crypto.Signers.ECGost3410Signer]::new();
$PublicKey = $Request.GetPublicKey()
$signer.Init($false, $PublicKey)
$DataFileRawBytes = $Request.GetCertificationRequestInfo().GetEncoded()
[void]([Org.BouncyCastle.Crypto.Digests.Gost3411_2012_256Digest] $Gost3411_2012_256Digest = [Org.BouncyCastle.Crypto.Digests.Gost3411_2012_256Digest]::new());
[void]([byte[]] $HashCode = [byte[]]::new(32));
[void]($Gost3411_2012_256Digest.BlockUpdate($DataFileRawBytes, 0, $DataFileRawBytes.Length));
[void]($Gost3411_2012_256Digest.DoFinal($HashCode, 0));
($Gost3411_2012_256Digest.Reset());
$SignatureBytes = $Request.Signature.GetBytes()
[array]::Reverse($SignatureBytes)
$signature_1 = $Request.Signature.GetBytes()[0..31]
$signature_2 = $Request.Signature.GetBytes()[32..63]
$signature = [Org.BouncyCastle.Math.BigInteger]::new($signature_1 -as [byte[]]), [Org.BouncyCastle.Math.BigInteger]::new($signature_2 -as [byte[]])
$signer.VerifySignature($HashCode, $signature[0], $signature[1])
Я, видимо, не для того хэш-код считаю... Но понять бы, для чего его считать... Отредактировано пользователем 29 июля 2021 г. 11:37:27(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 05.07.2018(UTC) Сообщений: 467
Сказал(а) «Спасибо»: 43 раз Поблагодарили: 69 раз в 61 постах
|
Автор: Анатолий Колкочев Попробовал сделать следующее (сперва попробовал через BouncyCastle): Код:(Get-Content .\request.req)[1..7] -join "" | Set-Variable -Name "Base64Req";
[Org.BouncyCastle.Utilities.Encoders.Base64]::Decode($Base64Req) | Set-Variable -Name "DecodedReq";
[Org.BouncyCastle.Pkcs.Pkcs10CertificationRequest]::new($DecodedReq) | Set-Variable -Name "Pkcs10Req";
$Pkcs10Req.Verify() #Получаю исключение exception encoding TBS cert request
$Pkcs10Req.Verify($Pkcs10Req.GetPublicKey()) #Так же получаю исключение exception encoding TBS cert request
Разобрался с этим исключением. В BC нет куска кода, который возвращает по OID его название (параметр) (например, OID: 1.2.643.7.1.1.3.2, параметр: szOID_CP_GOST_R3411_12_256_R3410). Т.е он никак не мог определить, что за OID 1.2.643.7.1.1.3.2. Долго копал, нашел. Необходимо вручную прописывать, если встретил такой OID, нужно возвращать то-то. Как пример, дописал просто return "GOST3411_2012_256WITHECGOST3410". Конечно, в дальнейшем надо нормально написать, но для примера сойдет) Snimok ehkrana 2021-07-31 123857.png (42kb) загружен 15 раз(а).Удалось наконец-то проверить и вручную запрос. Прикладываю код, может кому-то пригодится: Код:Add-Type -Path "C:\Users\mesen\Downloads\bccrypto-csharp-1.8.8\crypto\bin\Debug\lib\net20\BouncyCastle.dll"
$r = [System.IO.File]::ReadAllBytes("C:\Users\mesen\Desktop\1.txt")
$s = [System.Convert]::ToBase64String($r)
$b = [Org.BouncyCastle.Utilities.Encoders.Base64]::Decode($s)
$req = [Org.BouncyCastle.Pkcs.Pkcs10CertificationRequest]::new($b)
$req.Verify() #Получаем $true
#Проверка "вручную"
$ri = $req.GetCertificationRequestInfo()
$DataFileRawBytes = $ri.GetDerEncoded()
[void]([Org.BouncyCastle.Crypto.Digests.Gost3411_2012_256Digest] $Gost3411_2012_256Digest = [Org.BouncyCastle.Crypto.Digests.Gost3411_2012_256Digest]::new());
[void]([byte[]] $HashCode = [byte[]]::new(32));
[void]($Gost3411_2012_256Digest.BlockUpdate($DataFileRawBytes, 0, $DataFileRawBytes.Length));
[void]($Gost3411_2012_256Digest.DoFinal($HashCode, 0));
[void]($Gost3411_2012_256Digest.Reset());
[Org.BouncyCastle.Crypto.Signers.ECGost3410Signer] $ECGost3410Signer = [Org.BouncyCastle.Crypto.Signers.ECGost3410Signer]::new();
$ECGost3410Signer.Init($false, $req.GetPublicKey())
$Signature = $req.Signature.GetOctets()
$R = [Org.BouncyCastle.Math.BigInteger]::new(1, $Signature, 32, 32)
$S = [Org.BouncyCastle.Math.BigInteger]::new(1, $Signature, 0, 32)
$ECGost3410Signer.VerifySignature($HashCode, $r, $s) #Получаем true
Вполне может быть, что вся проблема была в разнице методов GetDerEncoded(), GetBytes() и GetEncoded(). Но, все таки, получилось. Ура (это я сам себе :) ). Отредактировано пользователем 1 августа 2021 г. 8:16:00(UTC)
| Причина: Не указана |
|
1 пользователь поблагодарил TolikTipaTut1 за этот пост.
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close