Как я могу загрузить клиентские сертификаты из личного хранилища с помощью ASP.NET ?

#c# #asp.net #cryptography #x509certificate #rsacryptoserviceprovider

#c# #asp.net #криптография #x509certificate #rsacryptoserviceprovider

Вопрос:

Как я могу загрузить клиентские сертификаты из личного хранилища с помощью ASP.NET ?

Если это возможно, могу ли я зашифровать данные с его помощью?

Для этого я создал приложение в ASP.NET 2.0, который извлекает все сертификаты, установленные в клиентском хранилище сертификатов (личном), чтобы создать с ним цифровую подпись.

но это не работает, и я не знаю, в чем проблема

 // ...
using System.Security.Cryptography.X509Certificates;

namespace WebApplication4
{
    public partial class _Default : System.Web.UI.Page
    {
        public static string ToHexString(byte[] bytes)
        {
           // ...
        }

        protected void btnSignature_Click(object sender, EventArgs e)
        {
            X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            store.Open(OpenFlags.OpenExistingOnly);
            X509Certificate2Collection certificates = store.Certificates;

            int a = certificates.Count;

            lbCertCount.Text = System.Convert.ToString(a);

            if (a > 0)
            {
                X509Certificate2 certificate = certificates[1];

                string publicKey = certificate.GetPublicKeyString();
                lbMypublicKey.Text = publicKey   "<br/>";

                // AsymmetricAlgorithm privateKey = certificate.PrivateKey;

                RSACryptoServiceProvider privateKey = certificate.PrivateKey as RSACryptoServiceProvider;

                // test message 
                byte[] buffer = Encoding.Default.GetBytes("Welcome");
                byte[] signature = privateKey.SignData(buffer, new SHA1Managed());
                string me = ToHexString(signature);

                lbSignature.Text = me;


                RSACryptoServiceProvider publicKey1 = certificate.PublicKey.Key as RSACryptoServiceProvider;

                bool verify = publicKey1.VerifyData(buffer, new SHA1Managed(), signature);

                if (verify == true)
                {
                    lbControl.Text = "Signature valid";
                }
                else
                {
                    lbControl.Text = "Signature not Valid";
                }
            }
        }
    }
}
  

Комментарии:

1. Вы пытаетесь загрузить сертификат посетителей или сертификат для учетной записи пользователя на сервере?

2. Я пытаюсь загрузить сертификат посетителей, ПРИМЕЧАНИЕ: все мои посетители находятся в сети интрасети и все зарегистрированы в active directory

3. ОК. Как вы аутентифицируете своих пользователей? Они олицетворяются?

4. Вы гений, я только что изменил конфигурацию webconfig по умолчанию на <identity impersonate=»true» /> и это работает, спасибо

5. Я рад, что смог помочь! Я сделал ответ на свой комментарий, если вы хотите пометить его как принятый.

Ответ №1:

Для всех пользователей Google:

Добавьте это в свой Web.Config :

 <identity impersonate="true" /> 
  

Для получения дополнительной информации см. msdn о олицетворении.

Ответ №2:

Я предполагаю, что ты обрюхатил это ASP.NET app. в качестве тестового жгута, и на самом деле вы не собираетесь писать производственное приложение, которое получает доступ к персональному сертификату. хранить на веб-сервере? Я вообще не изучал и не тестировал ваш код, но я бы в первую очередь проверил привилегии безопасности. Я ожидаю учетную запись, под которой находится ASP.Запущенный рабочий процесс Net не имеет доступа к персональному сертификату. Магазин.

Комментарии:

1. 1 / вы должны знать, что мне нужно загрузить сертификат в клиентское хранилище «personal», а не в хранилище веб-сервера 2 / да, верно, это не производственная версия, я просто тестирую этот код для реализации в реальном приложении 3 / какая учетная запись, которая asp.net должно быть, ошибка при загрузке клиентского сертификата??

2. Я годами ничего не делал с хранилищем сертификатов, но я верю, и, похоже, это имеет смысл, что для доступа к сертификату в личном хранилище вам нужно будет работать под учетной записью, которая импортировала сертификат в указанное хранилище. Я рекомендую вам запустить свой тестовый жгут в консольном приложении. под той же учетной записью, которую вы использовали для импорта сертификата. в хранилище.