您如何在PDF中对证书吊销列表(CRL)流字节进行编码?

问题描述 投票:0回答:1

我签署了PDF并添加了更新版本,其中我编写了带有CRL,证书,VRI的DSS。

19 0 obj
    [15 0 R 16 0 R]
endobj
20 0 obj
    [13 0 R 14 0 R]
endobj
11 0 obj
    [15 0 R 16 0 R]
endobj
12 0 obj 
    [13 0 R 14 0 R]
endobj
17 0 obj
<<
    /CRL 11 0 R
    /Cert 12 0 R
>>
endobj
18 0 obj
<<
    /5F44CF6F351DFD45FB62F3D0ED046408BC892797 17 0 R
>>
endobj
21 0 obj
<<
    /VRI 18 0 R
    /CRLs 19 0 R
    /Certs 20 0 R
>>

我对如何编写证书和CRL流感到困惑。

15 0 obj
<<
    /Length 1454
    /Filter /FlateDecode
>>
stream
xÚ3hb0hb{ÅÄÈhÀÉƪÍÇÌ$ÅÊ`àcÈä2‡²°    3…Šˆ€8\¼®y%E¥Å%:žyÉz†ªÊ
ZbXd{0%KW÷ýY¯’ó‚-ØÂÛ„OÏó½z•î    ‰`®•®   K-›2}tÖ§^_8;xÉì¥Ó®~›.g9A'Õüê½—
ZbXd{0%KW÷ýY¯’ó‚-ØÂÛ„OÏó½z•î    ‰`®•®   K-›2}tÖ§^_8;xÉì¥Ó®~›.g9A'Õüê½— 
endstream
endobj

16 0 obj
<<
    /Length 1477
    /Filter /FlateDecode
>>
stream
„kâR7Å41*!‡#8Íñ3 Ź˜@‰o=«‡çƒ#yë:X]r\~}¼)/Ñmç×£¦³äsËê]ÓÕ_+µ¥$Ô¿}¾ÜÏiÁÝT!¹ôi–Í9üÀ}Š¸|
ìŒH¿GÓø^ú¿ÔVÜK–qõ†µ®“¸»Ý*Žh¾JzåU7c~÷•ÔêýK*îú®¹¸DcÁ­³·NtV~Vóåíé5\‚&½|¶NäïŽ[K­
î›NRZbXd{0%KW÷ýY¯’ó‚-ØÂÛ„OÏó½z•î    ‰`®•®   K-›2}tÖ§^_8;xÉì¥Ó®~›.g9A'Õüê½—›oÇ:ç-¶?
endstream
endobj

13 0 obj
<<
    /Length 1240
    /Filter /FlateDecode
>>
stream
%ŸwC[í2×¾Iej©úkŽ-:ݳÔ<¼a£ƒô/5›‡~zÒ•7ü9uãcfk?ËÅ`ßÃ:Èb—’‚Ÿõ{ÏÅ—¢{]HçQ”9w(ÂB#í×g¥ìþè
^–F«š/r§š¿ì=#,^pëO€{äú=}RÎêð¦ÉŠ7or¼±Ëtë–x·˜§LÌŒŒ‹› Cd0€eùÿ³°03±>0P ñUY$
endstream
endobj

14 0 obj
<<
    /Length 1159
    /Filter /FlateDecode
>>
stream
4!>T‚êPpÎI,.V0Ò™@ûœºƒ=LÍš•ãˆ‘•¹‰‘Ÿ(ÎÅÔÄÈÈplŽ÷A¯¹7k/[‡O\}
öe™¨îö£œ¶ä'¶ÌpžªweÞª[¡$¼ØÍþþtó[½xÉO4ÞZ¥ØŸ^g ø,mu„_Rz™_PÏê.||º¶*þîÝxv½"»êôó»ø%Ü%ý
endstream
endobj

请忽略上面流的长度和内容。我删节了,所以长度不再对应了。溪流比那还要大。

问题是我的PDF 未启用LTV,我测试了一些情况,得出结论:我的信息流编写方式不正确。

我使用WinCrypt.h中的以下结构:

typedef struct _CERT_CONTEXT {
    DWORD                   dwCertEncodingType;
    BYTE                    *pbCertEncoded;
    DWORD                   cbCertEncoded;
    PCERT_INFO              pCertInfo;
    HCERTSTORE              hCertStore;
} CERT_CONTEXT, *PCERT_CONTEXT;
typedef const CERT_CONTEXT *PCCERT_CONTEXT;

我通过它们并以这种方式获取字节:

PCCERT_CONTEXT  cngContext = (PCCERT_CONTEXT)(*itChain);
ByteArray certBytes(cngContext->pbCertEncoded, (size_t)cngContext->cbCertEncoded);

然后,我仅将FlateDecode应用于获得的字节,并将它们像流一样写入PDF,如在第二个代码块中所见。

我错过任何一步了吗?喜欢转化还是什么?我看到流应该经过BER编码。所以我应该将字节转换为BER编码,然后应用FlateDecode吗?

编辑:

您可以在这里找到My File

c++ pdf certificate digital-signature certificate-revocation
1个回答
0
投票

SOLUTION

问题是我在PDF文件中编写的CRL的stream

具有每个证书的CRL_CONTEXT结构,我只是获取了[[pbCrlEncoded变量,并将其直接写入CRL流中。

enter image description here

enter image description here

似乎正确,但我注意到此结构的CRL_INFO中没有任何CRL_ENTRY,因此编码的BYTE不包含任何已撤销证书的列表。因此,发现证书具有URL,您可以从中下载更新的CRL。您可以通过在Windows中打开

管理计算机证书

->找到您的证书并打开证书-> 详细信息-> CRL分发点-> URL = “ ..”。通过访问此URL,浏览器将自动下载CRL信息。您可以访问它并查看一些信息,例如Next Update,这是该列表有效的最后一天。在那之后,我假设您需要再次下载它以获得更新的版本。您也可以看到已撤销证书的列表本身。这是我需要放入PDF的CRL流中的列表。因此,我找到了一种通过代码完成下载过程的方法。这是使用的代码段:

PCERT_CHAIN_ELEMENT chainElement; // this is the certification in the chain pExtension = CertFindExtension(szOID_CRL_DIST_POINTS, chainElement->pCertContext->pCertInfo->cExtension, chainElement->pCertContext->pCertInfo->rgExtension); if (!pExtension) return ByteArray(); if (!CryptDecodeObject(X509_ASN_ENCODING, szOID_CRL_DIST_POINTS, pExtension->Value.pbData, pExtension->Value.cbData, 0, 0, &cbStructInfo)) return ByteArray(); if (!(pvStructInfo = LocalAlloc(LMEM_FIXED, cbStructInfo))) return ByteArray(); CryptDecodeObject(X509_ASN_ENCODING, szOID_CRL_DIST_POINTS, pExtension->Value.pbData, pExtension->Value.cbData, 0, pvStructInfo, &cbStructInfo); pInfo = (CRL_DIST_POINTS_INFO*)pvStructInfo; Net::HttpRequest req; Net::HttpRequestOptions ops; ops.verb = Net::GET; crllist = req.send(pInfo->rgDistPoint->DistPointName.FullName.rgAltEntry->pwszURL);

通过这种方式,我在将FlateDecode应用于字节后获得了可以粘贴到PDF中的字节。现在,PDF已启用LTV。
© www.soinside.com 2019 - 2024. All rights reserved.