none
为了验证XML的签名需要安装证书吗? RRS feed

  • 问题

  • 我从服务器下载一个XML,里面的某些节点加密过,然后使用证书为该XML签名,现在我需要验证这个签名,我的Client需要安装该签名有的证书吗?我看到签名以后的数据里面些XML数据描述签名证书的信息,是不是有这些信息就能验证签名而不用单独安装证书?

    <

     

    KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">

    <

     

    EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">

    <

     

    EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />

    <

     

    KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">

    <

     

    X509Data>

    <

     

    X509Certificate>MIICQTCCAaqgAwIBAgIQchmqfzfPk4pOdhz+wpa1fzANBgkqhkiG9w0BAQQFADAtMSswKQYDVQQDHiIAWABNAEwAXwBFAE4AQwBfAFQARQBTAFQAXwBDAEUAUgBUMB4XDTA0MTIzMTE2MDAwMFoXDTA5MTIzMTE2MDAwMFowLTErMCkGA1UEAx4iAFgATQBMAF8ARQBOAEMAXwBUAEUAUwBUAF8AQwBFAFIAVDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAtuH2b5FzCF1jHL+CBNBZpYgiMqo19AoImlP+K2+Den1c5bU2j3w/WbhrShtvfmrsFJH+Penw/QePCyvzggTptwxofTsnQ/AvYZn1+XwfBOn82pMKmP0jGeRYgPwQCcShlOivawL8gO9znfnIsW1A+DG2SzTuW4AgedfyWEXGXJUCAwEAAaNiMGAwXgYDVR0BBFcwVYAQmtxGkNLn+TrCFZuOVepsiKEvMC0xKzApBgNVBAMeIgBYAE0ATABfAEUATgBDAF8AVABFAFMAVABfAEMARQBSAFSCEHIZqn83z5OKTnYc/sKWtX8wDQYJKoZIhvcNAQEEBQADgYEAXH5NeQ0kTGmAUY4BVw/nynwu1IUGIfHjrdmhle5BWKL7oDJd/9VZ7ebA7oqXbG4j83XFHg+AKY8UmkThv/LcPxSgjsoo2Hqe1UEivCCzD+J4c6nmoREoWidqI7StlTwskmqeEKLSGPZmh6WgSaQyYGGw/qJ5Vfmtv9o0J6dBrj0=</X509Certificate>

    </

     

    X509Data>

    </

     

    KeyInfo>

    <

     

    CipherData>

    <

     

    CipherValue>TYCbDOihN/Tw+rUMRMk22s+oq1I17paQyYb1D+BPnwqmipucEjSvqtLi9JNV8JdJGJZXqEtc2zEpt1Kzn3OPeuJ/xSx/v4+hJnNrdnxh0IErdWQD29/QxZE+3b1HNZ3cvSKT/uRm+0Nr9ryN4XauhdnZB2YyrkflMq59YhYLbOI=</CipherValue>

    </

     

    CipherData>

    </

     

    EncryptedKey>

    </

     

    KeyInfo>

    2009年7月17日 8:55

答案

  •  签名实际是对消息的签名,保证消息不被篡改。这里还有一个问题就是,你服务端接受到消息以后,除了验证消息没被修改意外,还要再次之前来鉴别用来签名的证书是否有效的问题。
       你服务端没有客户端证书的的验证机制,就无法对签名和消息进行验证。客户端证书里包含的只是一个非对称加密的公钥,服务端保留了一个私钥。这个私钥一般有CA证书管理机构管理。我个人认为需要。
       呵呵,除非你自己实现的,加密算法,公钥和私钥你都知道。否则服务端也应该有存放解密KEY的地方。
      以前也有讨论这个问题的帖子。你可以看看:
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年7月18日 3:33
    版主
  •     证书也是非对称加密的一种。密钥和公钥是分开的。这个和对称加密不同。证书的制作和管理是比较复杂的一个过程。
    每个证书里都包含公钥,用来加密信息,服务端使用对应的私钥来解密信息。为了保证信息不被传该,鉴别发送的客户端唯一,这里还是用了签名机制。
       如果你想避免麻烦,就直接使用。NET提供的加密类库。
      非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

        公钥加密:公钥加密使用一个必须对未经授权的用户保密的私钥和一个可以对任何人公开的公钥。公钥和私钥都在数学上相关联;用公钥加密的数据只能用私钥解密,而用私钥签名的数据只能用公钥验证,.NET 通过抽象基类 (System.Security.Crytography.AsymmetricAlgorithm) 提供下列非对称(公钥/私钥)加密算法:

    DSACryptoServiceProvider

    RSACryptoServiceProvider


       相对来说。非对称加密比对称加密安全,对称加密只有一个密钥,用来加密和解密。非对称的安全性较高。
    其他的概念你可以再msdn中查找这几个类的说明都有详细介绍,安全的概念可以参考:WSE3.0构建Web服务安全(2):非对称加密、公钥、密钥、证书、签名的区别和联系以及X.509 证书的获得和管理


    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年7月18日 3:37
    版主
  •  签名实际是对消息的签名,保证消息不被篡改。这里还有一个问题就是,你服务端接受到消息以后,除了验证消息没被修改意外,还要再次之前来鉴别用来签名的证书是否有效的问题。
       你服务端没有客户端证书的的验证机制,就无法对签名和消息进行验证。客户端证书里包含的只是一个非对称加密的公钥,服务端保留了一个私钥。这个私钥一般有CA证书管理机构管理。我个人认为需要。
       呵呵,除非你自己实现的,加密算法,公钥和私钥你都知道。否则服务端也应该有存放解密KEY的地方。
      以前也有讨论这个问题的帖子。你可以看看:
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com

    当时在WCF板块,已经提出了两个相关的问题,当时的讨论也很详细:
    1.到此一游在WCF提出了:关于x.509数字证书的问题:http://social.microsoft.com/Forums/zh-CN/wcfzhchs/thread/34f10b1a-dede-4e4c-aa35-25fb4a655185
     2.WYSSoft提出的: 在不使用证书的情况下,哪种方式能取得比较好的信息加密效果呢?:http://social.microsoft.com/Forums/zh-CN/wcfzhchs/thread/9a525136-fae1-4abb-933c-8da89654509e
       你可以看看,应该能对你的问题理解有帮助。

    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年7月18日 3:41
    版主

