Попытка сделать что-то, что кажется довольно простым, но не может заставить его работать. Я экспортировал сертификат хранилища ключей Java и закрытый ключ в файл .pem, чтобы я мог загрузить их в клиент C ++ SSL. Я использовал эти команды.
C:\temp> keytool -importkeystore -srckeystore client.jks \
-destkeystore client.p12 -srcstoretype jks \
-deststoretype pkcs12
C:\temp> openssl pkcs12 -in client.p12 -out client.pem
Затем я разделил сертификат и закрытый ключ на разные файлы .pem. Я положил закрытый ключ в client-privkey.pem. Вот его содержание.
Bag Attributes
friendlyName: clientkeys
localKeyID: 54 69 6D 65 20 31 34 30 32 35 39 35 37 37 32 39 32 34
Key Attributes: <No Attributes>
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIMHOgKXfKXvQCAggA
MBQGCCqGSIb3DQMHBAjjCn0xeVGbcASCAoC4M4hC1ZdeW7Ldz5wStGydIiEZzsGg
VeFvzrLCNBMuW1aB6lrmxHpIfWqCe71fm8+wiKXE1eu+LzLwuUFoKfv9zFhADdxv
pKvlJdai0UOliFdykvSoW/+SWQUzdu/MS6ajLu0dv4awaIpNyU+WlhvgzxZBaHya
h7zLwH2Teb9ZR8YmLYHe52TpjucZNVn2DFNO13fx5WQm8/EkcXh2W019vCh1psgo
9xd5JFm+v2OPncz/cZvi0FYzmDevA3RIdWFNR9mCgti8PPrdoNA4HkfZoG3fQaZj
P8sOMhjYYF3ULtmnRoSBN7pkJq1ewrWFiFmQVxe1ItKh6qX2woq2U3Gt9NyZkuOy
Ms/fKpSt/EcZLXuHlgUwbFCBq2SWTdEo4VBjBQIE+ODcn3Ve/EbsLwN6bpFRwSYg
3AJr9bq6ujJdLm5epF8zFlaPZyi4gnAanOBQj2SoHmSLejTgGfAxg4T5ybnP+7Wc
S7yjXeR5e4/wygldgfp1j4WK0YrlyO5WghFmrqqPe3uFJRyakq7TkahQazUhgUyw
q8QTa4Z9ipS7J+ZfFksV4Oo2AiLDcj/eEF3JmEEnPoWV56NK8C3HJXFAT3nyq2MJ
vQEXCXhrvoAjkSALDSINM0hqypQABgopeAO5+ApjHHg+PsOQ8Wmq0NH+KUUcZDfp
lLCZIRjOZralueNutQAo+bimelom+ldByFxzAWLvWvaqFceMn3deSmBQIEKG00xZ
LqZAnsTUHZmysgY8hywNDgbc6J2w6Px7Q1IrYOhn9OaaifVDMV5IphptKm/PHtFs
BChOpKUeBsOohaeewaZ3CNhip0sBNUaA5CuI47qY2rW/Re0FaPQqJDon
-----END ENCRYPTED PRIVATE KEY-----
В моем клиенте C ++ я загружаю сертификат и ключ, как это
SSL_CTX *ctx;
SSL *ssl;
SSL_METHOD *meth;
X509 *server_cert;
SSL_library_init();
/* Load the error strings for SSL & CRYPTO APIs */
SSL_load_error_strings();
/* Create an SSL_METHOD structure (choose an SSL/TLS protocol version) */
meth = SSLv3_method();
/* Create an SSL_CTX structure */
ctx = SSL_CTX_new(meth);
RETURN_NULL(ctx);
char pkpassphrase[] = "password";
int pkpplen = strlen (pkpassphrase);
if( pkpplen > 0 )
{
SSL_CTX_set_default_passwd_cb(ctx, pem_passwd_cb);
SSL_CTX_set_default_passwd_cb_userdata(ctx, (void *) pkpassphrase);
}
/* Load the client certificate into the SSL_CTX structure */
if (SSL_CTX_use_certificate_file(ctx, "certs\\client-cert.pem", SSL_FILETYPE_PEM) <= 0)
{
ERR_print_errors_fp(stderr);
exit(1);
}
/* Load the private-key corresponding to the client certificate */
if (SSL_CTX_use_PrivateKey_file(ctx, "certs\\client-privkey.pem", SSL_FILETYPE_PEM) <= 0)
{
ERR_print_errors_fp(stderr);
exit(1);
}
Сертификат загружается без ошибок. Но SSL_CTX_use_certificate_file()
вызов возвращает эти ошибки.
4640:error:06074079:digital envelope routines:EVP_PBE_CipherInit:unknown pbe algorithm:.\crypto\evp\evp_pbe.c:89:TYPE=PBES2
4640:error:23077073:PKCS12 routines:PKCS12_pbe_crypt:pkcs12 algor cipherinit error:.\crypto\pkcs12\p12_decr.c:83:
4640:error:2306A075:PKCS12 routines:PKCS12_item_decrypt_d2i:pkcs12 pbe crypt error:.\crypto\pkcs12\p12_decr.c:123:
4640:error:0907B00D:PEM routines:PEM_READ_BIO_PRIVATEKEY:ASN1 lib:.\crypto\pem\pem_pkey.c:125:
4640:error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib:.\ssl\ssl_rsa.c:669:
Я использую эти сертификаты и ключи из хранилища ключей Java в моем клиенте Java без проблем.
Что мне не хватает? Как вы делаете это правильно? Любая помощь будет высоко оценен. Благодарю.
Задача ещё не решена.