Я работаю в компании со многими серверами и ПК для разработчиков. Серверы Win2003, ПК-разработчики Windows XP.Сертификаты: не удается найти сертификат и закрытый ключ для дешифрования Ошибка при знаке
На сервере Win2003 с именем preiis01, в среде предварительного производства, другие люди в компании устанавливают сертификат клиента с помощью любого другого пользователя (domainCompany \ adminsystems) для входа на сервер preiis01.
Любой администратор использует пользователя «domainCompany \ adminsystems» для входа на сервер preiis01 (используя Terminal Server, Remote Desktop для Windows XP).
пользователь админ domainCompany \ adminsystems», который устанавливает сертификат
Администратор пользователя установить его, как это:.
Войти Session как " domainCompany \ adminsystems" сертификата PFX-файл Как установить PFX и с помощью мастера ключ частного не проверить на экспорт Введите пароль и установить
Существует приложение Web, который AppPool Идентичность:.... NETWORK SERVICE счет
Веб-сервер IIS 6.0.
в preiis01,
Этот пользователь администратор выполняет ПМК -> оснастке -> Сертификаты на локальном компьютере. В узле -> Personal -> Сертификаты, он видел сертификат клиента:
выдан ENTIDAD КОМПАНИИ ОБЕСПЕЧИТ SA - СИФ A93 - Номбр SURNAME1 NAME1
Выдан FNMT Clase 2 CA
В свойствах сертификат, отпечаток: "93 Ьс a4 объявление 58 с9 3в аф 8b Е.Б. 0b 2f 86 c7 9d 81 70 a6 c4 13"
этот пользователь администратор выполняет эти команды:
winhttpcertcfg.exe LOCAL_MACHINE \ My -s «ENTIDAD COMPANY INSURE SA - CIF A 93 - Номбр SURNAME1 NAME1" -g -a "NETWORK SERVICE"
Результат:
Matching certificate:
CN=ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1
OU=703015476
OU=FNMT Clase 2 CA
O=FNMT
C=ES
Granting private key access for account: NT AUTHORITY\NETWORK SERVICE
Теперь пользователь администратор выполняет эту команду:
winhttpcertcfg.exe -l -c LOCAL_MACHINE \ Мои -s "ENTIDAD COMPANY ОБЕСПЕЧИТ SA - СИФ A93 - Номбр SURNAME1 NAME1"
результат:
Matching certificate:
CN=ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1
OU=700012476
OU=FNMT Clase 2 CA
O=FNMT
C=ES
Additional accounts and groups with access to the private key include: domainCompany\adminsystems NT AUTHORITY\SYSTEM BUILTIN\Administrators NT AUTHORITY\NETWORK SERVICE
ТЕПЕРЬ, в странице ASPX в веб-приложения в сервере Win2003, IIS 6.0, у меня есть этот код:
Примечание: значение для X509Certificate2.HasPrivateKeyAccess() не является (ложь) для «ENTIDAD COMPANY ОБЕСПЕЧИТ SA - СИФ A93 - NOMBRE SURNAME1 NAME1 ".
ASP.NET приложение выполняет с использованием идентичности :: NT AUTHORITY \ NETWORK SERVICE
lbInfo.Text += "<br/><br/>ASP.NET application executes using the identity :: <b>" + WindowsIdentity.GetCurrent().Name + "</b><br>";
var store = new X509Store(StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
Certificates = store.Certificates;
repeater1.DataSource = Certificates;
repeater1.DataBind();
var nombreCertificado = "ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1";
store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection col = store.Certificates.Find(X509FindType.FindBySubjectName, nombreCertificado, false);
if (col.Count > 0)
{
X509Certificate2 certificate = col[0];
store.Close();
Message.Text = "Certificado " + nombreCertificado + " encontrado en " + StoreLocation.LocalMachine;
FirmarConCertificado(nombreCertificado, certificate);
}
else
{
store.Close();
Message.Text = "El certificado " + nombreCertificado + " no esta instalado en la máquina";
}
public void FirmarConCertificado(string nombreCertificado, X509Certificate2 certificate)
{
try
{
var mensaje = "Datos de prueba";
System.Text.Encoding enc = System.Text.Encoding.Default;
byte[] data = enc.GetBytes(mensaje);
var contentInfo = new System.Security.Cryptography.Pkcs.ContentInfo(data);
var signedCms = new System.Security.Cryptography.Pkcs.SignedCms(contentInfo, true);
var cmsSigner = new System.Security.Cryptography.Pkcs.CmsSigner(certificate);
// Sign the CMS/PKCS #7 message
signedCms.ComputeSignature(cmsSigner);
// Encode the CMS/PKCS #7 message
var ret = Convert.ToBase64String(signedCms.Encode());
Message.Text += "Firmado con Certificado " + nombreCertificado + " encontrado en " + StoreLocation.LocalMachine;
}
catch (Exception ex)
{
Message.Text = "Error al firmar con certificado: " + ex.ToString();
Message.Text += "<br /><br />InnerException: " + ex.InnerException;
}
}
код не для меня, и я получаю эту ошибку: Не удается найти сертификат и закрытый ключ для расшифровки.
Линия ошибок: signedCms.ComputeSignature (cmsSigner);
Error al firmar con certificado: System.Security.Cryptography.CryptographicException: Cannot find the certificate and private key for decryption.
at System.Security.Cryptography.Pkcs.PkcsUtils.CreateSignerEncodeInfo(CmsSigner signer, Boolean silent) at System.Security.Cryptography.Pkcs.SignedCms.Sign(CmsSigner signer, Boolean silent) at System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner signer, Boolean silent) at System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner signer) at ASP.dgsfp_test_testcert_aspx.FirmarConCertificado(String nombreCertificado, X509Certificate2 certificate) in c:\Company\App\Test\TestCert.aspx:line 242
Затем пользователь администратор (я помню, кто устанавливает сертификат) выполняет эти команды:
FindPrivateKey My LocalMachine -t "93 bc a4 ad 58 c9 3c af 8b eb 0b 2f 86 c7 9d 81 70 a6 c4 13" –c
FindPrivateKey My LocalMachine -n "ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1" –a
FindPrivateKey My LocalMachine -n "CN=ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1" –a
Результат для всех 3-х команд, одно и то же:
FindPrivateKey helps user to find the location of the Private Key file of a X.50 9 Certificate.
Usage: FindPrivateKey [{ {-n } | {-t } } [-f | -d | -a]]
subject name of the certificate
thumbprint of the certificate (use certmgr.exe to get it)
-f output file name only
-d output directory only
-a output absolute file name e.g. FindPrivateKey My CurrentUser -n "CN=John Doe"
e.g. FindPrivateKey My LocalMachine -t "03 33 98 63 d0 47 e7 48 71 33 62 64 76 5 c 4c 9d 42 1d 6b 52" -c
FindPrivateKey ничего не получайте, но winhttpcertcfg.exe -l работает отлично (соответствующий сертификат)
Мы hav e привилегии для пользователя сетевой службы, используя инструмент winhttpcertcfg.exe, а в коде ASP.NET (выполняется в учетной записи службы сети) сертификат найден. Но не удается, когда знак с использованием сертификата.
Если кто-то может дать нам информацию о том или предложения
обновление:
пользователя в домене «domainCompany \ Pre_Certificado» установить сертификат в магазин локальной машине.
domainCompany \ Pre_Certificado является администратором, в группе IIS_WPG, имеет Локальные политики: «Вход в качестве службы»
настроить AppPool Идентичность в IIS 6.0 для: domainCompany \ Pre_Certificado
приложение ASP.NET выполняется с использованием тождественный :: domainCompany \ Pre_Certificado
Я перерабатывают AppPool и выполнить приложение, я получаю System.Security.Cryptography.CryptographicException: не удается найти сертификат и закрытый ключ для дешифрования
Если я снова проведу проверку, войдите в сеанс на сервере IIS, используя domainCompany \ Pre_Certificado, я вызываю страницу в приложении ASP.NET, и все в порядке.
(примечание: войти сервер IIS с помощью сервера терминалов)
Но если выйти из сеанса в сервере IIS (пользователь: domainCompany \ Pre_Certificado), я получаю ту же ошибку:
System.Security.Cryptography .CryptographicException: не удается найти сертификат и закрытый ключ для дешифрования
Любые предложения?
Моя старшая битва: http://stackoverflow.com/questions/3905539/fighting-with-certificates-access-was-not-successfully-obtained-for-the-private – Kiquenet