0

wse セキュリティを必要とする SOAP メッセージを構築していますが、何らかの理由で、クライアントには KeyInfo、件名、およびシリアル番号が必要です。ただし、x509 に対して表示されるシリアル番号は 16 進数であり、整数である X509SerialNumber ノードの xsd 要件に適合しません。これは発行者のシリアル番号に必要であると読みましたが、証明書の一部ではありません。これは自己署名証明書です。シリアル番号を確認するにはどうすればよいですか?

WCFを使用するように言わないでください。私がそれを使うことができれば、私はそうします。私はWCFがそれをより簡単にすることを知っています.WCFのMCTSを保持しています.

4

2 に答える 2

3

証明書のシリアル番号フィールドは 1 つだけで、バイナリ データです。発行者はそこに何でも入れることができます。実際、シリアル番号は非常に大きな整数として扱われますが、その番号を保持するバイト配列を調べただけでは、そのような番号は 2 進数のように見えます。したがって、この値を巨大な数として扱い、「読み取り可能な」形式に変換する必要があります。例えば。FF 00 FF 00 (4 バイト) を含む 4 バイト長のバイト配列がある場合、文字列表現は "4278255360" になります。

更新: 上記の説明は、XMLDSig および XMLEnc 標準に適用されます。他の標準 (または単に表示目的) では、他の形式を使用できます (base64、base16 エンコーディングなど)。

于 2011-01-28T17:53:59.727 に答える
1

必要なものが見つかりました。 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;
    }
于 2011-01-28T20:33:13.387 に答える