Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Анатолий Колкочев  
#1 Оставлено : 20 июля 2021 г. 17:06:41(UTC)
TolikTipaTut1

Статус: Активный участник

Группы: Участники
Зарегистрирован: 05.07.2018(UTC)
Сообщений: 238

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Добрый день!
На сайте КриптоПро 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)  | Причина: Не указана

Offline Анатолий Колкочев  
#2 Оставлено : 21 июля 2021 г. 9:47:53(UTC)
TolikTipaTut1

Статус: Активный участник

Группы: Участники
Зарегистрирован: 05.07.2018(UTC)
Сообщений: 238

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Попробовал сделать следующее (сперва попробовал через 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
Offline Анатолий Колкочев  
#3 Оставлено : 23 июля 2021 г. 19:50:29(UTC)
TolikTipaTut1

Статус: Активный участник

Группы: Участники
Зарегистрирован: 05.07.2018(UTC)
Сообщений: 238

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Пожалуйста, подскажите, как быть?
Offline Анатолий Колкочев  
#4 Оставлено : 29 июля 2021 г. 11:34:56(UTC)
TolikTipaTut1

Статус: Активный участник

Группы: Участники
Зарегистрирован: 05.07.2018(UTC)
Сообщений: 238

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Я попробовал вручную проверить: снова не получается...
Код:
$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)  | Причина: Не указана

Offline Анатолий Колкочев  
#5 Оставлено : 31 июля 2021 г. 12:38:26(UTC)
TolikTipaTut1

Статус: Активный участник

Группы: Участники
Зарегистрирован: 05.07.2018(UTC)
Сообщений: 238

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 24 раз в 21 постах
Автор: Анатолий Колкочев Перейти к цитате
Попробовал сделать следующее (сперва попробовал через 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) загружен 8 раз(а).

Удалось наконец-то проверить и вручную запрос. Прикладываю код, может кому-то пригодится:
Код:
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)  | Причина: Не указана

thanks 1 пользователь поблагодарил TolikTipaTut1 за этот пост.
two_oceans оставлено 11.08.2021(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.