Как найти X509SerialNumber - PullRequest
       43

Как найти X509SerialNumber

0 голосов
/ 28 января 2011

Я создаю мыльное сообщение, которое требует безопасности wse, и по какой-то причине клиент требует KeyInfo, subject и serial #. но серийный номер, отображаемый для x509, является шестнадцатеричным и не соответствует требованиям xsd для узла X509SerialNumber, который является целым числом. Я читал, что это необходимо для серийного номера эмитента, но это не является частью сертификата. Это самозаверяющий сертификат. Как определить серийный номер?

Пожалуйста, НЕ говорите мне использовать WCF. Если бы я мог использовать это, я бы. Я знаю, что WCF сделает это проще, я держу MCTS для WCF.

Ответы [ 2 ]

2 голосов
/ 28 января 2011

Существует только одно поле серийного номера сертификата, и это двоичные данные.Эмитент может положить туда все, что угодно.На самом деле, серийный номер рассматривается как очень большое целое число, но такой номер будет выглядеть как двоичный, если вы просто осмотрите байтовый массив, который содержит номер.Поэтому вам нужно рассматривать это значение как огромное число и преобразовывать его в «читаемую» форму.Например.Если у вас есть 4-байтовый байтовый массив, который содержит FF 00, FF 00 (4 байта), строковое представление будет «4278255360»

Обновление: мое объяснение выше применимо к стандартам XMLDSig и XMLEnc.В других стандартах (или только для целей отображения) могут использоваться другие форматы (например, base64, base16 и т. Д.).

1 голос
/ 28 января 2011

Я нашел то, что мне было нужно.http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-security/2875/Manually-computing-sha1-digest-of-reference-containing

Просто нужно добавить код.X509ChainElement.Certificate.GetSerialNumberString () дает мне то, что мне нужно, и мне не нужно ничего вычислять.

Вот код, который я сейчас использую

public static XmlElement GenerateSignature(XmlElement xmlToSign, StoreName storeName, StoreLocation storeLocation, X509Certificate2 certificate, string referenceID)
    {
        SignedXml signedXml = new SignedXml(xmlToSign);

        signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;
        signedXml.SigningKey = certificate.PrivateKey;

        Reference tRef = new Reference(referenceID);
        XmlDsigExcC14NTransform env = new XmlDsigExcC14NTransform();

        tRef.AddTransform(env);
        signedXml.AddReference(tRef);

        KeyInfo keyInfo = new KeyInfo();
        X509Chain x509Chain = new X509Chain();
        x509Chain.Build(certificate);

        foreach (X509ChainElement element in x509Chain.ChainElements)
        {
            KeyInfoX509Data x509Data = new KeyInfoX509Data(element.Certificate);
            string issuer = element.Certificate.Issuer;
            x509Data.AddIssuerSerial(issuer, element.Certificate.GetSerialNumberString());
            keyInfo.AddClause(x509Data);
        }

        signedXml.KeyInfo = keyInfo;
        signedXml.ComputeSignature();

        XmlElement xmlDsig = signedXml.GetXml();
        return xmlDsig;
    }
...