Как сделать base64 .p12 пригодным для использования?

Я пытаюсь автоматизировать довольно утомительный процесс создания пользователей VPN и их сертификатов на нашем брандмауэре CheckPoint. Когда это делается через графический интерфейс, я просто сохраняю файл .p12 на своем диске, но когда я создаю сертификат через API, он возвращает строку base64, с которой я не уверен, что делать.

Я попытался сохранить строку как файл .p12 напрямую (просто вставив ее напрямую, а также попробовав формат pem сертификата начала/конца), и я попытался декодировать ее в двоичный файл через python, но независимо от того, что я делаю Я никогда не смогу использовать его для подключения к нашему VPN.

Описание API возвращаемых данных:

Файл сертификата, закодированный в base64. Формат файла: .P12.

Я думаю, что это MIME base64, поскольку возвращаемая строка состоит из кусков по 76, разделенных символами новой строки, но на данный момент я просто гуглю.

Я был бы очень признателен за помощь!

РЕДАКТИРОВАТЬ:

Итак, я взял файл b64decoded, который я создал из строки base64, и пропустил его через openssl -info, и хотя он принял мой пароль, у него, похоже, возникли некоторые проблемы. Также я не знал, что такое локальный ключ и имеет ли он значение, поэтому я просто отредактировал его.

tester@lab1:~$ openssl pkcs12 -info -in tester.p12 
Enter Import Password:
MAC: sha1, Iteration 100000
MAC length: 20, salt length: 20
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 1
Bag Attributes
    friendlyName: nickster
    localKeyID: redacted 
    1.3.18.0.2.28.24: IBM_SDK_JAVA_8_PKCS12
Error outputting keys and certificates
140226334045504:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:../crypto/evp/evp_enc.c:583:
140226334045504:error:23077074:PKCS12 routines:PKCS12_pbe_crypt:pkcs12 cipherfinal error:../crypto/pkcs12/p12_decr.c:62:
140226334045504:error:2306A075:PKCS12 routines:PKCS12_item_decrypt_d2i:pkcs12 pbe crypt error:../crypto/pkcs12/p12_decr.c:93:

person Nick    schedule 09.10.2020    source источник
comment
Итак, декодируйте его с помощью base64 и посмотрите, является ли это файлом pkcs12.   -  person President James K. Polk    schedule 10.10.2020
comment
или... не является ли строка base64 непосредственно сертификатом (PEM)? Какой формат вам нужен в конце? Вы по-прежнему можете создать файл p12 только с сертификатом   -  person gusto2    schedule 10.10.2020
comment
@gusto2 gusto2 Я уже пробовал это, но я отредактировал основной вопрос после вашего предложения, чтобы попытаться сделать это более ясным. Также моя РЕДАКТИРОВАТЬ: добавление openssl -info было после предложения президента Джеймса К. Полка.   -  person Nick    schedule 10.10.2020


Ответы (2)


Если вы готовы использовать PowerShell, следующее должно работать:

$base64value = Get-Content -Path $base64FilePath
$byteArray = [System.Convert]::FromBase64String($base64value)
$cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($byteArray, $certPw, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
# Export the certificate as a PFX file
$bytesPfx = $cert.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pfx, $certPw)
[System.IO.File]::WriteAllBytes($pkcs12FilePath, $bytesPfx)

Если вам требуется решение с использованием OpenSSL, у меня, к сожалению, такая же проблема, и я также ищу помощь по переполнению стека (вы можете увидеть мой пост здесь).

Если вы уже нашли решение, я был бы очень признателен, если бы вы могли поделиться!

person Chase Blasingame    schedule 29.06.2021

Поскольку я наткнулся на ту же проблему, и хотя ответ существует в комментариях, но он не так ясен, я хотел бы дать формальный ответ. Используемые команды предназначены для системы Linux, но другие системы также могут помочь, вам просто нужно найти эквивалентные команды.

Скопируйте большой двоичный объект pkcs12 в файл, скажем, pkcs12blob.txt. мой файл выглядит так:

$ cat pkcs12blob.txt

MIIF1wIBAzCCBZEGCSqGSIb3DQEHAaCCBYIEggV+MIIFejCCAVcGCSqGSIb3DQEHAaCCAUgEggFEMIIBQDCCATwGCyqGSIb3DQEMCgECoIHIMIHFMCgGCiqGSIb3DQEMAQMwGgQUkdx2oIxyhIyOtnsr+AicfDUrg6UCAgQABIGYw0xT7jD1J0TF78Foq8zJbCu8o4IJJc2lS8NNBWoe9WwC2Y6qldE077u+SUxwediPfd4YzRW3CfzmHhvGVEQD4a0Qc6HwO0WcVhSGeFg71W9XLA/3FDzCh6RT6pOjH66OkImli8G4uN2vFDTrA7JOzkVzFyJ3/JtF65RZNUjF+UDmNbIXxAI50905BrF4JPsReEBnSmq8AvkxYjAjBgkqhkiG9w0BCRUxFgQUIBO5cuYa4i+BSqcrEy ...

Далее (по крайней мере, для ubuntu) выполните команду:

base64 --decode pkcs12blob.txt > pkblob_decoded.p12

Объяснение: base64 — это утилита Linux. > используется для направления вывода команды base64 --decode pkcs12blob.txt в файл pkblob_decode.p12.

Теперь, чтобы убедиться, что декодирование прошло успешно, вы можете запустить команды openssl. Нравиться:

$ openssl pkcs12 -in pkblob_decoded.p12 -info

В моем случае пароль, который я получил, также был парольной фразой PEM, необходимой для доступа к закрытому ключу и сертификату.

Enter Import Password:
MAC: sha1, Iteration 1024
MAC length: 20, salt length: 20
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 1024
Bag Attributes
    localKeyID: 20 13 B9 72 E6 1A E2 2F 81 4A A7 2B 13 2F CB 42 AA 8F A3 B8 
    friendlyName: device.skyelectric.com
Key Attributes: <No Attributes>
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIHjME4GCSqGSIb3DQEFDTBBMCkGCSqGSIb3DQEFDDAcBAib5okfrVyeJgICCAAw
DAYIKoZIhvcNAgkFADAUBggqhkiG9w0DBwQIyorn+oup9Z8EgZCLE27JvEh5qbes
W5B4Zhgv8snSdm38cd8VaxTe+lAC52ycZWB/pwtp+l9JtEem64lauCXS5emHJOIV
iDkQZ3ORkirRVgLq+oprbsV8R2N5izCgLiTx5/x6tHnniPSi9QmPMvd40JaDUuj/
GZnlVpX15VqG563RkOvteQ9pnj8gPn5qOZGg9LFQ2J3LMoPNGT8=
-----END ENCRYPTED PRIVATE KEY-----
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 1024
Certificate bag
Bag Attributes
    localKeyID: 20 13 B9 72 E6 1A E2 2F 81 4A A7 2B 13 2F CB 42 AA 8F A3 B8 
    friendlyName: device.skyelectric.com
subject=CN = device.skyelectric.com

issuer=O = Keyfactor Inc, CN = Keyfactor Demo Drive ECC 1 ...
...
person Mohammad Ismail Tirmizi    schedule 03.03.2021