Как загрузить чужой сертификат в мое локальное хранилище сертификатов? - PullRequest
1 голос
/ 30 декабря 2011

У меня есть сертификат (файл .pem), который распространяется другим поставщиком услуг. Я скачал сертификат от поставщика и сохранил его на свой локальный диск. В моем клиенте WCF я пытаюсь загрузить этот сертификат с локального диска, и он выдает сообщение об ошибке «Закрытый ключ отсутствует в сертификате X.509» при обмене данными со службой. Мне сказали, что мне нужно загрузить этот сертификат в локальное хранилище сертификатов, чтобы устранить эту ошибку. Может ли кто-нибудь предоставить некоторые направления? Спасибо!

У меня есть следующая функция для загрузки сертификата по пути, указанному в параметре файла.

public static X509Certificate LoadCertificate(string file)
    {
        try
        {
            return X509Certificate.CreateFromCertFile(file);
        }
        catch (System.Security.Cryptography.CryptographicException)
        {
            string filestr = File.ReadAllText(file);

            StringBuilder sb = new StringBuilder(filestr.Remove(0, filestr.IndexOf("-----BEGIN CERTIFICATE-----")));

            sb.Replace("-----BEGIN CERTIFICATE-----", "");
            sb.Replace("-----END CERTIFICATE-----", "");
            //Decode 
            try
            {        //see if the file is a valid Base64 encoded cert
                byte[] certBytes = Convert.FromBase64String(sb.ToString());

                return new X509Certificate(certBytes);
            }
            catch (System.FormatException)
            {
                throw;
            }
        }
    }

В моем клиенте WCF загружается сертификат, созданный с помощью функции LoadCertificate ().

    public X509Certificate Certificate { get; set; }

    ClientCredentials loginCredentials = new ClientCredentials();
    loginCredentials.UserName.UserName = this.UserId;
    loginCredentials.UserName.Password = this.Password;
    loginCredentials.ClientCertificate.Certificate = new X509Certificate2(this.Certificate);

1 Ответ

1 голос
/ 31 декабря 2011

Ваш код говорит, что вы пытаетесь использовать сертификат для аутентификации клиента на сервере , в дополнение к предоставлению имени пользователя и пароля. Это довольно странно, но я думаю, возможно. Для этой цели вам понадобятся закрытые ключи, связанные с этим сертификатом, так как они потребуются клиенту для шифрования связи, чтобы сервер мог использовать сертификат для расшифровки и проверки подлинности клиента. Файл .pem может содержать как открытый, так и закрытый ключи, но, возможно, тот, который был отправлен вам, не имеет?

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

Для этого Microsoft дважды щелкнула файл .pem в файловом браузере, чтобы запустить мастер импорта сертификатов. Но в случае, если это не работает для вас, вот трудный путь:

  • Старт - бег - ммк
  • Файл - Добавить / Удалить оснастку
  • Выберите «сертификаты» - нажмите «Добавить» - выберите «Учетная запись компьютера - Локальный компьютер»
  • Закрыть окно оснастки нажатием OK

  • Теперь перейдите к Сертификаты (локальный компьютер) - Личные - Сертификаты

  • Правый клик - Все задачи - Импорт
...