2011-01-28 21 views
0

私はセキュリティが必要なsoapメッセージを作成しています。何らかの理由で、クライアントにはKeyInfo、件名、シリアル番号が必要です。 x509で表示されるシリアル番号は16進数であり、整数であるX509SerialNumberノードのxsd要件に適合しません。私はこれが発行者シリアル#に必要であることを読んだが、それは証明書の一部ではない。これは自己署名証明書です。シリアル番号が何であるかはどうすればわかりますか?X509SerialNumberの検索方法

WCFの使用を教えてください。もし私がそれを使うことができたら、私はそうするでしょう。私はWCFがそれをより容易にすることを知っています、私はWCFのMCTSを保持しています。

答えて

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; 
    } 
2

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

更新:上記の説明はXMLDSigとXM​​LEnc標準に適用されます。他の標準では(または表示目的のためだけに)他の形式(base64、base16など)が使用できます。

+0

を使用しているコードです。私が使用している証明書のシリアル番号は1f676103341d33a84aee2e91601886ddです。この番号は大きすぎて受け入れられません。 –

+1

@DustinDavisあなたが提示したのは、そうでなければバイナリ値のbase64でエンコードされたテキスト表現です。そして答えを書く前に私のソースコードをチェックしました;) –

+0

Base64、なぜ私はそれを見ませんでしたか?さて、私はちょうど怠惰になり、尋ねられます、デコードされた価値は何ですか? –