天道酬勤,学无止境

向 CMS 签名数据添加证书(Adding Certificates to CMS Signed Data)

问题

我目前正在使用 java Bouncy Castle 库来创建 CMS 签名数据(或 PKCS7 签名数据)。 然而,我似乎坚持添加证书(即使正确添加了证书签名者)。

我检查了这个关于正确签署数据的问题,但它没有响应我的 SCEP 服务器的需求。 我使用的代码来自 EJBCA,但似乎没有向 PKCS7 签名数据添加证书。

当我使用openssl cms工具解析签名数据时,我看到“证书”字段是“EMPTY”。 此外,当我尝试使用openssl pkcs7 [...] -print_certs打印证书时,我一无所获。

以下是我使用 Bouncy Castle 签署数据的方式(代码很多,但足以重现问题):

CMSEnvelopedDataGenerator edGen = new CMSEnvelopedDataGenerator();
CMSTypedData msg;
List<X509Certificate> certList = new ArrayList<>();
// Make sure the certificate is not null
if (this.certificate != null) {
    certList.add((X509Certificate) this.certificate);
}

/**
* Create the signed CMS message to be contained inside the envelope
* this message does not contain any message, and no signerInfo
**/
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
Collection<JcaX509CertificateHolder> x509CertificateHolder = new ArrayList<>();
try {
    for (X509Certificate certificate : certList) {
        x509CertificateHolder.add(new JcaX509CertificateHolder(certificate));
    }
    CollectionStore<JcaX509CertificateHolder> store = new CollectionStore<>(x509CertificateHolder);
    gen.addCertificates(store);
} catch (Handle all exceptions) {}

上面的这段代码通常应该添加证书。 我从 EJBCA 那里得到了这个。

以下是我完成签名数据的方法:

CMSSignedDataGenerator gen1 = new CMSSignedDataGenerator();
// I add ALL of my attributes here
// Once they're added...
Certificate caCert = this.caCertificate;
try {
    String provider = BouncyCastleProvider.PROVIDER_NAME;
    ContentSigner contentSigner = new JcaContentSignerBuilder(signatureAlgorithmName).
            setProvider(provider).
            build(signerKey);
    JcaDigestCalculatorProviderBuilder calculatorProviderBuilder = new JcaDigestCalculatorProviderBuilder().
            setProvider(provider);
    JcaSignerInfoGeneratorBuilder builder = new JcaSignerInfoGeneratorBuilder(calculatorProviderBuilder.build());
    builder.setSignedAttributeGenerator(new DefaultSignedAttributeTableGenerator(new AttributeTable(attributes)));
    gen1.addSignerInfoGenerator(builder.build(contentSigner, (X509Certificate) ca));
} catch (Handle all exceptions) {}

// Create the signed data
CMSSignedData sd = gen1.generate(msg, true);
byte[] results = sd.getEncoded();

字节数组结果是 DER 格式的 PKCS7 签名数据......但没有添加证书。

我错过了什么吗? 感谢您的帮助!

回答1

CMSSignedDataGenerator gen1必须明确添加证书,这是我不知道的。

它可以简单地通过以下方式完成:

  • 将证书添加到X509Certificates List中;
  • 将该List转换为JcaX509CertificateHolderCollection
  • 将此集合添加到JcaX509CertificateHolderCollectionStore中;
  • 添加存储CMSSignedDataGenerator

代码示例:

 CMSSignedDataGenerator gen1 = new CMSSignedDataGenerator();
 List<X509Certificate> certificates = new ArrayList<>();

 // I chose to add the CA certificate
 certificates.add((X509Certificate) this.caCertificate);

 // In this case, this is a certificate that I need to add
 if (this.certificate != null)
     certificates.add((X509Certificate) this.certificate);

 // This is the recipient certificate
 if (this.recipientCert != null)
     certificates.add((X509Certificate) this.recipientCert);
 Collection<JcaX509CertificateHolder> x509CertificateHolder = new ArrayList<>();

 // Of course, we need to handle the exceptions...
 for (X509Certificate certificate : certificates) {
     x509CertificateHolder.add(new JcaX509CertificateHolder(certificate));
 }
 CollectionStore<JcaX509CertificateHolder> store = new CollectionStore<>(x509CertificateHolder);

// The final stage.
 gen1.addCertificates(store);

