Atom Лента - Форум КриптоПро - Тема:Проверка "ProofOfPossession" запроса PKCS#10 вручную - 10Форум КриптоПро - Atom Лентаurn:https:--www-cryptopro-ru:AtomLenta:ForumKriptoPro:Tema:Proverka"ProofOfPossession"zaprosaPKCS#10vruchnuju-10:1Copyright 2024 Форум КриптоПро2024-03-28T11:26:36Zhttps://www.cryptopro.ru/forum2/Images/YAFLogo.pngForum Adminhttps://www.cryptopro.ruforum@cryptopro.ruTolikTipaTut1https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49415&name=TolikTipaTut1TolikTipaTut1https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49415&name=TolikTipaTut1TolikTipaTut1https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49415&name=TolikTipaTut1TolikTipaTut1https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49415&name=TolikTipaTut1TolikTipaTut1https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49415&name=TolikTipaTut1TolikTipaTut1https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49415&name=TolikTipaTut1YetAnotherForum.NETurn:https:--www-cryptopro-ru:ftPosts:st1:meid126329:1Проверка "ProofOfPossession" запроса PKCS#10 вручную<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Анатолий Колкочев <a href="/forum2/default.aspx?g=posts&m=126167#post126167"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Попробовал сделать следующее (сперва попробовал через BouncyCastle):<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-powershell">(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</code></pre>
</div></div></div></div><br /><br />Разобрался с этим исключением. В 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". Конечно, в дальнейшем надо нормально написать, но для примера сойдет)<br />[attach]9849[/attach]<br /><br />Удалось наконец-то проверить и вручную запрос. Прикладываю код, может кому-то пригодится: <br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-powershell">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 </code></pre>
</div></div><br /><br />Вполне может быть, что вся проблема была в разнице методов GetDerEncoded(), GetBytes() и GetEncoded().<br />Но, все таки, получилось. Ура (это я сам себе :) ).</td></tr></table>2021-08-01T08:16:00+03:002021-08-01T08:16:00+03:00TolikTipaTut1<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Анатолий Колкочев <a href="/forum2/default.aspx?g=posts&m=126167#post126167"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Попробовал сделать следующее (сперва попробовал через BouncyCastle):<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-powershell">(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</code></pre>
</div></div></div></div><br /><br />Разобрался с этим исключением. В 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". Конечно, в дальнейшем надо нормально написать, но для примера сойдет)<br />[attach]9849[/attach]<br /><br />Удалось наконец-то проверить и вручную запрос. Прикладываю код, может кому-то пригодится: <br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-powershell">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 </code></pre>
</div></div><br /><br />Вполне может быть, что вся проблема была в разнице методов GetDerEncoded(), GetBytes() и GetEncoded().<br />Но, все таки, получилось. Ура (это я сам себе :) ).</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid126294:1Проверка "ProofOfPossession" запроса PKCS#10 вручную<table class="content postContainer" width="100%"><tr><td>Я попробовал вручную проверить: снова не получается... <br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-powershell">$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])</code></pre>
</div></div><br /><br />Я, видимо, не для того хэш-код считаю... Но понять бы, для чего его считать...</td></tr></table>2021-07-29T11:37:27+03:002021-07-29T11:37:27+03:00TolikTipaTut1<table class="content postContainer" width="100%"><tr><td>Я попробовал вручную проверить: снова не получается... <br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-powershell">$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])</code></pre>
</div></div><br /><br />Я, видимо, не для того хэш-код считаю... Но понять бы, для чего его считать...</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid126250:1Проверка "ProofOfPossession" запроса PKCS#10 вручную<table class="content postContainer_Alt" width="100%"><tr><td>Пожалуйста, подскажите, как быть? </td></tr></table>2021-07-23T19:50:29+03:002021-07-23T19:50:29+03:00TolikTipaTut1<table class="content postContainer_Alt" width="100%"><tr><td>Пожалуйста, подскажите, как быть? </td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid126167:1Проверка "ProofOfPossession" запроса PKCS#10 вручную<table class="content postContainer" width="100%"><tr><td>Попробовал сделать следующее (сперва попробовал через BouncyCastle):<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-powershell">(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</code></pre>
</div></div></td></tr></table>2021-07-21T09:47:53+03:002021-07-21T09:47:53+03:00TolikTipaTut1<table class="content postContainer" width="100%"><tr><td>Попробовал сделать следующее (сперва попробовал через BouncyCastle):<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-powershell">(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</code></pre>
</div></div></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid126162:1Проверка "ProofOfPossession" запроса PKCS#10 вручную<table class="content postContainer_Alt" width="100%"><tr><td>Добрый день! <br />На сайте КриптоПро <a rel="nofollow" href="https://www.cryptopro.ru/certsrv/certrqma.asp" title="https://www.cryptopro.ru/certsrv/certrqma.asp">https://www.cryptopro.ru/certsrv/certrqma.asp</a> создал запрос на сертификат формата PKCS#10 и сохранил его. Вот сам запрос:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-powershell">-----BEGIN NEW CERTIFICATE REQUEST-----
MIIBJDCB0gIBADAOMQwwCgYDVQQDDANxd2UwZjAfBggqhQMHAQEBATATBgcqhQMC
AiQABggqhQMHAQECAgNDAARApGNbo/ApbmyH6f8XMfHj3qElyQdr8uti5XvVkefV
9tssA7q6cqzGIjMf7ZWJPGoGM6wpryjwfdxqenoIaj2eTqBVMFMGCSqGSIb3DQEJ
DjFGMEQwDgYDVR0PAQH/BAQDAgTwMBMGA1UdJQQMMAoGCCsGAQUFBwMCMB0GA1Ud
DgQWBBRaVf5bzGNLlxXArdHkYfYmsCcikDAKBggqhQMHAQEDAgNBAPIHUabC8bS/
sPxKZLpr/i28AIebL5qu9ys70p5fZ8vcq9Z3+dydFTzFbZYCuP5NqGdhkyIg8Jlf
zNA/nZecuZM=
-----END NEW CERTIFICATE REQUEST-----</code></pre>
</div></div><br /><br />Запрос PKCS#10 подписывается закрытым ключом будущего владельца сертификата (что-то вроде доказательства владения закрытым ключом). Но я никак не могу понять, что конкретно в запросе подписывается. <br />Читал и RFC2986, и RFC4211, но все равно в недоумении... Никак не могу понять, что в итоге подписывается. <br /><br />Интересно также было и с CMC запросом разобраться, однако я не могу создать такой запрос (выделен только PKCS#10 серым, на CMC никак не переключается, даже при выборе другого криптопровайдера).</td></tr></table>2021-07-20T17:09:36+03:002021-07-20T17:09:36+03:00TolikTipaTut1<table class="content postContainer_Alt" width="100%"><tr><td>Добрый день! <br />На сайте КриптоПро <a rel="nofollow" href="https://www.cryptopro.ru/certsrv/certrqma.asp" title="https://www.cryptopro.ru/certsrv/certrqma.asp">https://www.cryptopro.ru/certsrv/certrqma.asp</a> создал запрос на сертификат формата PKCS#10 и сохранил его. Вот сам запрос:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-powershell">-----BEGIN NEW CERTIFICATE REQUEST-----
MIIBJDCB0gIBADAOMQwwCgYDVQQDDANxd2UwZjAfBggqhQMHAQEBATATBgcqhQMC
AiQABggqhQMHAQECAgNDAARApGNbo/ApbmyH6f8XMfHj3qElyQdr8uti5XvVkefV
9tssA7q6cqzGIjMf7ZWJPGoGM6wpryjwfdxqenoIaj2eTqBVMFMGCSqGSIb3DQEJ
DjFGMEQwDgYDVR0PAQH/BAQDAgTwMBMGA1UdJQQMMAoGCCsGAQUFBwMCMB0GA1Ud
DgQWBBRaVf5bzGNLlxXArdHkYfYmsCcikDAKBggqhQMHAQEDAgNBAPIHUabC8bS/
sPxKZLpr/i28AIebL5qu9ys70p5fZ8vcq9Z3+dydFTzFbZYCuP5NqGdhkyIg8Jlf
zNA/nZecuZM=
-----END NEW CERTIFICATE REQUEST-----</code></pre>
</div></div><br /><br />Запрос PKCS#10 подписывается закрытым ключом будущего владельца сертификата (что-то вроде доказательства владения закрытым ключом). Но я никак не могу понять, что конкретно в запросе подписывается. <br />Читал и RFC2986, и RFC4211, но все равно в недоумении... Никак не могу понять, что в итоге подписывается. <br /><br />Интересно также было и с CMC запросом разобраться, однако я не могу создать такой запрос (выделен только PKCS#10 серым, на CMC никак не переключается, даже при выборе другого криптопровайдера).</td></tr></table>