Я знаю, что мы можем сделать это в PowerShell.
(Get-ChildItem Cert:\Currentuser\My\ | Select -Property SignatureAlgorithm -ExpandProperty SignatureAlgorithm).FriendlyName
Полученные результаты:
sha256RSA
sha256RSA
Однако корпоративные клиенты не позволяют нам запускать PowerShell в полевых условиях.
Я могу запустить следующее и установить сертификаты для промежуточных и корневых магазинов.
certutil -store CA
certutil -store Root
И это дает результаты. Однако если посмотреть на: Cert Hash (sha1): Он показывает только SHA1, а не SHA256?
Пример результатов одной из записей:
Serial Number: removed
Issuer: CN=Entrust Root Certification Authority - G2, OU=(c) 2009 Entrust, Inc. - for authorized use only, OU=See www.entrust.net/legal-terms, O=Entrust, Inc., C=US
NotBefore: 10/22/2014 1:05 PM
NotAfter: 10/23/2024 3:33 AM
Subject: CN=Entrust Certification Authority - L1K, OU=(c) 2012 Entrust, Inc. - for authorized use only, OU=See www.entrust.net/legal-terms, O=Entrust, Inc., C=US
Non-root Certificate
Cert Hash(sha1): removed
В конечном итоге я хочу запросить такую компанию, как VeriSign.
Спасибо за понимание.
От @JosefZ я ценю предоставленную информацию: Хорошо ... Я думаю, что большая часть этого работает, но я получаю дополнительную информацию от других поставщиков сертификатов.
Скрипт в настоящее время:
@echo off
echo personal
certutil -v -user -store "MY"|findstr "Serial.Number Algorithm.ObjectId Cert.Hash( X509.Certificate: O=VeriSign"
echo Intermediate
certutil -v -store CA|findstr "Serial.Number Algorithm.ObjectId Cert.Hash( X509.Certificate: O=VeriSign"
echo Root
certutil -v -store Root|findstr "Serial.Number Algorithm.ObjectId Cert.Hash( X509.Certificate: O=VeriSign"
И результаты - обратите внимание на дополнительный сертификат здесь:
X509 Certificate:
Serial Number: <removed>
Algorithm ObjectId: 1.2.840.113549.1.1.11 sha256RSA
Algorithm ObjectId: 1.2.840.113549.1.1.1 RSA (RSA_SIGN)
Algorithm ObjectId: 1.2.840.113549.1.1.11 sha256RSA
Cert Hash(md5): <removed>
Cert Hash(sha1): <removed>
И должен показывать только VeriSign:
X509 Certificate:
Serial Number: <removed>
Algorithm ObjectId: 1.2.840.113549.1.1.11 sha256RSA
O=VeriSign, Inc.
O=VeriSign, Inc.
Algorithm ObjectId: 1.2.840.113549.1.1.1 RSA (RSA_SIGN)
Algorithm ObjectId: 1.2.840.113549.1.1.11 sha256RSA
Cert Hash(md5): <removed>
Cert Hash(sha1): <removed>
Примечание. VeriSign (или другой поставщик, например Entrust) - единственные сертификаты, которые мы хотим видеть.
Часть III., мы сейчас видим - мы так близки: Это работает и показывает каждый VeriSign ..
for /f "delims = " %%g in ('certutil.exe -v -store Root^|findstr "OU=VeriSign"') do echo %%g
Здесь отображается серийный номер каждого сертификата.
for /f "delims = " %%g in ('certutil.exe -v -store Root^|findstr "Serial.Number"') do echo %%g
Нам понадобится что-то вроде:
for /f "delims = " %%g in ('certutil.exe -v -store Root^|findstr "OU=VeriSign Serial.Number"') do echo %%g
В псевдокоде: Для каждого сертификата VeriSign получите серийный номер, чтобы мы могли оценить уровень sha.
Спасибо за сообщение по адресу (Примечание - шестой ответ): Сколько сертификатов? https://social.technet.microsoft.com/Forums/en-US/3314021d-ad2a-4748-a93a-69e213845195/certutil-command-line-to-delete-local-personal-certificates?forum=w7itprosecurity
Это работает, но нужно урезать его, чтобы отображались только сертификаты VeriSign:
for /f "tokens=1,2 delims=:" %%g in ('certutil.exe -v -store Root^|findstr "Serial.Number"') do (certutil -v -store Root "%%h" | findstr "Serial.Number Algorithm.ObjectId Cert.Hash( X509.Certificate: NotBefore NotAfter OU= CN = ")
Глядя на окончательный сценарий, вывод получился немного странным:
for %a in (CA Root AuthRoot) do (
for /f "tokens=1,2 delims=:" %g in ('certutil.exe -v -store %a^|findstr "Serial.Number"') do (
certutil.exe -v -store %a "%h" | echo %a & findstr "Serial.Number Algorithm.ObjectId Cert.Hash( X509.Certificate: NotBefore NotAfter OU= CN = ")
)
Это должно быть решение определенного типа. PowerShell, к сожалению, «не актуален». Я действительно хотел бы использовать PowerShell, так как это было бы намного проще выполнить задачу.
Попробуйте разобрать certutil -v -user -store "MY", certutil -v -store CA и т. д. ИМХО, достаточно разобрать вывод, суженный с помощью …|findstr "Serial.Number Algorithm.ObjectId Cert.Hash( X509.Certificate:"
@JosefZ - я ценю вашу помощь. Пожалуйста, посмотрите мою правку к исходному сообщению.
Для меня фильтрация вывода certutil -store по имени эмитента - непростая задача. Однако я знаю синтаксический шаблон CertUtil [Options] -store [CertificateStoreName [CertId [OutputFile]]] (известный из CertUtil -store -?. Я бы применил CertID (взятые из (Get-ChildItem Cert:\LocalMachine\Root\ | Where-Object {$_.IssuerName.Name -Match 'VeriSign'}).SerialNumber PowerShell) к certutil -v -store Root CertID.
Пример. for /F "usebackq" %F in (`powershell -c "(Get-ChildItem Cert:\LocalMachine\Root\ | Where-Object {$_.IssuerName.Name -Match 'VeriSign'}).SerialNumber"`) do @(certutil -v -store Root %F & certutil -v -store AuthRoot %F) | findstr "Serial.Number Algorithm.ObjectId Cert.Hash( X509.Certificate:"
@JosefZ - Вау, вау, вау ... Я могу использовать скрипт на моем локальном компьютере, и он отлично работает! Однако я не могу использовать PowerShell в полевых условиях. Я знаю, что вы потратили на это массу времени, но мне нужно продолжить путь, который вы проложили для меня.
Я обновил пост. Мы очень близки.





Следующий сценарий 53092715.bat возвращает желаемые серийные номера, см. Переменную _NextCert в команде echo %_Issuer%: %_user% -store "%~1" !_NextCert!.
Использование: 53092715.bat option [Issuer], где
option (необязательно, по умолчанию - ""; обязательно, если присутствует параметр Issuer; затем используйте, например, "");Issuer (необязательно, по умолчанию "Verisign"); не может содержать = (знак равенства); может не содержать пробела (эти ограничения могут быть устранены с некоторым усилием).Примеры использования:
53092715.bat для запроса ключей HKEY_LOCAL_MACHINE или хранилища сертификатов53092715.bat -gp для запроса хранилища сертификатов групповой политики53092715.bat -user для запроса ключей HKEY_CURRENT_USER или хранилища сертификатов53092715.bat "" Apple53092715.bat -user ThawteСценарий:
@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
if "%~2"= = "" (set "_Issuer=VeriSign") else set "_Issuer=%~2"
if /I "%~1"= = "" (set "_user = ") else set "_user=%~1"
call :findCertSN "Root"
call :findCertSN "AuthRoot"
call :findCertSN "CA"
rem call :findCertSN "My"
ENDLOCAL
goto :eof
:findCertSN
set "_NextCert = "
for /F "delims = " %%G in ('
certutil %_user% -store "%~1"^|findstr "^Serial.Number: ^Issuer:"') do (
set "_Line=%%G"
if "!_Line:~0,14!"= = "Serial Number:" (
set "_NextCert=!_Line:~15!"
) else (
if "!_Line:~0,7!"= = "Issuer:" (
set "_Line=!_Line:~8!"
set "_NextIssuer = "
for %%g in (!_line!) do (
set "_Elin=%%g"
set "_Part=!_Elin:%_Issuer%=!"
if not "!_Part!"= = "!_Elin!" set "_NextIssuer=Match"
)
if defined _NextCert if defined _NextIssuer (
echo %_Issuer%: %_user% -store "%~1" !_NextCert!
set "_NextCert = "
)
)
)
)
goto :eof
Идеально! Это прекрасно работает, и я внес несколько изменений, чтобы возвращать данные нашего поставщика для сертификатов.
Нужно сделать еще отладку. Запускаем это через CA IT Client Manager, и если сертификат поставщика не существует, кажется, что он будет работать вечно.
Видимая проблема может быть связана с машиной, на которой я ее запускал. Не обращая внимания на предыдущий комментарий.
Требуется ли это CertUtil или вы примете отфильтрованный сценарий PowerShell?