Как я могу получить полный сертификат X509 из центрального хранилища сертификатов в моем приложении C # .NET Core - PullRequest
0 голосов
/ 24 января 2019

Я создаю Приложение, которое аутентифицирует личность пользователя и создает подписанный токен SAML, который он предоставляет Стороннему клиентскому приложению, которое является потребителем Услуг, предоставляемых моим Приложением.

Пользователь передается в мое приложение, где он идентифицирует себя по имени пользователя / паролю. Затем мой код должен предоставить данные пользователя в качестве полезной нагрузки токена SAML, которую я затем передаю стороннему приложению.

Наконец-то я нашел решение для создания XML-документа SAML, но мне нужно подписать его сертификатом X509, прежде чем я закодирую его для создания токена SAML.

Код для подписи выглядит примерно так:

    public XmlDocument SignDocument(XmlDocument xmlDocument, X509Certificate2 certificate)
    {
        var sig = new SignedXml(xmlDocument);
        // Add the key to the SignedXml xmlDocument. 
        sig.SigningKey = certificate.PrivateKey;

        // Create a reference to be signed. 
        var reference = new Reference();
        reference.Uri = String.Empty;

        // Add an enveloped transformation to the reference. 
        var env = new XmlDsigEnvelopedSignatureTransform();
        reference.AddTransform(env);

        // Add the reference to the SignedXml object. 
        sig.AddReference(reference);

        // Add an RSAKeyValue KeyInfo (optional; helps recipient find key to validate). 
        var keyInfo = new KeyInfo();
        var keyData = new KeyInfoX509Data(certificate);

        keyInfo.AddClause(keyData);
        sig.KeyInfo = keyInfo;

        // Compute the signature. 
        sig.ComputeSignature();
        var status = sig.CheckSignature(certificate, true);

        // Get the XML representation of the signature and save it to an XmlElement object. 
        var xmlDigitalSignature = sig.GetXml();
        xmlDocument.DocumentElement.InsertBefore(xmlDigitalSignature,
        xmlDocument.DocumentElement.ChildNodes[1]);
        return xmlDocument;
    }

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

Мое основное приложение .NET будет работать в Docker Linux-контейнере на виртуальной машине AWS.

Итак, ключевые вопросы, на которые мне нужно ответить:

1) Какой магазин лучше использовать для хранения и получения моего сертификата X509

Мне нужно будет получить весь Сертификат (а не только открытую часть), поскольку для подписания SAML необходим закрытый ключ.

2) Как я могу получить доступ к хранилищу из кода и извлечь его в объект X509Certificate2, чтобы перейти к моему коду выше.

Доступны ли SDK для Магазина в вопросе 1).

Я смотрел на AWS ACM, но, похоже, он не позволяет вам полностью получить существующий сертификат из Магазина (т. Е. С закрытым ключом).

Большое спасибо.

Тим.

...