Atom Лента - Форум КриптоПро - Тема:Задать пароль (PIN) на контейнер - 10Форум КриптоПро - Atom Лентаurn:https:--www-cryptopro-ru:AtomLenta:ForumKriptoPro:Tema:Zadat'parol'(PIN)nakontejjner-10:1Copyright 2024 Форум КриптоПро2024-03-29T10:58:11Zhttps://www.cryptopro.ru/forum2/Images/YAFLogo.pngForum Adminhttps://www.cryptopro.ruforum@cryptopro.ruМаксим Коллегинhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=3&name=Максим КоллегинМаксим Коллегинhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=3&name=Максим Коллегинitmindcohttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=55694&name=itmindcoМаксим Коллегинhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=3&name=Максим Коллегинitmindcohttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=55694&name=itmindcoМаксим Коллегинhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=3&name=Максим Коллегинitmindcohttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=55694&name=itmindcoYetAnotherForum.NETurn:https:--www-cryptopro-ru:ftPosts:st1:meid113252:1Задать пароль (PIN) на контейнер<table class="content postContainer_Alt" width="100%"><tr><td>Прошу прощения, ввёл в заблуждение. <br />Эта функция предъявляет пароль. <br />Единственный способ установить пароль — вызывать через interop CryptSetProvParam ( PP_SET_PIN )</td></tr></table>2020-03-04T08:46:42+03:002020-03-04T08:46:42+03:00Максим Коллегин<table class="content postContainer_Alt" width="100%"><tr><td>Прошу прощения, ввёл в заблуждение. <br />Эта функция предъявляет пароль. <br />Единственный способ установить пароль — вызывать через interop CryptSetProvParam ( PP_SET_PIN )</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid113251:1Задать пароль (PIN) на контейнер<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Максим Коллегин <a href="/forum2/default.aspx?g=posts&m=113250#post113250"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Какая версия CSP?</div></div><br />4.0<br /></td></tr></table>2020-03-04T08:24:44+03:002020-03-04T08:24:44+03:00itmindco<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Максим Коллегин <a href="/forum2/default.aspx?g=posts&m=113250#post113250"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Какая версия CSP?</div></div><br />4.0<br /></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid113250:1Задать пароль (PIN) на контейнер<table class="content postContainer_Alt" width="100%"><tr><td>Какая версия CSP?</td></tr></table>2020-03-04T08:47:13+03:002020-03-04T08:47:13+03:00Максим Коллегин<table class="content postContainer_Alt" width="100%"><tr><td>Какая версия CSP?</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid113248:1Задать пароль (PIN) на контейнер<table class="content postContainer" width="100%"><tr><td>Не сработало, все равно в хранилище сертификат без пароля<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-csharp">
void Import()
{
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
var certs = Read(@"c:\temp\cert\test.pfx", "123");
SecureString pass = new SecureString();
pass.AppendChar('1');
pass.AppendChar('2');
pass.AppendChar('3');
foreach (var cert in certs)
{
((Gost3410_2012_256CryptoServiceProvider)cert.PrivateKey).SetContainerPassword(pass);
store.Add(cert);
}
store.Close();
}
</code></pre>
</div></div></td></tr></table>2020-03-04T01:54:10+03:002020-03-04T01:54:10+03:00itmindco<table class="content postContainer" width="100%"><tr><td>Не сработало, все равно в хранилище сертификат без пароля<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-csharp">
void Import()
{
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
var certs = Read(@"c:\temp\cert\test.pfx", "123");
SecureString pass = new SecureString();
pass.AppendChar('1');
pass.AppendChar('2');
pass.AppendChar('3');
foreach (var cert in certs)
{
((Gost3410_2012_256CryptoServiceProvider)cert.PrivateKey).SetContainerPassword(pass);
store.Add(cert);
}
store.Close();
}
</code></pre>
</div></div></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid113243:1Задать пароль (PIN) на контейнер<table class="content postContainer_Alt" width="100%"><tr><td>Нужно открыть провайдер у сертификата и установить пин-код.<br />X509Certificate.PrivateKey<br /><a rel="nofollow" href="https://cpdn.cryptopro.ru/default.asp?url=content/cpnet/html/M_CryptoPro_Sharpei_Gost3410CryptoServiceProvider_SetContainerPassword_1_6d101c32.htm" title="https://cpdn.cryptopro.ru/default.asp?url=content/cpnet/html/M_CryptoPro_Sharpei_Gost3410CryptoServiceProvider_SetContainerPassword_1_6d101c32.htm">Gost3410CryptoServiceProvider.SetContainerPassword <br /></a></td></tr></table>2020-03-03T17:38:06+03:002020-03-03T17:38:06+03:00Максим Коллегин<table class="content postContainer_Alt" width="100%"><tr><td>Нужно открыть провайдер у сертификата и установить пин-код.<br />X509Certificate.PrivateKey<br /><a rel="nofollow" href="https://cpdn.cryptopro.ru/default.asp?url=content/cpnet/html/M_CryptoPro_Sharpei_Gost3410CryptoServiceProvider_SetContainerPassword_1_6d101c32.htm" title="https://cpdn.cryptopro.ru/default.asp?url=content/cpnet/html/M_CryptoPro_Sharpei_Gost3410CryptoServiceProvider_SetContainerPassword_1_6d101c32.htm">Gost3410CryptoServiceProvider.SetContainerPassword <br /></a></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid113207:1Задать пароль (PIN) на контейнер<table class="content postContainer" width="100%"><tr><td>Здравствуйте.<br />Импортирую pfx в silent режиме с закрытым ключом. Сертификат устанавливается и в дальнейшем при использовании не требует пароля (можно экспортировать сертификат с закрытым ключом обратно в pfx уже без пароля). Как задать (оставить тем же) пароль?<br />Пробовал через CryptSetProvParam, но не нашел как получить HCRYPTPROV для конкретного контейнера (сертификата)<br /><br />код импорта:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-csharp">
void Import()
{
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
var certs = Read(@"c:\temp\cert\test2.pfx", "123");
foreach(var cert in certs)
{
store.Add(cert);
}
store.Close();
}
public X509Certificate2[] Read(string filename, string password)
{
FileStream stream = new FileStream(filename, FileMode.Open);
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
stream.Close();
CRYPT_DATA_BLOB cryptdata = new CRYPT_DATA_BLOB();
cryptdata.cbData = buffer.Length;
cryptdata.pbData = Marshal.AllocHGlobal(cryptdata.cbData);
Marshal.Copy(buffer, 0, cryptdata.pbData, buffer.Length);
IntPtr hMemStore = PFXImportCertStore(ref cryptdata, password, PKCS12_IMPORT_SILENT);
Marshal.FreeHGlobal(cryptdata.pbData);
uint provinfosize = 0;
uint hcryptrovsize = 0;
List<X509Certificate2> certs = new List<X509Certificate2>();
IntPtr certHandle = IntPtr.Zero;
while ((certHandle = CertEnumCertificatesInStore(hMemStore, certHandle)) != IntPtr.Zero)
{
if (CertGetCertificateContextProperty(certHandle, CERT_KEY_PROV_INFO_PROP_ID, IntPtr.Zero, ref provinfosize))
{
IntPtr info = Marshal.AllocHGlobal((int)provinfosize);
if (CertGetCertificateContextProperty(certHandle, CERT_KEY_PROV_INFO_PROP_ID, info, ref provinfosize))
{
IntPtr HCRYPTPROV = IntPtr.Zero;
if (CertGetCertificateContextProperty(certHandle, CERT_HCRYPTPROV_OR_NCRYPT_KEY_HANDLE_PROP_ID, HCRYPTPROV, ref hcryptrovsize))
{
CryptSetProvParam(HCRYPTPROV, PP_SET_PIN, Encoding.ASCII.GetBytes("123"), 0); // в эту строчку не заходит
}
else
{
var err = GetLastError(); //ошибка CRYPT_E_NOT_FOUND
}
var certData = new X509Certificate2(certHandle).Export(X509ContentType.SerializedCert);
certs.Add(new X509Certificate2(certData));
}
Marshal.FreeHGlobal(info);
}
}
Marshal.FreeHGlobal(hMemStore);
return certs.ToArray();
}
</code></pre>
</div></div><br /><br />так же без пароля получается после такой консольной команды:<br />certmgr.exe -inst -pfx -pin 123 -silent -file c:\temp\cert\test.pfx</td></tr></table>2020-03-03T10:10:09+03:002020-03-03T10:10:09+03:00itmindco<table class="content postContainer" width="100%"><tr><td>Здравствуйте.<br />Импортирую pfx в silent режиме с закрытым ключом. Сертификат устанавливается и в дальнейшем при использовании не требует пароля (можно экспортировать сертификат с закрытым ключом обратно в pfx уже без пароля). Как задать (оставить тем же) пароль?<br />Пробовал через CryptSetProvParam, но не нашел как получить HCRYPTPROV для конкретного контейнера (сертификата)<br /><br />код импорта:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-csharp">
void Import()
{
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
var certs = Read(@"c:\temp\cert\test2.pfx", "123");
foreach(var cert in certs)
{
store.Add(cert);
}
store.Close();
}
public X509Certificate2[] Read(string filename, string password)
{
FileStream stream = new FileStream(filename, FileMode.Open);
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
stream.Close();
CRYPT_DATA_BLOB cryptdata = new CRYPT_DATA_BLOB();
cryptdata.cbData = buffer.Length;
cryptdata.pbData = Marshal.AllocHGlobal(cryptdata.cbData);
Marshal.Copy(buffer, 0, cryptdata.pbData, buffer.Length);
IntPtr hMemStore = PFXImportCertStore(ref cryptdata, password, PKCS12_IMPORT_SILENT);
Marshal.FreeHGlobal(cryptdata.pbData);
uint provinfosize = 0;
uint hcryptrovsize = 0;
List<X509Certificate2> certs = new List<X509Certificate2>();
IntPtr certHandle = IntPtr.Zero;
while ((certHandle = CertEnumCertificatesInStore(hMemStore, certHandle)) != IntPtr.Zero)
{
if (CertGetCertificateContextProperty(certHandle, CERT_KEY_PROV_INFO_PROP_ID, IntPtr.Zero, ref provinfosize))
{
IntPtr info = Marshal.AllocHGlobal((int)provinfosize);
if (CertGetCertificateContextProperty(certHandle, CERT_KEY_PROV_INFO_PROP_ID, info, ref provinfosize))
{
IntPtr HCRYPTPROV = IntPtr.Zero;
if (CertGetCertificateContextProperty(certHandle, CERT_HCRYPTPROV_OR_NCRYPT_KEY_HANDLE_PROP_ID, HCRYPTPROV, ref hcryptrovsize))
{
CryptSetProvParam(HCRYPTPROV, PP_SET_PIN, Encoding.ASCII.GetBytes("123"), 0); // в эту строчку не заходит
}
else
{
var err = GetLastError(); //ошибка CRYPT_E_NOT_FOUND
}
var certData = new X509Certificate2(certHandle).Export(X509ContentType.SerializedCert);
certs.Add(new X509Certificate2(certData));
}
Marshal.FreeHGlobal(info);
}
}
Marshal.FreeHGlobal(hMemStore);
return certs.ToArray();
}
</code></pre>
</div></div><br /><br />так же без пароля получается после такой консольной команды:<br />certmgr.exe -inst -pfx -pin 123 -silent -file c:\temp\cert\test.pfx</td></tr></table>