Я работаю в компании со многими серверами и ПК для разработчиков. Серверы Win2003, ПК-разработчики Windows XP.
На сервере Win2003 с именем preiis01, в среде предварительного производства, другие люди в компании устанавливают сертификат клиента с помощью любого другого пользователя (domainCompany\adminsystems) для входа на сервер preiis01.
Любой администратор использует пользователя "domainCompany\adminsystems" для входа на сервер preiis01 (используя Terminal Server, Remote Desktop для Windows XP).
пользователь admin является domainCompany\adminsystems ", который устанавливает сертификат.
Администратор установит его так:
Вход в сессию, например, "domainCompany\adminsystems" Сертификат - это файл PFX. Устанавливайте PFX и используйте Wizard. Ключевой частный не проверять на экспорт. Введите пароль и установите.
Существует веб-приложение, в котором AppPool Identity: NETWORK SERVICE.
веб-сервер - это IIS 6.0.
в preiis01,
Этот пользователь-администратор выполняет mmc → Snap in → Certificates for Local Machine. В node → Личные → Сертификаты он видел сертификат клиента:
Выдано ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1
Выдано FNMT Clase 2 CA
В свойствах сертификата отпечаток: "93 bc a4 ad 58 c9 3c af 8b eb 0b 2f 86 c7 9d 81 70 a6 c4 13"
Этот пользователь admin выполняет следующие команды:
winhttpcertcfg.exe LOCAL_MACHINE\My -s "ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1" -g -a "СЕТЕВАЯ СЛУЖБА"
Результат:
Сертификат соответствия:
CN = ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1
OU = 703015476
OU = FNMT Clase 2 CA
О = FNMT
С = ES
Предоставление доступа к закрытому ключу для счет: NT AUTHORITY\NETWORK SERVICE
Теперь пользователь admin выполняет следующую команду:
winhttpcertcfg.exe -l -c LOCAL_MACHINE\My -s "ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1"
Результат:
Сертификат соответствия:
CN = ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1
OU = 700012476
OU = FNMT Clase 2 CA
О = FNMT
С = ES
Дополнительные учетные записи и группы с доступ к закрытому ключу: domainCompany\adminsystems NT AUTHORITY\SYSTEM BUILTIN\Администраторы NT AUTHORITY\NETWORK SERVICE
NOw, на странице aspx в веб-приложении на сервере Win2003, IIS 6.0, у меня есть этот код:
NOte: значение для X509Certificate2.HasPrivateKeyAccess() является NO (false) для сертификата ENTIDAD COMPANY INSURE SA - CIF 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);
Ошибка подтверждения сертификата: System.Security.Cryptography.CryptographicException: Не удается найти сертификат и закрытый ключ для дешифрования.
в System.Security.Cryptography.Pkcs.PkcsUtils.CreateSignerEncodeInfo(CmsSigner подписчик, булеанский молчание) в System.Security.Cryptography.Pkcs.SignedCms.Sign(CmsSigner подписчик, булеанский молчание) в System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner подписчик, булеанский молчание) в System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner подписывающее лицо) в ASP.dgsfp_test_testcert_aspx.FirmarConCertificado(String nombreCertificado, X509Certificate2 сертификат) в C:\Компания\App\Test\TestCert.aspx: линия 242
Затем пользователь admin (я помню, кто устанавливает сертификат) выполняет следующие команды:
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 Моя 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
Результат для всех трех команд одинаков:
FindPrivateKey помогает пользователю найти расположение файла секретного ключа Сертификат X.50 9.
Использование: FindPrivateKey [{{-n} | {-t} } [-f | -d | -a]]
имя субъекта сертификат
отпечаток сертификат (используйте certmgr.exe для получения она)
-f только имя файла вывода
-d только директория вывода
- абсолютный файл вывода имя, например. FindPrivateKey My CurrentUser -n "CN = John Doe"
например. 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 отлично работает (соответствующий сертификат)
Мы предоставили пользователю Network Service привилегии с помощью инструмента winhttpcertcfg.exe, а в коде ASP.NET(выполнить в учетной записи службы сети) сертификат найден. Но сбой при использовании знака с сертификатом.
Если кто-то может дать нам некоторую информацию или предложения
обновление:
Пользователь в домене "domainCompany\Pre_Certificado" установит сертификат в локальном компьютере Store.
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 с помощью Terminal Server)
Но если выйти из сеанса на сервере IIS (user: domainCompany\Pre_Certificado), я получаю ту же ошибку:
System.Security.Cryptography.CryptographicException: не удается найти сертификат и закрытый ключ для дешифрования
Любые предложения