Espero que esta pergunta seja adequada para falha do servidor. Ele contém algum código, mas não acho que se encaixe muito bem no Stack Overflow.
Eu tenho um programa Python que salva um certificado autoassinado no cache "Autoridades de certificação raiz confiáveis" do "Computador local". Mas o problema é que ele não está sendo salvo na loja correta (não tenho certeza se “loja” é a terminologia correta).
Vejo dois caminhos diferentes para o que presumi ser a mesma loja, mas aparentemente não são. A Microsoft fez um excelente trabalho ao tornar isso confuso.
Você pode ver que o primeiro caminho é Local Computer\Trusted Root Certification Authorities\Certificates
. Nota: isto é aberto no certlm
programa (Gerenciar certificados de computador).
E o segundo caminho é Console Root\Certificates (Local Computer)\Trusted Root Certification Authorities\Certificates
. Nota: Isso é aberto criando um novo snap-in de Certificados no MMC e escolhendo "Conta de computador".
Meu programa está salvando meu certificado no primeiro caminho, mas preciso que ele vá para o segundo caminho. É isso. Para conseguir isso, acho que só preciso escolher o "Local da Loja" correto. Estou usando este site como referência:
https://learn.microsoft.com/en-us/windows/win32/seccrypto/system-store-locations
Meu código é bem simples:
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)
Você pode ver que o armazenamento do sistema que estou usando CERT_SYSTEM_STORE_LOCAL_MACHINE
e o local do armazenamento é "Root". Ao executar isso, ele salva em Local Computer\Trusted Root Certification Authorities\Certificates
, o que eu não quero.
Se eu alterar "Root" para "Trust", ele será salvo em Console Root\Certificates (Local Computer)\Enterprise Trust\Certificates
, que é o armazenamento raiz correto, mas não o caminho correto.
Alterar "Root" para "CA" salva-o em Console Root\Certificates (Local Computer)\Intermediate Certification Authorities\Certificates
. Novamente, armazenamento raiz correto, mas caminho errado.
Então, minha pergunta é: qual é a combinação correta de armazenamento/local de armazenamento do sistema a ser usada para salvar isso no caminho correto, que é Console Root\Certificates (Local Computer)\Trusted Root Certification Authorities\Certificates
? Estou executando meu programa como administrador, então não acredito que seja um problema de permissão. A menos que a Microsoft bloqueie isso totalmente sem aviso prévio.