Как загрузить файл PKCS#12 в OpenSSL программно?
в приложении сервера SSL на основе OpenSSL, как мы можем загрузить файл PKCS#12 программно?
кроме того, могу ли я загрузить файл PKCS#12, имеющий сертификат, ключ и CAs в том же файле в OpenSSL?
3 ответов
Да вы можете загрузить файл PKCS#12, содержащий сертификат, ключ и CAs, в том же файле с OpenSSL.
- использовать
d2i_PKCS12_fp()
илиd2i_PKCS12_bio()
для загрузки файла PKCS#12. - дополнительно использовать
PKCS12_verify_mac()
для проверки пароля. - использовать
PKCS12_parse()
который расшифровывает и извлекает ключ, сертификат и цепочку CA для вас.
С openssl-1.0.0 d / demos/pkcs12 / pkread.c:
#include <stdio.h>
#include <stdlib.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/pkcs12.h>
/* Simple PKCS#12 file reader */
int main(int argc, char **argv)
{
FILE *fp;
EVP_PKEY *pkey;
X509 *cert;
STACK_OF(X509) *ca = NULL;
PKCS12 *p12;
int i;
if (argc != 4) {
fprintf(stderr, "Usage: pkread p12file password opfile\n");
exit (1);
}
OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();
if (!(fp = fopen(argv[1], "rb"))) {
fprintf(stderr, "Error opening file %s\n", argv[1]);
exit(1);
}
p12 = d2i_PKCS12_fp(fp, NULL);
fclose (fp);
if (!p12) {
fprintf(stderr, "Error reading PKCS#12 file\n");
ERR_print_errors_fp(stderr);
exit (1);
}
if (!PKCS12_parse(p12, argv[2], &pkey, &cert, &ca)) {
fprintf(stderr, "Error parsing PKCS#12 file\n");
ERR_print_errors_fp(stderr);
exit (1);
}
PKCS12_free(p12);
if (!(fp = fopen(argv[3], "w"))) {
fprintf(stderr, "Error opening file %s\n", argv[1]);
exit(1);
}
if (pkey) {
fprintf(fp, "***Private Key***\n");
PEM_write_PrivateKey(fp, pkey, NULL, NULL, 0, NULL, NULL);
}
if (cert) {
fprintf(fp, "***User Certificate***\n");
PEM_write_X509_AUX(fp, cert);
}
if (ca && sk_X509_num(ca)) {
fprintf(fp, "***Other Certificates***\n");
for (i = 0; i < sk_X509_num(ca); i++)
PEM_write_X509_AUX(fp, sk_X509_value(ca, i));
}
sk_X509_pop_free(ca, X509_free);
X509_free(cert);
EVP_PKEY_free(pkey);
fclose(fp);
return 0;
}
попробовать man SSL
, который дает вам список функций OpenSSL. Что-то вроде SSL_load_client_CA_file
может удовлетворить ваши потребности; это зависит от того, находится ли сертификат в файле на диске или уже в памяти. Есть много вспомогательных функций, одна из них будет делать трюк. Кроме того, проверить man PEM
для процедур обработки PEM.
Edit: Хм, может быть, сочетание d2i_PKCS12_fp
и PKCS12_parse
(Оба доступные от <openssl/pkcs12.h>
) позволяет читать сертификат из файла и парсить его.
будьте предупреждены, что код записывает сертификаты как доверенные сертификаты (зашифрованные). Если вам нужны незашифрованные сертификаты, измените вызовы pem_write_x509_aux () на PEM_write_X509 ().