2011-04-26 4 views
2

X509Certificate (서명을 확인해야하는 .p7b 파일)을 사용하여 XML (XMLDSig Envelope)에 서명하려면 C# (4.0)이 필요합니다. 보안 상 경험이 없습니다. 내 지식은 암호에 관한 몇 가지 기본 개념을 멈 춥니 다. 여기 X509Certificate 및 XmlDsig

내가 무엇을했는지 있습니다 : 인증서 - 현재 사용자 - 신뢰할 수있는 루트 인증 :

1) 나는 인증서를 설치했습니다. 내가 성공적으로이 코드로 인증서를로드 .NET에서

2) : 나는 다음 코드를 사용하여 서명을 생성하기 위해 인증서의 공개 키를 사용하려고

X509Store store = new X509Store(StoreName.Root, StoreLocation.CurrentUser); 
try 
{ 
    store.Open(OpenFlags.ReadOnly); 
    X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySubjectName, certName, false); 
    if (certs.Count == 0) 
     return null; 

    return certs[0]; 
} 
finally 
{ 
    store.Close(); 
} 

3); 서명을 계산할 때

XmlDocument doc = new XmlDocument(); 
doc.PreserveWhitespace = true; 
var reader = new StringReader(xml); 
doc.Load(reader); 
var signedXml = new SignedXml(doc); 
X509Certificate2 certificate = this.GetCertificateFromStore(certName); // the previous code 
signedXml.SigningKey = (RSACryptoServiceProvider)certificate.PublicKey.Key; 
var reference = new Reference(); 
reference.Uri = ""; 
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform(); 
reference.AddTransform(env); 
signedXml.AddReference(reference); 
signedXml.ComputeSignature(); // exception!!! 
var element = signedXml.GetXml(); 
doc.AppendChild(doc.ImportNode(element, true)); 

는하지만 난 예외가 : "개체는 키 쌍의 공개 절반을 포함하는 개인 키도 제공해야합니다.."

인증서에서 HasPrivateKey 속성을 검사했는데 false입니다. 개인 키가 없어야한다는 사실을 (기본) 이해하면 공개 키를 사용하여 서명을 만들 수 있어야합니다.

내가 무엇이 누락 되었습니까?

미리 감사드립니다.

답변

2

.p7b는 일반적으로 개인 키를 포함하지 않는 PKCS # 7 형식을 나타냅니다. 문서에 서명 할 때, 귀하는 귀하가 소유하고 비밀로해야하는 개인 키를 적용하여 진품임을 증명할 수 있습니다. 그러므로 누군가 (네트워크 관리자 나 은행 외)가 개인 키를 제공 할 가능성은 거의 없습니다.

+0

제 경우에는 xml을 고객 서비스에 보내야하는 응용 프로그램이 있습니다. 고객이 보낸 사람 (나)을 신뢰할 수 있는지 (또는 다른 응용 프로그램) 신뢰할 수 있는지 알고 싶다고 가정합니다. 그들은 나에게 XML에 서명하는 데 사용되는 .p7b를주었습니다. 개인 키 (고객이 신뢰할 수있는 파트너와 공유 할 수있는 키)를 요청해야하는지 아니면 공용 키만 사용하여 동일한 작업을 얻을 수 있다고 생각하십니까? – SkyG

+0

@SkyG 개인 키가있는 인증서를 가지고 있어야하며 개인 키가없는이 인증서를 고객에게 제공해야합니다. 고객이 인증서를 제공하고이 인증서를 사용하여 데이터에 서명하도록 요청한 경우 이는 다음 중 하나를 의미 할 수 있습니다. (a) 고객이 PKI가 작동하는 방식을 이해하지 못했거나 (b) 고객이 * 데이터를 암호화합니다 (고객이 보안에 유능하지 않음을 다시 말함). 자세히 ... –

+0

@SkyG 서명에 사용한 인증서가 사용자에게 속하는지 확인하려면 고객이 인증서의 유효성을 검사합니다. 이것은 대부분의 소프트웨어에서 자동화 된 복잡한 절차입니다. 인증서가 잘 알려진 인증 기관에 의해 서명 된 경우 작동합니다. 예 : http://www.globalsign.com/document-security-compliance/adobe-cds/에서 PDF 서명 인증서를 구매하면 고객의 Adobe Reader는이 인증서를 자동으로 올바르게 검증합니다.XML에서도 마찬가지입니다. –

2

콘텐츠 용 디지털 서명을 만들려면 개인 키로이 콘텐츠의 다이제스트를 암호화하고 orignal 콘텐츠 + 서명을 수신자에게 보냅니다.

검증 단계 : 검증자는 공개 키를 사용하여 서명을 해독하고 해시 H1을 가져옵니다. 그런 다음 수신자가 H1에 신호 콘텐츠를 해싱합니다. 수신자는 H1과 H2가 같은지 여부를 확인합니다. 서명 확인에 실패하면 실패합니다.