Microsoft MVP성태의 닷넷 이야기
.NET Framework: 541. SignedXml을 이용한 ds:Signature만드는 방법 [링크 복사], [링크+제목 복사],
조회: 17433
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일

SignedXml을 이용한 ds:Signature만드는 방법

다음과 같은 질문이 있군요.

SignedXml을 이용한 ds:Signature만드는 방법좀 알려주세요.
; https://social.msdn.microsoft.com/Forums/ko-KR/50c767ec-4e34-4289-a393-6b4aafe137f4/signedxml-dssignature-?forum=dotnetko&prof=required

MSDN에서 SignedXml 클래스를 보면,

SignedXml Class
; https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.xml.signedxml

친절하게 예제 코드도 실어두고 있습니다. 그 예제를 실행해 보면 서명된 Xml 데이터를 포함하는 경우 다음과 같은 식의 XML 파일이 생성됩니다.

<MyElement xmlns="samples">Example text to be signed.
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        <SignedInfo>
            <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
            <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
            <Reference URI="">
                <Transforms>
                    <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                </Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                <DigestValue>zSI5ZAMmQ+8u7R2rP7aAPT6nNQw=</DigestValue>
            </Reference>
        </SignedInfo>
        <SignatureValue>fDm0x8LvDpGWntkek6Q...[생략]...JwOyVJkxzcs=</SignatureValue>
    </Signature>
</MyElement>

질문자는, <Signature /> 노드가 <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" />와 같이 나오길 바라는 것입니다. 그런데, 웹 상의 답변들은 어쨌든 나온 결과물에서 텍스트만 그렇게 수정하면 된다는 식이고.

하지만, 질문자는 그에 대해 이렇게 알고 있습니다.

구글링 및 여러 자료를 찾아봐도 전부다 서명계산 후에 Prefix하는 방법만 알려주는군요. 서명계산 후에 하면 Hash Value가 달라지므로

그렇게 하면 안되거든요...


생각해 보니, 저렇게 오해할 수도 있겠구나... 싶습니다. 사실 서명 작업은 대상 데이터를 입력으로 삼는 것이지, 대상 데이터를 서명한 것을 포함한 그걸 또 서명하는 것은 아닙니다. 따라서, XML 데이터를 서명하는 경우 대상 XML 데이터를 정규화(Canonicalization)한 후 그것을 서명해서 덧붙이는 것입니다. 그런 연유로, 대상 XML 데이터만 바꾸지 않는다면 서명으로 포함되는 정보, 즉 <Signature />는 적법한 XML이기만 하면 됩니다.

실제로 SignedXm Class 문서에 포함된 예제에서,

SignXmlFile("Example.xml", "signedExample.xml", Key);
Console.WriteLine("XML file signed.");

Console.ReadLine();

// Verify the signature of the signed XML.
Console.WriteLine("Verifying signature...");
bool result = VerifyXmlFile("SignedExample.xml", Key);

위와 같이 서명과 검증 사이에 Console.ReadLine을 추가해 멈춰놓고 signedExample.xml파일의 내용을<Signature />에 <ds:Signature />로 처리해서 진행해도 정상적으로 검증 작업을 통과합니다.

이렇게 텍스트만 바꾸는 식의 후처리를 해도 되는데, 더 쉬운 방법은 SignedXml.GetXml로 반환받은 XmlElement의 Prefix를 지정해서 처리하는 것입니다.

XmlElement xmlDigitalSignature = signedXml.GetXml();
xmlDigitalSignature.Prefix = "ds";

그럼, XML 파일이 다음과 같이 바뀝니다.

<MyElement xmlns="samples">Example text to be signed.
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
            <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
            <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
            <Reference URI="">
                <Transforms>
                    <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                </Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                <DigestValue>zSI5ZAMmQ+8u7R2rP7aAPT6nNQw=</DigestValue>
            </Reference>
        </SignedInfo>
        <SignatureValue xmlns="http://www.w3.org/2000/09/xmldsig#">fDm0x8LvDpGWntkek6Q...[생략]...JwOyVJkxzcs=</SignatureValue>
    </ds:Signature>
</MyElement>

첨부한 파일은 위의 처리를 추가한 SignedXm Class 문서의 변형 코드를 담고 있습니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 3/27/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2015-11-26 07시46분
[YHJDEV] 안녕하세요. 정성태님
보내주신 답변 확인했습니다. 감사합니다^^
보다가 제가 이해가 안가는 부분이 있습니다.. 제가 질문글에 중요한걸 하나 빼먹었네요.
이메일로 자세한 내용에 대해 보내드려도 될까요?
[guest]
2015-11-27 12시04분
이메일로 질문은 받지 않습니다. 빼먹은 것이 있다면 질문글에 다시 해주세요. ^^
정성태
2015-12-02 02시07분
닷넷으로 NIPA와 XML 서명 연동을 하는 분이라면 아래의 윤용한 님 글을 꼭 읽어보세요.

