2011-01-28 4 views
0

wse 보안이 필요한 비누 메시지를 작성 중이며 어떤 이유로 클라이언트에 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

인증서의 일련 번호 필드는 하나 뿐이며 이진 데이터입니다. 발행자는 그곳에 무엇이든 둘 수 있습니다. 사실, 일련 번호는 매우 큰 정수로 취급되지만 숫자를 보유하고있는 바이트 배열을 검사하는 경우이 번호는 바이너리처럼 보일 것입니다. 따라서이 값을 거대한 숫자로 취급하고이를 "읽을 수있는"형식으로 변환해야합니다. 예 : FF 00 FF 00 (4 바이트)를 포함하는 4 바이트 길이의 바이트 배열이있는 경우 문자열 표현은 "4278255360"이됩니다.

업데이트 : 위의 설명은 XMLDSig 및 XMLEnc 표준에 적용됩니다. 다른 표준 (또는 표시 목적으로 만 사용)에서는 다른 형식 (예 : base64, base16 인코딩 등)을 사용할 수 있습니다.

+0

을 사용하고 코드입니다. 내가 사용하는 인증서의 시리얼은 1f676103341d33a84aee2e91601886dd이며, 이는 받아들이기에 너무 큰 숫자가 될 것입니다. –

+1

@DustinDavis 당신이 제시 한 것은 이진 값의 base64로 인코딩 된 텍스트 표현입니다. 그리고 대답을하기 전에 우리의 소스 코드를 확인했습니다;) –

+0

Base64, 왜 내가 그것을 보지 못했습니다. 좋아, 그래서 나는 게으르다가 묻는다. 디코드 된 값은 무엇인가? –