全部回复

  •  签名实际是对消息的签名,保证消息不被篡改。这里还有一个问题就是,你服务端接受到消息以后,除了验证消息没被修改意外,还要再次之前来鉴别用来签名的证书是否有效的问题。
       你服务端没有客户端证书的的验证机制,就无法对签名和消息进行验证。客户端证书里包含的只是一个非对称加密的公钥,服务端保留了一个私钥。这个私钥一般有CA证书管理机构管理。我个人认为需要。
       呵呵,除非你自己实现的,加密算法,公钥和私钥你都知道。否则服务端也应该有存放解密KEY的地方。
      以前也有讨论这个问题的帖子。你可以看看:
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年7月18日 3:33
    版主
  •     证书也是非对称加密的一种。密钥和公钥是分开的。这个和对称加密不同。证书的制作和管理是比较复杂的一个过程。
    每个证书里都包含公钥,用来加密信息,服务端使用对应的私钥来解密信息。为了保证信息不被传该,鉴别发送的客户端唯一,这里还是用了签名机制。
       如果你想避免麻烦,就直接使用。NET提供的加密类库。
      非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

        公钥加密:公钥加密使用一个必须对未经授权的用户保密的私钥和一个可以对任何人公开的公钥。公钥和私钥都在数学上相关联;用公钥加密的数据只能用私钥解密,而用私钥签名的数据只能用公钥验证,.NET 通过抽象基类 (System.Security.Crytography.AsymmetricAlgorithm) 提供下列非对称(公钥/私钥)加密算法:

    DSACryptoServiceProvider

    RSACryptoServiceProvider


       相对来说。非对称加密比对称加密安全,对称加密只有一个密钥,用来加密和解密。非对称的安全性较高。
    其他的概念你可以再msdn中查找这几个类的说明都有详细介绍,安全的概念可以参考:WSE3.0构建Web服务安全(2):非对称加密、公钥、密钥、证书、签名的区别和联系以及X.509 证书的获得和管理


    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年7月18日 3:37
    版主
  •  签名实际是对消息的签名,保证消息不被篡改。这里还有一个问题就是,你服务端接受到消息以后,除了验证消息没被修改意外,还要再次之前来鉴别用来签名的证书是否有效的问题。
       你服务端没有客户端证书的的验证机制,就无法对签名和消息进行验证。客户端证书里包含的只是一个非对称加密的公钥,服务端保留了一个私钥。这个私钥一般有CA证书管理机构管理。我个人认为需要。
       呵呵,除非你自己实现的,加密算法,公钥和私钥你都知道。否则服务端也应该有存放解密KEY的地方。
      以前也有讨论这个问题的帖子。你可以看看:
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com

    当时在WCF板块,已经提出了两个相关的问题,当时的讨论也很详细:
    1.到此一游在WCF提出了:关于x.509数字证书的问题:http://social.microsoft.com/Forums/zh-CN/wcfzhchs/thread/34f10b1a-dede-4e4c-aa35-25fb4a655185
     2.WYSSoft提出的: 在不使用证书的情况下,哪种方式能取得比较好的信息加密效果呢?:http://social.microsoft.com/Forums/zh-CN/wcfzhchs/thread/9a525136-fae1-4abb-933c-8da89654509e
       你可以看看,应该能对你的问题理解有帮助。

    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年7月18日 3:41
    版主
  • 我的项目里Server使用了数字证书给发送给客户端的数据进行了签名,也就是Signed Packet,这个Packet在Client端需要验证签名。我发现我们在Client上删除了数字证书,我们的签名也能通过,我们的数字签名验证使用的是CryptVerifyDetachedMessageSignature函数,我们知道证书的Thumbprint,将它hardcode到我们的代码里,然后这个函数返回了Packet的Thumbprint,对比两个Thumbprint一致。

    这么说签名过后的Packet里面已经包含了验证签名证书的所有信息?我在安装Client的时候是不是需要安装证书呢?
    2009年7月21日 10:06
  • 我的项目里Server使用了数字证书给发送给客户端的数据进行了签名,也就是Signed Packet,这个Packet在Client端需要验证签名。我发现我们在Client上删除了数字证书,我们的签名也能通过,我们的数字签名验证使用的是CryptVerifyDetachedMessageSignature函数,我们知道证书的Thumbprint,将它hardcode到我们的代码里,然后这个函数返回了Packet的Thumbprint,对比两个Thumbprint一致。

    这么说签名过后的Packet里面已经包含了验证签名证书的所有信息?我在安装Client的时候是不是需要安装证书呢?

    理解你的意思了,如果Packet里面已经包含了验证签名证书的所有信息,其实也间接的等于是一个证书了,关键是包含加密和解密对应的key就可以了。你说的函数我没接触过,如果你客户端已经有个地方持有了有效的key,可以不适用证书,但是验证解密的过程可能需要你重新实现了。
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年7月21日 12:21
    版主