문제

XML 문서에 서명하고 2 개의 다른 컴퓨터에서 확인하고 있습니다 (한 기계에 서명하고 다른 기계에서 확인).

CSHARP.NET에서 XML DSIG를 확인하기 위해 다음을 수행하고 있습니다.

        public static Boolean VerifyXml(XmlDocument document)
        {
            document.PreserveWhitespace = true;
            // Create a new CspParameters object to specify
            // a key container.
            CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";

            // Create a new RSA signing key and save it in the container. 
            //**Earlier was getting exception here in rsaKey object**
            RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);

            // Create a new SignedXml object and pass it
            // the XML document class.
            SignedXml signedXml = new SignedXml(document);

            // Find the "Signature" node and create a new
            // XmlNodeList object.
            // It's guaranteed that there's always exists a signature 
            XmlNodeList nodeList = document.GetElementsByTagName("Signature");

            // Load the <signature> node.  
            signedXml.LoadXml((XmlElement)nodeList[0]);

            // Check the signature and return the result.
            bool isDone = signedXml.CheckSignature(rsaKey); //**This is returning false.**
            return isDone;
        }

처음에 웹 응용 프로그램이 키 컨테이너에 액세스하려고 할 때 AccissionEied Exception을 받고있었습니다. 그러나 나는 일시적으로 Application 사용자 및 IIS 사용자를 관리자 역할에 추가하고 CASPOL을 사용하여 내 웹 응용 프로그램에 FullTrust 보안 정책을 할당했습니다.

Q1 : [나의 첫 번째 질문은 이것을 과도하게하는 가장 좋은 방법은 무엇입니까] ?? 웹 응용 프로그램을 FullTrust를 할당하고 관리자 역할에 사용자를 추가하는 것은 작동하지만 밝은 아이디어가 아닙니다.

두 번째 질문은 signedXml.CheckSignature(rsaKey); 거짓 반환. 내 이해에 따라 XML 문서가 다른 시스템에 디지털 로그인하므로 서명 한 Mac은 해당 시스템의 키 컨테이너 이름 "XML_DSIG_RSA_KEY"에 저장되어 있지만 호스트 시스템에서 서명을 확인하려고 할 때 다른 Mac은 다음과 같습니다. 호스트 시스템에서 컨테이너 이름 "XML_DSIG_RSA_KEY"로 생성 및 저장하므로 디지털 서명이 확인되지 않았습니다.

Q2 :이 가정이 맞습니까? 그리고 이것에 대처하는 가장 좋은 방법은 무엇입니까 ... 인증서를 사용하여 XML 문서를 디지털로 서명 한 다음이 경우 확인해야합니다. DSIG XML 문서와 함께 인증서를 동반해야합니까 ???

도움이 되었습니까?

해결책

두 번째 질문에 먼저 답변하려면 : XML을 공공의 서명하는 데 사용 된 RSA 키 페어의 일부. 따라서 이미 검증기의 공개 키를 보유하고 신뢰하거나 XML과 함께 공개 키가 포함 된 인증서를 보내야 한 다음 인증서가 있는지 확인해야합니다. 신뢰할 수있는 인증서에 의해 발행됩니다.

첫 번째 사례를 구현하려면 전화 할 수 있습니다 ToXmlString(false) 전송 측의 키에서 결과를 파일에 저장 하고이 파일을 수신쪽에 보관하십시오. 그런 다음 수신 종료시 파일을 읽고 전화하십시오.

RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
rsaKey.ImportFromXml(publicKeyFromFile);

두 번째 사례는 인증서를 얻고 이와 같은 서명 측의 서명에 추가하여 수행 할 수 있습니다.

KeyInfo keyInfo = new KeyInfo();
X509Certificate cert = // load certificate
keyInfo.AddClause(new KeyInfoX509Data(cert));
signedXml.KeyInfo = keyInfo;

인증서를 신뢰할 경우 호출만으로 수신자의 서명을 확인할 수 있습니다.

bool isDone = signedXml.CheckSignature();

첫 번째 질문에 대답하려면 : 더 이상 개인 키 스토어에 액세스하려고하지 않으면 (RSAcryptoserviceProvider-Constructor와 같은 개인 키 스토어에 액세스하려고하지 않으면 완전한 신뢰없이 실행할 수 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top