ds:Signature 질문입니다.
; http://www.sysnet.pe.kr/3/0/3657
정성태

... 46  47  48  49  [50]  51  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12385정성태10/28/20208815오류 유형: 673. openssl - req: No value provided for Subject Attribute CN, skipped
12384정성태10/27/202010059오류 유형: 672. AllowPartiallyTrustedCallers 특성이 적용된 어셈블리의 struct 멤버 메서드를 재정의하면 System.Security.VerificationException 예외 발생
12383정성태10/27/202011000.NET Framework: 956. C# 9.0 - (7) 패턴 일치 개선 사항(Pattern matching enhancements) [3]파일 다운로드1
12382정성태10/26/20208621오류 유형: 671. dotnet build - The local source '...' doesn't exist
12381정성태10/26/202010298VC++: 137. C++ stl map의 사용자 정의 타입을 key로 사용하는 방법 [1]파일 다운로드1
12380정성태10/26/20207771오류 유형: 670. Visual Studio - Squash_FailureCommitsReset
12379정성태10/21/202010749.NET Framework: 955. .NET 메서드의 Signature 바이트 코드 분석 [1]파일 다운로드2
12378정성태10/15/202010214.NET Framework: 954. C# - x86/x64 환경에 따라 달라지는 P/Invoke 함수의 export 이름파일 다운로드1
12377정성태10/15/202011537디버깅 기술: 172. windbg - 파일 열기 시점에 bp를 걸어 파일명 알아내는 방법(Managed/Unmanaged)
12376정성태10/15/20208271오류 유형: 669. windbg - sos의 name2ee 명령어 실행 시 "Failed to request module list." 오류
12375정성태10/15/20209590Windows: 177. 윈도우 탐색기에서 띄우는 cmd.exe 창의 디렉터리 구분 문자가 'Yen(&#0165;)' 기호로 나오는 경우 [1]
12374정성태10/14/202014194.NET Framework: 953. C# 9.0 - (6) 함수 포인터(Function pointers) [1]파일 다운로드2
12373정성태10/14/20209471.NET Framework: 952. OpCodes.Box와 관련해 IL 형식으로 직접 코딩 시 유의할 점
12372정성태10/13/202011361.NET Framework: 951. C# 9.0 - (5) 로컬 함수에 특성 지정 가능(Attributes on local functions)파일 다운로드1
12371정성태10/13/202010085개발 환경 구성: 519. Visual Studio의 Ctrl+Shift+U (Edit.MakeUppercase) 단축키가 동작하지 않는 경우
12370정성태10/13/202010951Linux: 33. Linux - nmcli를 이용한 고정 IP 설정
12369정성태10/12/202013758Windows: 176. Raymond Chen이 한글날에 밝히는 윈도우의 한글 자모 분리 현상 [3]
12368정성태10/12/20209819오류 유형: 668. VSIX 확장 빌드 - The "GetDeploymentPathFromVsixManifest" task failed unexpectedly.
12367정성태10/12/202022579오류 유형: 667. Ubuntu - Temporary failure resolving 'kr.archive.ubuntu.com' [2]
12366정성태10/12/202011619.NET Framework: 950. C# 9.0 - (4) 원시 크기 정수(Native ints) [1]파일 다운로드1
12365정성태10/12/202010549.NET Framework: 949. C# 9.0 - (3) 람다 메서드의 매개 변수 무시(Lambda discard parameters)파일 다운로드1
12364정성태10/11/202011757.NET Framework: 948. C# 9.0 - (2) localsinit 플래그 내보내기 무시(Suppress emitting localsinit flag)파일 다운로드1
12363정성태10/11/202012648.NET Framework: 947. C# 9.0 - (1) 대상으로 형식화된 new 식(Target-typed new expressions) [2]파일 다운로드1
12362정성태10/11/20209452VS.NET IDE: 151. Visual Studio 2019에 .NET 5 rc/preview 적용하는 방법
12361정성태10/11/202011052.NET Framework: 946. C# 9.0을 위한 개발 환경 구성
12360정성태10/8/20208274오류 유형: 666. The type or namespace name '...' does not exist in the namespace 'Microsoft.VisualStudio.TestTools' (are you missing an assembly reference?)
... 46  47  48  49  [50]  51  52  53  54  55  56  57  58  59  60  ...