C# 如何在没有完整X509证书的情况下使用PdfPkcs7?
我们正在尝试通过移动签名服务对PDF进行外部签名。Stackoverflow中有很多关于这个主题的问题,特别是来自土耳其的问题。请参阅:。这里也一样 我们要求MSSP提供个人资料信息。由于有关个人数据保护的法律,我们无法检索签名者的完整公共证书或链 配置文件查询服务的响应:C# 如何在没有完整X509证书的情况下使用PdfPkcs7?,c#,.net-core,itext7,pkcs#7,C#,.net Core,Itext7,Pkcs#7,我们正在尝试通过移动签名服务对PDF进行外部签名。Stackoverflow中有很多关于这个主题的问题,特别是来自土耳其的问题。请参阅:。这里也一样 我们要求MSSP提供个人资料信息。由于有关个人数据保护的法律,我们无法检索签名者的完整公共证书或链 配置文件查询服务的响应: http://uri.turkcellteknoloji.com.tr/MobileSignature/profile2 C=TR,O=Elektronik Bilgi Guvenligi A.S.,CN=Turkcell
http://uri.turkcellteknoloji.com.tr/MobileSignature/profile2
C=TR,O=Elektronik Bilgi Guvenligi A.S.,CN=Turkcell Mobil NES Hizmet Saglayicisi S2
313460597714010174158784514408553193353
MVI4FeeToX6TDPLh3h9zEw19ulzTomxPB/zDvnyWzKA=
http://localhost
MGOxCzaJBGNVBaytalrsMsgwjyDvqkdb9fBgVrdHjVmblRieJPBGdPied1DMVubgLnasBBllmumtewyWydVqdChudxJry2VSBCbNb2JPBCborVMGSGL6BwV0IFNHZ2xHewljaxNPIfMy
请求(好)
我们仍然能够使用此信息创建SigningCertificateV2实例
var certAlgorithmIdentifier=新算法标识符(certHashDigestAlgorithm);
var certHash=Convert.FromBase64String(certHashDigestValue);
var issuer=新的通用名称(新的通用名称(新的X509Name(certIssuerDN));
var serial=新的DerInteger(新的BigInteger(certSerialNumber));
var issuerSerial=新发行人序列(发行人,序列号);
var certIDv2=新的ESSCertitdv2(certAlgorithmIdentifier、certHash、issuerSerial);
返回新的签名证书EV2(certIDv2);
ASN.1的结果是:
SEQUENCE (1 elem)
SEQUENCE (1 elem)
SEQUENCE (3 elem)
SEQUENCE (1 elem)
OBJECT IDENTIFIER 1.2.840.113549.1.1.11 sha256WithRSAEncryption (PKCS #1)
OCTET STRING (32 byte) 31523815E793A17E930CF2E1DE1F73130D7DBA5CD3A26C4F07FCC3BE7C96CCA0
SEQUENCE (2 elem)
SEQUENCE (1 elem)
[4] (1 elem)
SEQUENCE (3 elem)
SET (1 elem)
SEQUENCE (2 elem)
OBJECT IDENTIFIER 2.5.4.6 countryName (X.520 DN component)
PrintableString TR
SET (1 elem)
SEQUENCE (2 elem)
OBJECT IDENTIFIER 2.5.4.10 organizationName (X.520 DN component)
UTF8String Elektronik Bilgi Guvenligi A.S.
SET (1 elem)
SEQUENCE (2 elem)
OBJECT IDENTIFIER 2.5.4.3 commonName (X.520 DN component)
UTF8String Turkcell Mobil NES Hizmet Saglayicisi S2
INTEGER (128 bit) 313460597714010174158784514408553193353
我们还可以从CA的密钥链中检索根证书和中间证书
...
...
...
...
但正如我前面提到的,我们不能在签名请求之前检索签名者的完整公共证书。仅证书哈希、序列号和颁发者DN。此信息足以在签名请求之前设置ESS signing-certificate-v2
属性
这就是为什么我们应该能够在本地创建CmsSignedData,并添加pdf内容摘要、签名者信息(从概要文件查询中检索到signing-certificate-v2),并从该CmsSignedData实例获取最终摘要,以便使用MSSP签名服务进行签名。之后,当我们从服务中检索XML签名时,我们可以填充此CmsSignedData实例中的其他未签名属性和证书。回答问题的第一个版本,该问题给人的印象是,完整签名者证书根本不可用,甚至在签名服务中也不可用回答:
如果不嵌入签名者的X509证书,则无法创建pdf签名
至少不是以互操作的方式
根据pdf规范:
12.8.3.2 PKCS#1签名
[…]对于使用PKCS#1签名PDF文件,应使用的子筛选器的唯一值是adbe.x509.rsa#sha1。
[…]签名人的证书链应存储在证书条目中
及
12.8.3.3 CMS(PKCS#7)签名
[…]副过滤器应采用以下值之一:
- adbe.pkcs7.detached[…]
- adbe.pkcs7.sha1[…]
因此,如果没有签名者的X509证书,您就无法创建可互操作的pdf签名。那么,作为子过滤器的
ETSI.CAdES.detached
呢。正如我所知,在这种情况下,证书输入是被禁止的。“那么,ETSI.CAdES.detached作为子过滤器呢。”-这些是PAdES签名。因此,请参见最后一段引文。“据我所知,在这种情况下,证书输入是被禁止的。”-是的。明显地“顺便说一下,我已经编辑了这个问题”-这个编辑确实完全改变了这个问题。那个编辑确实完全改变了这个问题-我的错误,对不起。好吧,我能考虑你的答案吗?因为它不再是不可能的。(至少我这么认为,我还没有详细检查您的XML。)