.net 如何查找X509SerialNumber

.net 如何查找X509SerialNumber,.net,soap,x509,wse,.net,Soap,X509,Wse,我正在构建需要wse安全性的soap消息,出于某种原因,客户端需要KeyInfo、subject和serial。但是x509的串行#显示是十六进制的,不符合X509SerialNumber节点的xsd要求,该节点是整数。我已经了解到,这需要发送到颁发者序列号,但它不是证书的一部分。这是一个自签名证书。我如何确定序列号是什么 请不要告诉我使用WCF。如果我能用,我会的。我知道WCF会让事情变得更简单,我为WCF持有MCTS。证书只有一个序列号字段,它是二进制数据。发行人可以把任何东西放在那里。事实

我正在构建需要wse安全性的soap消息,出于某种原因,客户端需要KeyInfo、subject和serial。但是x509的串行#显示是十六进制的,不符合X509SerialNumber节点的xsd要求,该节点是整数。我已经了解到,这需要发送到颁发者序列号,但它不是证书的一部分。这是一个自签名证书。我如何确定序列号是什么


请不要告诉我使用WCF。如果我能用,我会的。我知道WCF会让事情变得更简单,我为WCF持有MCTS。

证书只有一个序列号字段,它是二进制数据。发行人可以把任何东西放在那里。事实上,序列号被视为一个非常大的整数,但如果您只检查保存该数字的字节数组,则该数字将看起来像一个二进制数。因此,您需要将该值视为一个巨大的数字,并将其转换为“可读”形式。例如,如果有包含FF 00 FF 00(4字节)的4字节长字节数组,则字符串表示形式将为“4278255360”


更新:我的上述解释适用于XMLDSig和XMLEnc标准。在其他标准中(或仅出于显示目的),可以使用其他格式(如base64、base16编码等)

证书只有一个序列号字段,它是二进制数据。发行人可以把任何东西放在那里。事实上,序列号被视为一个非常大的整数,但如果您只检查保存该数字的字节数组,则该数字将看起来像一个二进制数。因此,您需要将该值视为一个巨大的数字,并将其转换为“可读”形式。例如,如果有包含FF 00 FF 00(4字节)的4字节长字节数组,则字符串表示形式将为“4278255360”

更新:我的上述解释适用于XMLDSig和XMLEnc标准。在其他标准中(或仅出于显示目的),可以使用其他格式(如base64、base16编码等)

我找到了我需要的东西

只是需要添加一些代码。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;
    }
我找到了我需要的东西

只是需要添加一些代码。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;
    }

我认为那是不对的。我正在使用的证书上的序列号是1F67610341D33A84AEE2E91601886DD,这将是一个太大而无法接受的数字。@DustinDavis您提供的是其他二进制值的base64编码文本表示形式。在写答案之前,我检查了我们的源代码;)Base64,为什么我没看到。好吧,我只是想偷懒地问一下,解码值是多少?@DustinDavis,我认为这是不对的。我正在使用的证书上的序列号是1F67610341D33A84AEE2E91601886DD,这将是一个太大而无法接受的数字。@DustinDavis您提供的是其他二进制值的base64编码文本表示形式。在写答案之前,我检查了我们的源代码;)Base64,为什么我没看到。好吧,我只是想偷懒地问一下,解码值是多少?@DustinDavis