Решено: мне просто нужно было выбрать запуск от имени администратора для PyCharm и исполняемого файла.
У меня есть программа Python, которая создает самозаверяющий сертификат, и теперь я пытаюсь добавить функцию, которая сохраняет этот же сертификат в папке «Доверенные корневые центры сертификации» Windows в хранилище «Сертификаты — локальный компьютер». У меня работает при сохранении в хранилище сертификатов «Текущий пользователь», но на этом все. Когда я пытаюсь сохранить локальное хранилище компьютеров, я получаю сообщение об отказе в доступе:
(-2147024891, 'PyCERTSTORE::CertAddEncodedCertificateToStore', 'Access is denied.')
Вот функция, которая принимает сертификат в виде строки:
CERT_STORE_PROV_SYSTEM = 0x0000000A
CERT_STORE_OPEN_EXISTING_FLAG = 0x00004000
CERT_STORE_MAXIMUM_ALLOWED_FLAG = 0x00001000
CRYPT_STRING_BASE64HEADER = 0x00000000
CERT_SYSTEM_STORE_CURRENT_USER_ACCOUNT = 0x00010000
CERT_SYSTEM_STORE_LOCAL_MACHINE = 0x00020000
X509_ASN_ENCODING = 0x00000001
CERT_STORE_ADD_REPLACE_EXISTING = 3
CERT_CLOSE_STORE_FORCE_FLAG = 0x00000001
def save_cert_to_store(cert_to_save: str) -> None:
cert_byte = win32crypt.CryptStringToBinary(
cert_to_save,
CRYPT_STRING_BASE64HEADER
)[0]
store = win32crypt.CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
None,
CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_MAXIMUM_ALLOWED_FLAG,
"Root"
)
try:
store.CertAddEncodedCertificateToStore(
X509_ASN_ENCODING,
cert_byte,
CERT_STORE_ADD_REPLACE_EXISTING
)
except Exception as e:
print(e)
finally:
store.CertCloseStore(CERT_CLOSE_STORE_FORCE_FLAG)
Я подозреваю, что проблема в этой строке: CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_MAXIMUM_ALLOWED_FLAG
, но я пробовал разные комбинации вещей с теми же результатами. Я вижу, что CERT_STORE_MAXIMUM_ALLOWED_FLAG
начинается с разрешений на запись, которые, как я полагаю, мне нужны здесь, поскольку я добавляю в магазин, поэтому я не понимаю, почему мне отказывают в доступе. Я тоже пробовала CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_OPEN_EXISTING_FLAG
.
Я также не уверен, в чем разница в использовании «Root» и «My». Я пробовал оба. редактировать: Неважно, я нашел ответ на этот вопрос.
Я просмотрел все другие похожие сообщения на SO, но ни один из них на самом деле не пытается сохранить новый сертификат в этом хранилище, а только читает его.
Мне также интересно, может ли эта операция быть полностью заблокирована Windows.
Я ссылаюсь на документацию Microsoft здесь: https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certopenstore
Примечание. Чтобы запустить это, вам понадобится pip install pywin32
Решено: мне просто нужно было выбрать запуск от имени администратора для PyCharm и исполняемого файла.
Здесь нет никаких вопросов, поэтому мне остается догадываться, что вы спрашиваете, предлагает ли система API для повышения привилегий. Ответ: «нет».
Мое решение состояло в том, чтобы запустить IDE и исполняемый файл от имени администратора.
Мы будем признательны за то, что поделитесь своим решением здесь. Пожалуйста, не забудьте принять ваш ответ как ответ.
Попробуйте CertOpenSystemStore . См. образец EhStorEnumerator.