当前位置: 首页 > 知识库问答 >
问题:

验证分离的签名(*.p7s文件)和X509Certificate2

阙佐
2023-03-14
<Document>
    <ZipContainer> Zip_File_In_Base64 </ZipContainer>
    <X509Certificate> Certificate_In_Base64 </X509Certificate>
</Document>

>

  • 文件,将ZIP文件的内容描述为XML(文件packagedescription.XML);

    包含传输文档内容的文件(例如,*.doc文件);

    具有分离数字签名内容的文件(*.p7s文件-分离数字签名);

    >

  • 方法SignatureValidator(请参阅下面的此方法)当前未使用文件.p7s的分离签名。我确实试过了,但没有成功。如何正确验证.p7s文件对应文件的分离签名?

    在方法CertificateValidator(请参阅下面的方法)中,如何验证从.p7s文件中提取的证书与从Base64格式的输入字符串中提取的证书的一致性?

    代码行foreach(X509Certificate2 x509 in SignCMS.Certificates){}-->Certificates集合始终为空。为什么?

    >

  • dictionary dictp7sfiles (key-文件的名称*.p7s,value-字节数组,表示*.p7s文件)

    dictionary dictnotp7sfiles (键-使用与*.p7s文件分离的签名进行签名的文件的名称,值-字节数组,表示文件)

    X509Certificate2 UserCertX509-证书对象,从输入XML文档中提取(其格式为Base64)

    下面是验证步骤的测试实现(参见上面这2个步骤):

    private bool certificateValidator(Dictionary<string, byte[]> dictP7SFiles, 
        Dictionary<string, byte[]> dictNotP7SFiles, X509Certificate2 userCertX509)
    {
      bool isValid = false;           
      try
      {               
        foreach (KeyValuePair<string, byte[]> pair in dictP7SFiles)
        {
          ContentInfo contentInfo = new ContentInfo(pair.Value);
          SignedCms signCms = new SignedCms(contentInfo, true);                   
    
          if (signCms.Certificates.Count != 0)
          {
            //Certificates Collection always is empty. Why?
            foreach (X509Certificate2 x509 in signCms.Certificates)
            {
              if ((x509.SerialNumber != userCertX509.SerialNumber) 
                  || (x509.Thumbprint != userCertX509.Thumbprint))
              {
                isValid = false;
                return isValid;
              }
            }
    
            isValid = true;
            return isValid;
          }
        }
      }
      catch (Exception ex)  
      {
        //here process exception code
      }           
    
      return isValid;
    }
    
    
    
    private bool signatureValidator(Dictionary<string, byte[]> dictP7SFiles, 
        Dictionary<string, byte[]> dictNotP7SFiles, X509Certificate2 userCertX509)
    {
      bool isValid = false;
      try
      {              
        byte[] data = dictP7SFiles["ZayavUL_3594c921f545406d9b8734bbe28bf894.doc"];
        byte[] publicKey;
        byte[] signature;
        object hasher = SHA1.Create(); // Our chosen hashing algorithm.
        // Generate a new key pair, then sign the data with it:
        using (var publicPrivate = new RSACryptoServiceProvider())
        {
          signature = publicPrivate.SignData(data, hasher);
          publicKey = publicPrivate.ExportCspBlob(false); // get public key
        }
        // Create a fresh RSA using just the public key, then test the signature.
        using (var publicOnly = new RSACryptoServiceProvider())
        {
          publicOnly.ImportCspBlob(publicKey);
    
          isValid = publicOnly.VerifyData(data, hasher, signature); // Return True
    
          //isValid = ByteArrayCompare(dictP7SStreams["ZayavUL_3594c921f545406d9b8734bbe28bf894.doc_1.p7s"], signature);
    
          byte[] p7sDetachedSignature = File.ReadAllBytes(@"D:\ZayavUL_3594c921f545406d9b8734bbe28bf894.doc_1.p7s");
          isValid = ByteArrayCompare(p7sDetachedSignature, signature);
        }                
      }
      catch (Exception)
      {
        //here process exception code
      }
    
      return isValid;    
    }
    
  • 共有1个答案

    鄢晔
    2023-03-14

    您做错的主要事情是重新生成CMS和签名。您应该解析CMS消息,然后在验证期间指明外部内容。

    1. 如何正确验证.p7s文件的分离签名,以获取相应的文件?

    看看下面SO上的Java代码,看看如何验证签名;C#应该使用相同的体系结构,因此它应该以类似的方式工作。

     类似资料:
    • 是否可以验证带有p7s分离签名的文件?我正试图使用Openssl实现这一点,但我得到了一条关于Openssl的默认消息和 这是我的命令: 是否可以使用openssl进行文件验证和p7s签名? --编辑。。。 只是想让你知道。我有一个p7s文件和一个pdf文件。我想知道如何验证这一点。

    • 我试图用OpenSSL验证一个PE文件的证书/签名(或者实际上用Python,但是看起来Python在证书处理方面很糟糕)。 我已从PE文件中提取了DER PKCS7证书,如下所述:http://blog.didierstevens.com/2008/01/11/the-case-of-the-missing-digital-signatures-tab/ 我已经创建了一个没有校验和和签名数据的P

    • 我正在编写一个接收PKCS7数据(从签名的PDF文档中提取)的服务,并需要对其进行验证。 我使用iText7 PdfPKCS7进行验证,但签名验证总是失败。我可以从PKCS7读取所有其他信息(证书、时间戳等,我也用OpenSSL验证了这一点)。只有签名显示为无效。 下面是测试案例: 输出总是: 我想我在进口方面做错了什么,但就是找不到什么... 顺便说一句,验证其他pdf工具(Adobe DC、P

    • 我想使用BouncyCastle解析和验证OpenPGP分离签名。签名如下所示: 下面是我如何尝试在Kotlin中创建CMSSignedData: 我应该如何使用BouncyCastle验证这种签名?

    • 介绍 Hutool针对java.security.Signature做了简化包装,包装类为:Sign,用于生成签名和签名验证。 对于签名算法,Hutool封装了JDK的Signature,具体介绍见:https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html: // The RSA signa

    • 问题内容: 我正在尝试以编程方式验证jar文件是否未被明显篡改。我有2个要防止的用例。1)修改现有类2)在罐子中添加新类 我使用jarsigner签名了罐子。当我用jarsigner验证以上两种情况之一时,它的工作方式就与我期望的一样。 当我尝试使用如何以编程方式验证用jarsigner签名的jar 或如何通过自签名的jar验证签名中的示例以编程方式进行操作时 ?但是,我没有任何SecurityE