2014-04-07 2 views
2

xmlsec1을 사용하여 Win8 inapp-purchase 영수증을 어떻게 확인할 수 있습니까? 여기에 내가 할 tyring있어 무엇 :xmlsec1을 사용하여 Windows 8 inapp-purchase 영수증 확인

  1. 내 샘플 영수증 (파일 receipt.xml에 저장) :

    <?xml version="1.0"?> 
    <Receipt Version="1.0" ReceiptDate="2012-08-30T23:10:05Z" CertificateId="b809e47cd0110a4db043b3f73e83acd917fe1336" ReceiptDeviceId="4e362949-acc3-fe3a-e71b-89893eb4f528"> 
    <AppReceipt Id="8ffa256d-eca8-712a-7cf8-cbf5522df24b" AppId="55428GreenlakeApps.CurrentAppSimulatorEventTest_z7q3q7z11crfr" PurchaseDate="2012-06-04T23:07:24Z" LicenseType="Full" /> 
    <ProductReceipt Id="6bbf4366-6fb2-8be8-7947-92fd5f683530" ProductId="Product1" PurchaseDate="2012-08-30T23:08:52Z" ExpirationDate="2012-09-02T23:08:49Z" ProductType="Durable" AppId="55428GreenlakeApps.CurrentAppSimulatorEventTest_z7q3q7z11crfr" /> 
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
        <SignedInfo> 
         <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
         <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /> 
         <Reference URI=""> 
          <Transforms> 
           <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> 
          </Transforms> 
          <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> 
          <DigestValue>cdiU06eD8X/w1aGCHeaGCG9w/kWZ8I099rw4mmPpvdU=</DigestValue> 
         </Reference> 
        </SignedInfo> 
        <SignatureValue>SjRIxS/2r2P6ZdgaR9bwUSa6ZItYYFpKLJZrnAa3zkMylbiWjh9oZGGng2p6/gtBHC2dSTZlLbqnysJjl7mQp/A3wKaIkzjyRXv3kxoVaSV0pkqiPt04cIfFTP0JZkE5QD/vYxiWjeyGp1dThEM2RV811sRWvmEs/hHhVxb32e8xCLtpALYx3a9lW51zRJJN0eNdPAvNoiCJlnogAoTToUQLHs72I1dECnSbeNPXiG7klpy5boKKMCZfnVXXkneWvVFtAA1h2sB7ll40LEHO4oYN6VzD+uKd76QOgGmsu9iGVyRvvmMtahvtL1/pxoxsTRedhKq6zrzCfT8qfh3C1w==</SignatureValue> 
    </Signature> 
    

  2. CertificateId 사용하여, 나는 this url를 사용하여 인증서를 검색하고 저장 파일 cert.

    -----BEGIN CERTIFICATE----- 
    MIIDyTCCArGgAwIBAgIQNP+YKvSo8IVArhlhpgc/xjANBgkqhkiG9w0BAQsFADCB 
    jjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1Jl 
    ZG1vbmQxHjAcBgNVBAoMFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEWMBQGA1UECwwN 
    V2luZG93cyBTdG9yZTEgMB4GA1UEAwwXV2luZG93cyBTdG9yZSBMaWNlbnNpbmcw 
    HhcNMTExMTE3MjMwNTAyWhcNMzYxMTEwMjMxMzQ0WjCBjjELMAkGA1UEBhMCVVMx 
    EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1JlZG1vbmQxHjAcBgNVBAoM 
    FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEWMBQGA1UECwwNV2luZG93cyBTdG9yZTEg 
    MB4GA1UEAwwXV2luZG93cyBTdG9yZSBMaWNlbnNpbmcwggEiMA0GCSqGSIb3DQEB 
    AQUAA4IBDwAwggEKAoIBAQCcr4/vgqZFtzMqy3jO0XHjBUNx6j7ZTXEnNpLl2VSe 
    zVQA9KK2RlvroXKhYMUUdJpw+txm1mqi/W7D9QOYTq1e83GLhWC9IRh/OSmSYt0e 
    kgVLB+icyRH3dtpYcJ5sspU2huPf4I/Nc06OuXlMsD9MU4Ug9IBD2HSDBEquhGRo 
    xV64YuEH4645oB14LlEay0+JZlkKZ/mVhx/sdzSBfrda1X/Ckc7SOgnTSM3d/DnO 
    5DKwV2WYn+7i/rBqe4/op6IqQMrPpHyem9Sny+i0xiUMA+1IwkX0hs0gvHM6zDww 
    TMDiTapbCy9LnmMx65oMq56hhsQydLEmquq8lVYUDEzLAgMBAAGjITAfMB0GA1Ud 
    DgQWBBREzrOBz7zw+HWskxonOXAPMa6+NzANBgkqhkiG9w0BAQsFAAOCAQEAeVtN 
    4c6muxO6yfht9SaxEfleUBIjGfe0ewLBp00Ix7b7ldJ/lUQcA6y+Drrl7vjmkHQK 
    OU3uZiFbCxTvgTcoz9o+1rzR/WPXmqH5bqu6ua/UrobGKavAScqqI/G6o56Xmx/y 
    oErWN0VapN370crKJvNWxh3yw8DCl+W0EcVRiWX5lFsMBNBbVpK4Whp+VhkSJilu 
    iRpe1B35Q8EqOz/4RQkOpVI0dREnuSYkBy/h2ggCtiQ5yfvH5zCdcfhFednYDevS 
    axmt3W5WuHz8zglkg+OQ3qpXaXySRlrmLdxEmWu2MOiZbQkU2ZjBSQmvFAOy0dd6 
    P1YLS4+Eyh5drQJc0Q== 
    -----END CERTIFICATE----- 
    
  3. 그리고 나는이 시도 : xmlsec1 --verify --print-debug --pubkey-cert-pem cert receipt.xml을 여기에 그 내용이다.

    func=xmlSecOpenSSLEvpDigestVerify:file=digests.c:line=229:obj=sha256:subj=unknown:error=12:invalid data:data and digest do not match 
    FAIL 
    SignedInfo References (ok/all): 0/1 
    Manifests References (ok/all): 0/0 
    = VERIFICATION CONTEXT 
    == Status: invalid 
    == flags: 0x00000000 
    == flags2: 0x00000000 
    == Key Info Read Ctx: 
    = KEY INFO READ CONTEXT 
    == flags: 0x00000000 
    == flags2: 0x00000000 
    == enabled key data: all 
    == RetrievalMethod level (cur/max): 0/1 
    == TRANSFORMS CTX (status=0) 
    == flags: 0x00000000 
    == flags2: 0x00000000 
    == enabled transforms: all 
    === uri: NULL 
    === uri xpointer expr: NULL 
    == EncryptedKey level (cur/max): 0/1 
    === KeyReq: 
    ==== keyId: NULL 
    ==== keyType: 0x00000000 
    ==== keyUsage: 0xffffffff 
    ==== keyBitsSize: 0 
    === list size: 0 
    == Key Info Write Ctx: 
    = KEY INFO WRITE CONTEXT 
    == flags: 0x00000000 
    == flags2: 0x00000000 
    == enabled key data: all 
    == RetrievalMethod level (cur/max): 0/1 
    == TRANSFORMS CTX (status=0) 
    == flags: 0x00000000 
    == flags2: 0x00000000 
    == enabled transforms: all 
    === uri: NULL 
    === uri xpointer expr: NULL 
    == EncryptedKey level (cur/max): 0/1 
    === KeyReq: 
    ==== keyId: NULL 
    ==== keyType: 0x00000001 
    ==== keyUsage: 0xffffffff 
    ==== keyBitsSize: 0 
    === list size: 0 
    == Signature Transform Ctx: 
    == TRANSFORMS CTX (status=0) 
    == flags: 0x00000000 
    == flags2: 0x00000000 
    == enabled transforms: all 
    === uri: NULL 
    === uri xpointer expr: NULL 
    === Transform: exc-c14n (href=http://www.w3.org/2001/10/xml-exc-c14n#) 
    === Transform: rsa-sha256 (href=http://www.w3.org/2001/04/xmldsig-more#rsa-sha256) 
    == Signature Method: 
    === Transform: rsa-sha256 (href=http://www.w3.org/2001/04/xmldsig-more#rsa-sha256) 
    == SignedInfo References List: 
    === list size: 1 
    = REFERENCE VERIFICATION CONTEXT 
    == Status: invalid 
    == URI: "" 
    == Reference Transform Ctx: 
    == TRANSFORMS CTX (status=2) 
    == flags: 0x00000000 
    == flags2: 0x00000000 
    == enabled transforms: all 
    === uri: NULL 
    === uri xpointer expr: NULL 
    === Transform: enveloped-signature (href=http://www.w3.org/2000/09/xmldsig#enveloped-signature) 
    === Transform: c14n (href=http://www.w3.org/TR/2001/REC-xml-c14n-20010315) 
    === Transform: sha256 (href=http://www.w3.org/2001/04/xmlenc#sha256) 
    === Transform: membuf-transform (href=NULL) 
    == Digest Method: 
    === Transform: sha256 (href=http://www.w3.org/2001/04/xmlenc#sha256) 
    == Manifest References List: 
    === list size: 0 
    Error: failed to verify file "receipt.xml" 
    

내가 뭔가 잘못하고 있는가 : 여기 출력은? 영수증을 제대로 확인하려면 어떤 매개 변수를 제공해야합니까? 아니면 실제로 유효하지 않습니다 (누군가가 유효한 영수증을 제공 할 수 있습니까?)?

답변

2

모든 여분의 공백이 receipt.xml에서 제거되면 확인이 성공한 것으로 나타났습니다. 다운로드 및 저장시 실제로 파일에이 파일이 포함되어있는 경우 sed 또는 그 파일을 제거해야 할 수도 있습니다 (실제로 파일이 있고 실수로 파일을 실수로 추가하지 않은 경우).

# xmlsec1 --verify --print-debug --pubkey-cert-pem cert receipt.xml 
OK 
SignedInfo References (ok/all): 1/1 
Manifests References (ok/all): 0/0 
= VERIFICATION CONTEXT 
== Status: succeeded 
== flags: 0x00000000 
== flags2: 0x00000000 
== Key Info Read Ctx: 
= KEY INFO READ CONTEXT 
== flags: 0x00000000 
== flags2: 0x00000000 
== enabled key data: all 
== RetrievalMethod level (cur/max): 0/1 
== TRANSFORMS CTX (status=0) 
== flags: 0x00000000 
== flags2: 0x00000000 
== enabled transforms: all 
=== uri: NULL 
=== uri xpointer expr: NULL 
== EncryptedKey level (cur/max): 0/1 
=== KeyReq: 
==== keyId: rsa 
==== keyType: 0x00000001 
==== keyUsage: 0x00000002 
==== keyBitsSize: 0 
=== list size: 0 
== Key Info Write Ctx: 
= KEY INFO WRITE CONTEXT 
== flags: 0x00000000 
== flags2: 0x00000000 
== enabled key data: all 
== RetrievalMethod level (cur/max): 0/1 
== TRANSFORMS CTX (status=0) 
== flags: 0x00000000 
== flags2: 0x00000000 
== enabled transforms: all 
=== uri: NULL 
=== uri xpointer expr: NULL 
== EncryptedKey level (cur/max): 0/1 
=== KeyReq: 
==== keyId: NULL 
==== keyType: 0x00000001 
==== keyUsage: 0xffffffff 
==== keyBitsSize: 0 
=== list size: 0 
== Signature Transform Ctx: 
== TRANSFORMS CTX (status=2) 
== flags: 0x00000000 
== flags2: 0x00000000 
== enabled transforms: all 
=== uri: NULL 
=== uri xpointer expr: NULL 
=== Transform: exc-c14n (href=http://www.w3.org/2001/10/xml-exc-c14n#) 
=== Transform: rsa-sha256 (href=http://www.w3.org/2001/04/xmldsig-more#rsa-sha256) 
=== Transform: membuf-transform (href=NULL) 
== Signature Method: 
=== Transform: rsa-sha256 (href=http://www.w3.org/2001/04/xmldsig-more#rsa-sha256) 
== Signature Key: 
== KEY 
=== method: RSAKeyValue 
=== key type: Private 
=== key usage: -1 
=== rsa key: size = 2048 
=== list size: 1 
=== X509 Data: 
==== Certificate: 
==== Subject Name: /C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/OU=Windows Store/CN=Windows Store Licensing 
==== Issuer Name: /C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/OU=Windows Store/CN=Windows Store Licensing 
==== Issuer Serial: 34FF982AF4A8F08540AE1961A6073FC6 
== SignedInfo References List: 
=== list size: 1 
= REFERENCE VERIFICATION CONTEXT 
== Status: succeeded 
== URI: "" 
== Reference Transform Ctx: 
== TRANSFORMS CTX (status=2) 
== flags: 0x00000000 
== flags2: 0x00000000 
== enabled transforms: all 
=== uri: NULL 
=== uri xpointer expr: NULL 
=== Transform: enveloped-signature (href=http://www.w3.org/2000/09/xmldsig#enveloped-signature) 
=== Transform: c14n (href=http://www.w3.org/TR/2001/REC-xml-c14n-20010315) 
=== Transform: sha256 (href=http://www.w3.org/2001/04/xmlenc#sha256) 
=== Transform: membuf-transform (href=NULL) 
== Digest Method: 
=== Transform: sha256 (href=http://www.w3.org/2001/04/xmlenc#sha256) 
== Manifest References List: 
=== list size: 0 

정확한 파일, 문자의 문자에 유효하다는 것을 기억하십시오. 형식을 지정하기위한 공백을 포함하여 파일을 변경하면 서명이 무효화됩니다. 나는 당신이 파일을 열었을 때 어떤 형식화가 진행되고 있다고 생각합니다. 어쩌면 그 형식화로 저장했을 것입니다.

편집

난 당신이 또한 receipt.xml을 위해 무엇을 게시에 닫는 태그가 없습니다 있다는 것을 잊어 버렸습니다. 나는 그것이 파일의 사본에 있다고 생각하지만, xmlsec1은 그렇게하지 않았다고 말했을 것이다. (나에게 말했듯이 나는 수동으로 추가해야했다.)

xmllint --noblanks --output receipt.xml receipt.xml을 시도하여 원하지 않는 공백과 CR/LF를 제거하십시오.

+0

작동합니다. 고마워요! – DrTyrsa

+0

Java 또는 xmlsec1을 사용하여 유효성 검사를 성공적으로 수행 한 후에 여기에 왔습니다. 이 솔루션이 정말 도움이된다는 사실을 알게되었습니다. 특히 샘플 페이지에서 Microsoft가 제공 한 XML 유효성 검사 코드는 대부분의 도구와 프레임 워크가 암시 적으로 공백을 필터링하지 않는 것처럼 보입니다 (!). 필자의 경우 모든 텍스트 노드에서 모든 공백을 제거 할 수 있었으며 (여기에 제공된 xmllint 호출과 비슷한 효과) 즉시 유효성 검사가 완료되었습니다. –