
У меня есть ответ .tsr от процесса подписания в OpenSSL. openssl ts -reply
работает.
openssl ts -reply -in b1.tsr -text
Using configuration from g:/progs/openssl/ssl/openssl.cnf
Status info:
Status: Granted.
Status description: unspecified
Failure info: unspecified
TST info:
Version: 1
Policy OID: 1.3.6.1.4.1.6449.2.1.1
Hash Algorithm: sha256
Message data:
0000 - 10 20 96 d8 03 ec ed 6e-03 56 3d d6 d6 a7 14 50 . .....n.V=....P
0010 - b0 a7 53 a9 34 4e b9 57-f7 e2 83 13 5e 0d df e0 ..S.4N.W....^...
Serial number: 0xA7ADC6135D0A39500F7C3B0C41578D8C2CB62B87
Time stamp: Jun 22 10:59:44 2019 GMT
Accuracy: unspecified
Ordering: no
Nonce: 0xD4154ECA4E9A0D06
TSA: DirName:/C=GB/ST=Greater Manchester/L=Salford/O=Sectigo Limited/CN=Sectigo RSA Time Stamping Signer #1
Extensions:
openssl ts -verify
терпит неудачу.
openssl ts -verify -sha256 -digest "102096d803eced6e03563dd6d6a71450b0a753a9344eb957f7e283135e0ddfe0" -in b1.tsr -CAfile comodo.pem
Verification: FAILED
11928:error:2F06D064:time stamp routines:TS_VERIFY_CERT:certificate verify error:.\crypto\ts\ts_rsp_verify.c:264:Verify error:unable to get local issuer certificate
Что это за локальный сертификат издателя? Я не могу использовать -noverify в команде "ts".
решение1
Чтобы построить полную цепочку сертификатов для проверки OpenSSL, вам понадобится не только корневой сертификат (который вы указали с помощью переключателя -CAfile
), но и сертификат, который использовался для подписи TSResponse.
Из страницы руководства ts
:
-untrusted cert_file.pem
Set of additional untrusted certificates in PEM format which may be needed when building the certificate chain for the TSA's signing certificate. This
file must contain the TSA signing certificate and all intermediate CA certificates unless the response includes them. (Optional)
решение2
Ошибка проверки «невозможно получить локальный сертификат издателя» означает, что OpenSSL не удалось найти в локальном хранилище доверенных сертификатов ни полный корень цепочки (или якорь), ни следующее звено неполной цепочки, которое может быть, а может и не быть корнем/якорем.
В качестве справки, поскольку вы не указали, насколько вы понимаете проверку на основе сертификатов, она ts -verify
в основном состоит из четырех частей:
проверка подписи в теле токена, проверка с использованием открытого ключа в сертификате (заявленного) подписчика, а также некоторые другие ограничения, налагаемые RFC3161, соблюдены (должен быть только один SignerInfo, и он должен использовать signedAttrs, включая ESSCertId). Включение сертификата подписчика в ответ с временной меткой контролируется флагом в запросе RFC3161; если он не включен, проверяющий/проверяющий должен уже иметь его или получить его другими способами.
построить цепочку (также называемую путем), которая связывает сертификат заявленного подписчика по крайней мере с одним доверенным CA, представленным сертификатом CA, называемым корневым или якорным сертификатом, который локально определяется как доверенный, как правило, по наличию в хранилище доверенных сертификатов. Ответ RFC3161можетвключают сертификат(ы) цепочки, но это не обязательно; в противном случае проверяющая/проверяющая сторона должна иметь их уже или получить их другими способами.
проверить цепочку, проверив, что подпись каждого сертификата соответствует открытому ключу следующего сертификата более высокого уровня (т. е. родительского), что каждый сертификат действителен (действует и не просрочен) на момент подписания, а также что ряд других полей в каждом сертификате подходят для его использования в цепочке; подробности см. вRFC5280 раздел 6. Проверкадолженвключить проверку того, что каждый сертификат в цепочке не отозван (на момент подписания), но OpenSSL не выполняет эту часть по умолчанию; существует несколько вариантов проверки отзыва, но вы не использовали ни один из них.
наконец, проверьте, что сертификат (цепочка) подходит для этой цели, а именно для временной метки. Для других случаев использования сертификата, таких как SSL/TLS и S/MIME, нам обычно нужно проверить не только то, что сертификат был законно выпущен под руководством доверенного центра сертификации, но и то, что он был выпущенкконкретная сущность (веб-сайт, почтовый сервер или человек, который был надежно идентифицирован). Однако для временной метки мы обычно не заботимсякоторыйTSA выпустила токен, только этотнекоторыйДействительный TSA это сделал, поэтому последняя проверка только подтверждает, что ExtendedKeyUsage сертификата/цепочки включает (стандартизированный OID для и, таким образом, разрешает) отметку времени.
В совокупности (и только в совокупности) все это подтверждает, что имеющиеся у нас данные на самом деле являются маркером временной метки, выпущенным действительным TSA, и не были подделаны или изменены ни намеренно, ни непреднамеренно, и, следовательно, им можно доверять.
Для командной строки OpenSSL корень/якорь должен находиться в используемом хранилище доверенных сертификатов, которое состоит либо из указанного -CAfile
и/или -CApath
CAfile по умолчанию и/или CApath, если они существуют, в любом случае в формате PEM; и (хотя страница руководства не очень понятна) любые другие сертификаты цепочки, отсутствующие в ответном сообщении, должныилинаходиться в хранилище доверенных сертификатов или в файле, предоставленном как -untrusted
(который должен быть одним файлом, но может содержать несколько сертификатов в формате PEM). По умолчанию только корневой сертификат принимается (и исторически только корневой) в качестве привязки к цепочке/пути, но с опцией, -partial_chain
начиная с версии 1.0.2, принимается некорневая привязка к цепочке/пути.
Дисплей ts -reply -text
не показывает уровень CMS и, в частности, какой сертификат(ы) в нем предоставлен(ы). Вы можете увидеть все, asn1parse -inform der [-i]
но должны расшифровать вручную. Более удобно, вы можете извлечь часть CMS SignedData, также известную как подписанный токен, согласномой ответ здесьа затем проверьте сертификаты следующим образом:
openssl ts -reply -in respfile -token_out -out tokenfile
openssl pkcs7 -inform der -in tokenfile -print_certs
# if desired/necessary, feed any or each of the PEM cert block(s)
# to openssl x509 -text -noout to get full details
У меня нет опыта работы с этим TSA, но исходя из принципа, что сертификат и цепочка известного публичного TSA должны быть публично зарегистрированы, единственный зарегистрированный сертификат с такой темой, известный crt.sh (который также управляется Comodo-now-Sectigo), этоhttps://crt.sh/?id=1437463789который имеет одного известного родителяSectigo RSA Time Stamping CA
https://crt.sh/?id=1437089092чей эмитент USERTrust RSA Certification Authority
; этот CA имеет четыре сертификата (потенциальных родительских), перечисленных наhttps://crt.sh/?caid=1167-- один из них Microsoft codesigning, который обычно используется только если временная метка относится к подписи кода Microsoft Authenticode, а три других все приемлемы для общего использования, хотя единственный, названный Comodo, довольно новый (выпущен всего 3 месяца назад). Кстати, AIA в id=1437089092 указывает наhttp://crt.usertrust.com/USERTrustRSAAddTrustCA.crtкоторый обслуживает сертификат из корня AddTrusthttps://crt.sh/?id=4860286который является самым старым (выпущен в 2000 году и истекает в течение года).
Используйте сертификат(ы) в сообщении, чтобы определить, какие дополнительные сертификаты цепочки и якоря необходимы для корня или якоря, которые вы хотите использовать, и сравните с тем, что указано в вашем -CAfile
или другом файле, который вы можете использовать с -untrusted
.