希望这对未来的任何人都有帮助。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 使用充气城堡验证签名(Verify a signature with bouncy castle)
    问题 我使用已弃用的 bouncycastle API 继承了一些代码。 在将它更新到新 API 之前,我想编写一个测试来验证我没有改变它的行为。 但是,我无法找出验证生成的此签名的正确方法。 要更改的代码是: public static byte[] createSignedData(byte[] content, X509Certificate cert, PrivateKey key) throws NoSuchAlgorithmException, NoSuchProviderException, CMSException, IOException { // set up the generator CMSSignedDataGenerator gen = new CMSSignedDataGenerator(); gen.addSigner(key, cert, CMSSignedGenerator.DIGEST_SHA1); // create the signed-data object CMSProcessable data = new CMSProcessableByteArray(content); CMSSignedData signed = gen.generate(data, BC_PROVIDER); return signed.getEncoded()
  • 无法使用 Apache PDFBOX 验证数字签名(Unable to verify digital signature using Apache PDFBOX)
    问题 我是使用数字签名的新手。 在其中一个项目中,我们使用 Apache PdfBox 来处理数字签名的 pdf 文件。 虽然我们可以测试所有功能,但我们无法破解签名 pdf 文件的验证。 我们使用 BouncyCastle 作为提供者。 下面是代码: //从pdf文件中获取数字签名和签名内容 byte[] signatureAsBytes = pdsignature.getContents(new FileInputStream(this.INPUT_FILE)); byte[] signedContentAsBytes = pdsignature.getSignedContent(new FileInputStream(this.INPUT_FILE)); //数字签名验证 Security.addProvider(new BouncyCastleProvider()); Signature signer = Signature.getInstance("RSA","BC"); //Get PublicKey from p7b file X509Certificate cert509=null; File file = new File("C:\\certificate_file.p7b"); FileInputStream fis = new FileInputStream
  • 使用OpenSSL进行数字签名验证(Digital signature verification with OpenSSL)
    问题 如何在Ruby中使用OpenSSL验证CMS / PKCS#7消息? PKCS#7消息用作用户消息的数字签名,因此我需要对新的用户消息进行签名并验证传入的消息。 在文档和Google中,我没有发现任何帮助。 我发现很少有用于签名的代码示例,但没有用于验证的示例: signed = OpenSSL::PKCS7::sign(crt, key, data, [], OpenSSL::PKCS7::DETACHED) 回答1 简短答案 假设所有内容均按您的代码段中的定义进行了定义,并具有分离的签名,没有到受信任的根的证书链,证书crt ,签名的signed和数据data ,则应执行以下操作: store = OpenSSL::X509::Store.new p7 = OpenSSL::PKCS7.new(signed.to_der) verified = p7.verify([crt], store, data, OpenSSL::PKCS7::DETACHED || OpenSSL::PKCS7::NOVERIFY) (我尚未对此进行测试,YMMV) 全文 这是我如何找到它的完整故事,并带有指向我使用过的所有资源的链接,因此,如果您需要更多信息,可以找个地方看看。 看一下OpenSSL :: PKCS7文档,我们发现了这一点智慧: PKCS7.new => pkcs7 PKCS7
  • 验证RFC 3161可信时间戳(Verify RFC 3161 trusted timestamp)
    问题 在我的构建过程中,我想包括一个符合RFC-3161的TSA的时间戳。 在运行时,代码将验证此时间戳​​,最好在没有第三方库帮助的情况下。 (这是一个.NET应用程序,因此我可以随时使用标准的哈希和非对称密码功能。) RFC 3161依赖于ASN.1和X.690之类的东西,实现起来并不容易,因此至少现在,我正在使用Bouncy Castle生成TimeStampReq(请求)并解析TimeStampResp(响应)。 我只是不太清楚如何验证响应。 到目前为止,我已经弄清楚了如何提取签名本身,公共证书,创建时间戳的时间以及我发送的消息烙印摘要和随机数(用于构建时验证)。 我不知道如何将这些数据放在一起以生成经过哈希处理和签名的数据。 这是我正在做的事情和正在尝试做的事情的粗略想法。 这是测试代码,因此我采取了一些捷径。 我必须清理几件事情,并在我得到可行的东西后以正确的方式进行处理。 在构建时生成时间戳: // a lot of fully-qualified type names here to make sure it's clear what I'm using static void WriteTimestampToBuild(){ var dataToTimestamp = Encoding.UTF8.GetBytes("The rain in Spain falls
  • 如何检查 SignedCms 信封的签名?(How can I check signature of a SignedCms envelope?)
    问题 我真的不明白如何处理 PKCS#7 消息。 我用我拥有的 X509Certificate2 签署了一些字节数组,并获得了一个字节数组。 byte[] data = new byte[5] { 110, 111, 112, 113, 114 }, signedData; X509Certificate2 cert = new X509Certificate2(certPath, password); ContentInfo content = new ContentInfo(data); SignedCms envelope = new SignedCms(content); CmsSigner cmsSigner = new CmsSigner(cert); envelope.ComputeSignature(cmsSigner); signedData = envelope.Encode(); signedData 被传输到某个远程接收者,他得到 SignedCms 信封。 SignedCms envelope = new SignedCms(); envelope.Decode(signedData); 他怎么能解码信封? 他没有将我的公钥作为参数传递。 信封里有我的公钥,在 SignerInfo 属性中,但是有什么原因吗,因为任何人都可以用整个签名替换它?
  • CMS 签名 - 时间戳和反签名有什么区别(CMS Signature - What is the difference Time Stamp & Counter Signature)
    问题 我正在尝试使用 BouncyCastle 在 C# 中对数字签名(带有本地时间戳证书)进行时间戳。 我对TimeStamp的理解是对当前时间进行签名。 不确定是否应该是当前时间+原始签名内容? 请在这方面也提供帮助。 我的主要困惑是是否将生成的时间戳添加到原始签名的 Singed/Unsigned 属性中。 或者它会被添加为一个 CounterSignature? 回答1 时间戳的目标是证明签名是在给定时间之前创建的,因此使用时间戳必须对数字签名和当前时间进行签名。 时间戳必须作为未签名属性添加到 CMS 签名中。 除了 SignatureTimeStampToken 本身就是一个签名。 要将时间戳添加到 CMS,您可以使用具有 1.2.840.113549.1.9.16.2.14 对象标识符和 ASN.1 类型的签名时间戳属性(以下信息均从 CMS 和 TSP RFC 中提取) SignatureTimeStampToken ::= TimeStampToken TimeStampToken ::= ContentInfo -- contentType is id-signedData ([CMS]) -- content is SignedData ([CMS]) SignedData ::= SEQUENCE { version CMSVersion
  • Adding Certificates to CMS Signed Data
    I am currently using the java Bouncy Castle libraries in order to create CMS signed data (or PKCS7 signed data). I seem however to be stuck with adding certificates (even though the certificate signer is properly added). I checked out this question about properly signing data, but it didn't respond the needs of my SCEP server. The code I used was from EJBCA but doesn't seem to add certificates to the PKCS7 signed data. When I parse the signed data with the openssl cms tool, I see that the "certificates" field is "EMPTY". Additionally, when I try to the print the certs with openssl pkcs7 [...]
  • 具有强大私钥保护的分离式 PKCS#7 CMS(Detached PKCS#7 CMS With Strong Private Key Protection)
    问题 我需要生成一个 PKCS#7/CMS 分离签名,而且我知道我可以通过这种方式轻松完成: byte[] data = GetBytesFromFile(cheminFichier); X509Certificate2 certificate = null; X509Store my = new X509Store(StoreName.My,StoreLocation.CurrentUser); my.Open(OpenFlags.ReadOnly); X509Certificate2Collection certColl = X509Certificate2UI.SelectFromCollection(my.Certificates, "Test" , "Choose a certificate" , X509SelectionFlag.SingleSelection); certificate = certColl[0]; if (certificate == null) throw new Exception("No certificates found."); //byte [] pfxFile = certificate.Export(X509ContentType.Pfx); //X509Certificate2 certPfx = new
  • Java中带有时间戳的数字签名(Digital signature with timestamp in Java)
    问题 我在使用受信任的时间戳与Bouncy Castle创建有效的CMS签名时遇到问题。 签名创建效果很好(我想将签名包括到PDF文件中),签名有效。 但是,当我在签名的未签名属性表中添加可信时间戳后,签名仍然保持有效,但是Reader会报告该签名包括一个嵌入式时间戳,但它是无效的。 这使我相信,哈希时间戳是不正确的,但是我似乎无法弄清楚问题出在哪里。 签名代码: Store store = new JcaCertStore(Arrays.asList(certContainer.getChain())); CMSSignedDataGenerator signedDataGenerator = new CMSSignedDataGenerator(); JcaSignerInfoGeneratorBuilder infoGeneratorBuilder = new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build()); JcaContentSignerBuilder contentSignerBuilder = new JcaContentSignerBuilder("SHA1withRSA"); signedDataGenerator
  • 如何在Dockerfile中为LDAPS向Jenkins添加SSL自签名证书?(How to add a SSL self-signed cert to Jenkins for LDAPS within Dockerfile?)
    问题 我想在Jenkins的安全性下启用LDAPS,但是我的LDAP服务器具有自签名的CERT。 有没有人做过或对此有一些指示? 我必须使用keytool吗? 在我的Dockerfile中,我正在尝试以下操作,但这不起作用: FROM jenkins USER root # Install CA certs COPY ca-certificates.crt /etc/ssl/certs/ca-certificates.crt RUN chmod +r /etc/ssl/certs/ca-certificates.crt # Install the Jenkins plugin COPY plugins.txt /usr/share/jenkins/plugins.txt RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt # Expose container port 33838 for Jenkins UDP-based auto-discovery EXPOSE 33848/udp ENV JAVA_OPTS -Xmx2048m 回答1 事实证明,我只需要在Dockerfile中添加此文件,其中ldap.cer是我的自签名证书的证书链。 COPY ldap.cer $JAVA_HOME/jre/lib
  • 使用iTextSharp 5.3.3和USB令牌签名PDF(Sign PDF with iTextSharp 5.3.3 and USB token)
    问题 我是iTextSharp(和StackOverFlow)的新手。 我正在尝试使用外部USB令牌在C#中签名PDF。 我尝试使用从互联网上获取的以下代码。 Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser(); //Get Sertifiacte X509Certificate2 certClient = null; X509Store st = new X509Store(StoreName.My, StoreLocation.CurrentUser); st.Open(OpenFlags.MaxAllowed); X509Certificate2Collection collection = X509Certificate2UI.SelectFromCollection(st.Certificates, "Please choose certificate:", "", X509SelectionFlag.SingleSelection); if (collection.Count > 0){ certClient = collection[0]; } st.Close(); //Get Cert Chain IList<Org
  • SSL 握手失败 - 一个 verisign 链证书 - 包含两个 CA 签名证书和一个自签名证书(SSL handshake fails with - a verisign chain certificate - that contains two CA signed certificates and one self-signed certificate)
    问题 我遇到了一个问题并试图调试它。 我们购买了威瑞信证书。 当我们使用: openssl> s_client -connect myweb.com:443 -showcerts SSL 握手永远不会完成,最后我们看到错误: Verify return code: 19 (self signed certificate in certificate chain) 它显示了 3 个---BEGIN/END CERTIFICATE---标签。 链中的两个证书是 Verisign 签名的,但一个是自签名的。 如果有人可以请解释这个自签名证书如何出现在 CA 签名证书中? 这个错误19 (self signed certificate in certificate chain)良性的吗? 如果不是,可能是什么原因造成的? 客户端在受信任的存储中拥有 CA 证书,但自签名证书没有任何内容。 你认为这会导致问题吗? 如果是,我该如何: 如何从链证书中删除自签名证书,只留下链中的 2 个 CA 签名证书? 在客户端受信任的存储中添加此自签名证书? 回答1 CA 颁发的根证书只是自签名证书(反过来又可用于颁发中间 CA 证书)。 它们没有什么特别之处,除了它们已经设法在许多浏览器或操作系统信任锚中默认导入。 虽然浏览器和一些工具默认配置为在位置查找受信任的 CA 证书(其中一些可能是自签名的)
  • 带有自签名证书的 Python 3 urllib(Python 3 urllib with self-signed certificates)
    问题 我正在尝试使用 Python 从内部服务器下载一些数据。 由于它是内部的,因此它使用自签名证书。 (我们不想为永远不会出现在“野外”的服务器向 Verisign 支付费用。)代码的 Python 2.6 版本运行良好。 response = urllib2.urlopen(URL) data = csv.reader(response) 我现在正在尝试更新到 Python 3.4(长话短说,不要问。)但是,使用 Python 3 的 urllib 失败: response = urllib.request.urlopen(URL) 它会引发 CERTIFICATE_VERIFY_FAILED 错误。 urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)> 在网上阅读时,显然 Python 2.6 urllib2 不费心去验证证书。 某些版本的 urllib 允许将“verify=False”传递给方法签名,但这在 Python 3.4 中似乎不起作用。 有谁知道我该如何解决这个问题? 由于公司安全准则,我想避免使用 Requests 包。 回答1 urllib.request.urlopen有一个接受
  • 如何使用Windows Cert Store中的证书签署PDF文档?(How do I sign a PDF document using a certificate from the Windows Cert Store?)
    问题 我需要使用Windows证书存储中存在的证书签署PDF文档。 我整天都在努力地想办法解决这个问题,但我距离我很近,但又很遥远。 缺少的是:如何获得IExternalSignature对象来签署PDF文件? Rahul Singla写了一个漂亮的示例,说明了如何使用新的iText 5.3.0 API签名PDF文档-只要您可以访问PC上某个地方的.pfx文件即可。 关于使用Windows Cert Store中的证书进行签名的先前问题是,它使用的API版本仍然存在SetCrypto ,并且签名显然是可选的,但以前的问题。 在iText 5.3.0中,API已更改,并且SetCrypto不再是一回事。 到目前为止,这是我所拥有的(后代添加了注释,因为这可能是'net上这样做的最完整且最新的版本): using iTextSharp.text.pdf; using iTextSharp.text.pdf.security; using BcX509 = Org.BouncyCastle.X509; using Org.BouncyCastle.Pkcs; using Org.BouncyCastle.Crypto; using DotNetUtils = Org.BouncyCastle.Security.DotNetUtilities; ... // Set up the PDF
  • WinRT 中是否有 SignedCMS 的替代方案?(Is there an alternative of SignedCMS in WinRT?)
    问题 在将 .NET 桌面应用程序移植到 Windows 应用商店应用程序时,我再次遇到了麻烦……长话短说,我有一个 ZIP 文件,其中包含一个加密和签名的 XML 文件以及一个证书。 解密工作(或多或少),但现在我必须“取消签名”XML,我被卡住了。 在 .NET 应用程序中,取消签名是使用 System.Security.Cryptography.Pkcs.SignedCms 完成的,但 WinRt 中不存在该类(一如既往......) WinRT 中有其他选择吗? 以下是 .NET 应用程序中使用的一些代码: public static byte[] CheckAndRemoveSignature(byte[] data, X509Certificate2Collection certStore, out SignedCms out_signature) { SignedCms signedMessage = new SignedCms(); signedMessage.Decode(data); if ((certStore != null) && (certStore.Count > 0)) signedMessage.CheckSignature(certStore, true); else signedMessage.CheckSignature(true); out
  • 将 CA 签名证书导入 JKS(Import CA signed certificates to JKS)
    问题 我从 CA 获得了 4 个.crt文件,如下所示, AddTrustExternalCARoot.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt demo_site_domain.crt 第二和第三是中级证书。 我想将 .crt 文件导入 wso2carbon.jks 存储并将其替换为 wso2 服务器的现有 jks,如此处所述。 我的问题是,文档想要wso2carbon作为别名,但我只能使用该别名导入一个证书,因此我应该导入哪个 .crt 文件? 或者我应该导入一个由以上四个 crt 文件创建的复合 .crt 文件(可能吗?)我尝试使用AddTrustExternalCARoot.crt和demo_site_domain.crt但在我在 wso2 服务器中设置了 .jks 文件后,服​​务器 url 给出以下错误, 安全连接失败加载页面时,与 ip:port 的连接中断。 The page you are trying to view cannot be shown because the authenticity of the received data could not be verified. Please contact the website owners to
  • 使用外部服务和iText对PDF进行签名(Sign PDF using an external service and iText)
    问题 我有这种情况。 我有一个生成PDF的应用程序,需要签名。 我们没有用于签署文档的证书,因为它们在HSM中,并且唯一可以使用证书的方法是使用Web服务。 此Web服务提供两个选项,发送PDF文档,并返回签名的pdf,或发送将被签名的哈希。 第一个选项不可行,因为PDF签名时没有时间戳(这是非常重要的必要条件),因此选择了第二个选项。 这是我们的代码,首先,我们获得签名外观,并计算哈希值: PdfReader reader = new PdfReader(Base64.decode(pdfB64)); reader.setAppendable(true); baos = new ByteArrayOutputStream(); PdfStamper stamper = PdfStamper.createSignature(reader, baos, '\0', null, true); appearance = stamper.getSignatureAppearance(); appearance.setCrypto(null, chain, null, PdfSignatureAppearance.SELF_SIGNED); appearance.setVisibleSignature("Representant"); cal = Calendar.getInstance()
  • PDF签名摘要(PDF Signature digest)
    问题 我有一个关于计算要用于数字签名的PDF文档摘要的快速问题(与我之前的问题之一有关,我试图弄清楚为什么您需要知道客户的证书才能创建正确的摘要) )。 在Adobe有关PDF格式的文档中,指定了以下内容: 字节范围摘要应在文件的字节范围内计算,该范围应由签名字典中的ByteRange条目指示。 此范围应该是整个文件,包括签名字典,但不包括签名值本身(“内容”条目)。 因此,在这一点上,事情似乎相当简单,只需消化/ Sig词典中/ Contents条目以外的所有内容。 / Contents条目中的实际数据指定如下: 对于公共密钥签名,内容应为DER编码的PKCS#1二进制数据对象或DER编码的PKCS#7二进制数据对象。 因此,仍然没有问题,我可以(可能)生成摘要,为/ Contents条目保留空间,并在以后附加此PKCS#7对象。 当我阅读以下内容时,混乱就开始了: 吊销信息是已签名的属性,这意味着签名软件必须在签名之前捕获吊销信息。 类似的要求也适用于证书链。 签名软件必须在签名之前捕获并验证证书的链。 所以我不太了解:显然/ Contents条目(包含证书和已签名的摘要)没有被摘要,但是证书链是一个已签名的属性(因此需要被摘要吗?)。 如果有人可以进一步明确说明要消化的内容,并且也许可以更好地向我解释已签名的属性,我将不胜感激。 我要回答的主要问题是
  • 在 MimeKit 上签名和加密(Sign and Encrypt on MimeKit)
    问题 我被要求向我们的客户发送签名和加密的邮件,但是,这是我第一次与签名和加密的斗争(我想强调这一点)。 我尝试过使用 OpaqueMail 和 MimeKit。 因为我真的不太了解 OpaqueMail,而且我有自己的客户端来检索电子邮件,所以我发现理解和实现 MimeKit 更好。 我知道这是我在以下几行中所做的基本实现,但这只是与它的第一次接触,只是一个测试。 我可以发送带有加密正文的签名电子邮件,问题来自附件(我们只是发送了带有附件文件的空正文,该附件来自数据库)。 try { X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly); X509Certificate2Collection collection = store.Certificates.Find(X509FindType.FindBySubjectName, "senderEmail@something.com", false); //TODO Change to true after test X509Certificate2 senderCertificate = collection[0]; store = new X509Store
  • 七、recovery ota升级包签名生成/校验
    最近一直有两个疑问 升级包签名的规则和签名文件具体的位置,所以大概看了下签名流程并整理出来 大概理解了下 1.如何签名 2.如何校验 一.相关整理 首先要大概知道的两个内容 1.CMS数字签名 参考:https://www.ibm.com/developerworks/cn/java/j-lo-cms-ticketbasesso/ 大概理解为 签名阶段:取数据的hash 使用私钥进行加密放入签名部分, 签名部分+数据部分 组合为新的zip 校验阶段:取出数据的hash,使用公钥对签名部分的加密hash进行解密,解密后的hash和数据的hash进行对比 2.zip文件的结构 参考:http://blog.sina.com.cn/s/blog_c496a6310102wje4.html 这里主要理解以下其中的End of central directory record 二.生成签名 做升级包的流程还是从ota_from_target_files ,这部分略过,直接从签名开始分析,传入的什么参数 最后的签名命令为: java -Djava.library.path=out/host/linux-x86/lib64 -jar out/host/linux-x86/framework/signapk.jar -w device/mediatek/security/releasekey