Я написал код ниже для получения root центра сертификации на Windows. Этот код сделан для UE4, но я считаю, что он все еще понятен (пожалуйста, дайте мне знать, если нет).
bool GetRootCertificatesImpl(FString& OutCertificates)
{
HCERTSTORE StoreHandle = CertOpenSystemStoreW(0, L"ROOT");
if (!StoreHandle)
{
UE_LOG(LogCertStore, Error, TEXT("Error opening system store. %s failed."), TEXT("CertOpenSystemStoreA"));
return false;
}
PCCERT_CONTEXT ContextPointer = nullptr;
while ((ContextPointer = CertEnumCertificatesInStore(StoreHandle, ContextPointer)) != NULL)
{
DWORD StringWithHeaderLength = 0;
const BOOL Ret_ComputeSize =
CryptBinaryToStringW(ContextPointer->pbCertEncoded, ContextPointer->cbCertEncoded, CRYPT_STRING_BASE64HEADER, nullptr, &StringWithHeaderLength);
if (Ret_ComputeSize == TRUE)
{
UE_LOG(LogCertStore, Error, TEXT("%s() returned FALSE for prepass"), TEXT("CryptBinaryToStringW"));
return false;
}
LPWSTR StringBuffer = (LPWSTR) FMemory::Malloc(StringWithHeaderLength * sizeof(WCHAR));
if (StringBuffer == nullptr)
{
return false;
}
const BOOL Ret_WriteString = CryptBinaryToStringW(
ContextPointer->pbCertEncoded, ContextPointer->cbCertEncoded, CRYPT_STRING_BASE64HEADER, StringBuffer, &StringWithHeaderLength);
if (Ret_WriteString != TRUE)
{
FMemory::Free(StringBuffer);
UE_LOG(LogCertStore, Error, TEXT("%s() returned FALSE for conversion"), TEXT("CryptBinaryToStringW"));
return false;
}
OutCertificates.Append(StringBuffer, StringWithHeaderLength);
OutCertificates.Append(LINE_TERMINATOR);
FMemory::Free(StringBuffer);
}
CertFreeCertificateContext(ContextPointer);
CertCloseStore(StoreHandle, 0);
return true;
}
Как я могу получить этот root центр сертификации в формате PEM на Linux? Спасибо!