Создайте сертификат в хранилище ключей Azure, используя самозаверяющий сертификат хранилища ключей.

Я создал самозаверяющий сертификат в Azure Key Vault, используя следующий метод:

        public void CreateRootCertificate()
        {
            var certPolicy = new CertificatePolicy();
            certPolicy.Attributes = new CertificateAttributes();
            certPolicy.Attributes.NotBefore = DateTime.Now;
            certPolicy.Attributes.Expires = DateTime.Now.AddDays(1);
            certPolicy.IssuerParameters = new IssuerParameters()
            {
                Name = "Self",
            };
            certPolicy.KeyProperties = new KeyProperties(true);
            certPolicy.SecretProperties = new SecretProperties();
            certPolicy.X509CertificateProperties = new X509CertificateProperties()
            {
                Subject = "CN=testyMcTesterson",
            };
            var operation = this.client.CreateCertificateAsync(keyVaultUrl, testRootName, certPolicy);
            operation.Wait();
        }

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

        public void CreateSignedCertificate()
        {
            var certPolicy = new CertificatePolicy();
            certPolicy.Attributes = new CertificateAttributes();
            certPolicy.Attributes.NotBefore = DateTime.Now;
            certPolicy.Attributes.Expires = DateTime.Now.AddDays(1);
            certPolicy.IssuerParameters = new IssuerParameters()
            {
                Name = "CN=testyMcTesterson"
            };
            certPolicy.KeyProperties = new KeyProperties(true);
            certPolicy.SecretProperties = new SecretProperties();
            certPolicy.X509CertificateProperties = new X509CertificateProperties()
            {
                Subject = "CN=testyJunior",
            };
            var operation = this.client.CreateCertificateAsync(keyVaultUrl, "testyJunior", certPolicy);
            operation.Wait();
        }

Сюда входит установка издателя на "testyMcTesterson" без CN=, установка для него идентификатора сертификата хранилища ключей и секрета хранилища ключей. Я хотел бы настроить его так, чтобы только файл .cer сертификата подписи когда-либо покидал хранилище ключей. Все они вызывают исключение 400, говорящее, что свойство IssuerParameters.Name недействительно. Я понимаю, что мне, скорее всего, не хватает некоторых EKU как на корне, так и на клиенте, но проблема, которую я пытаюсь решить прямо сейчас, заключается в том, чтобы выяснить, возможен ли этот сценарий вообще. Документация по Класс IssuerParameters отсутствует.


person Eddie D    schedule 03.10.2019    source источник
comment
Не могли бы вы сказать мне, что я хотел бы сделать, не вытаскивая закрытый ключ из хранилища ключей? Вы хотите загрузить файл .cert из хранилища ключей Azure, а затем использовать его для подписи других сертификатов?   -  person Jim Xu    schedule 07.10.2019
comment
Я хотел бы создать и подписать сертификат клиента с помощью API хранилища ключей, не извлекая сертификат подписи из хранилища ключей.   -  person Eddie D    schedule 07.10.2019
comment
Используйте API хранилища ключей для создания самозаверяющего сертификата. Используйте API хранилища ключей для создания клиентского сертификата из самоподписанного сертификата. Закрытый ключ самоподписанного сертификата, по сути, никогда не покинет хранилище ключей.   -  person Eddie D    schedule 07.10.2019
comment
Если вы хотите использовать сертификат хранилища ключей Azure для создания сертификата клиента, см. private-key-when-retrieved-via-ik" title="Сертификаты хранилища ключей Azure не имеют закрытого ключа при получении через ik">stackoverflow.com/questions/51451902/   -  person Jim Xu    schedule 08.10.2019
comment
Это объясняет, как создать самозаверяющий сертификат и как получить закрытый ключ.   -  person Eddie D    schedule 08.10.2019
comment
Если вы хотите экспортировать сертификат без закрытого ключа, вы можете установить non-exportable в своей политике. Дополнительные сведения см. на странице docs.microsoft.com/en-us/azure/key-vault/.   -  person Jim Xu    schedule 09.10.2019
comment
Я не пытаюсь его экспортировать. 1 . Используйте API хранилища ключей для создания самозаверяющего сертификата. 2. Используйте хранилище ключей для создания сертификата клиента, используя сертификат из первого шага. Я не хочу, чтобы закрытый ключ, используемый для подписи, покидал хранилище ключей.   -  person Eddie D    schedule 09.10.2019
comment
Не могли бы вы сказать, что такое экспорт, который вы сказали? Я просто хочу сказать вам, что если вы установите политику, когда вы используете SDK для получения сертификата, значение сертификата не будет содержать закрытый ключ, тогда вы можете использовать это значение для создания сертификата.   -  person Jim Xu    schedule 10.10.2019
comment
Это возможно, но это ручная процедура. Вам необходимо вычислить дайджест SHA256 информации CSR, а затем вызвать API подписи из Key Vault: docs.microsoft.com/en-us/rest/api/keyvault/sign/sign с указанием алгоритма RS256. Получив подпись, используйте ее для создания окончательного сертификата. Для получения дополнительной информации вы можете начать с tools.ietf.org/html/rfc5280. Однако то, что вы спрашиваете, необычно, потому что ваш корневой самозаверяющий сертификат не пользуется широким доверием. Но я вижу сценарии, в которых это может быть полезно.   -  person fernacolo    schedule 24.04.2020