這完全取決於參數,但這是它SMIME
簽署要點。例如,我用這個蘋果錢包簽名(去除錯誤檢查,以使其更簡單):
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/pkcs12.h>
#include <openssl/pem.h>
int main()
{
//Setup OpenSSL..
SSL_library_init();
OPENSSL_add_all_algorithms_noconf();
OpenSSL_add_all_digests();
//Load P12..
BIO* bio = BIO_new_file("p12", "rb");
PKCS12* p12 = d2i_PKCS12_bio(bio, nullptr);
BIO_free_all(bio);
EVP_PKEY* pkey = nullptr;
X509* certificate = nullptr;
PKCS12_parse(p12, "password", &pkey, &certificate, nullptr);
PKCS12_free(p12);
//Load certificate..
bio = BIO_new_file("pem", "rb");
X509* cert2 = PEM_read_bio_X509(bio, nullptr, nullptr, nullptr);
EVP_PKEY* pkey2 = PEM_read_bio_PrivateKey(bio, nullptr, nullptr, nullptr);
BIO_free_all(bio);
//Load digest..
const EVP_MD* md = EVP_get_digestbyname("sha1");
//Load file to sign..
bio = BIO_new_file("fileToSign", "rb");
//Sign the binary..
PKCS7* pkcs7 = PKCS7_sign(cert2, pkey2, nullptr, bio, PKCS7_BINARY | PKCS7_DETACHED | PKCS7_STREAM);
PKCS7_sign_add_signer(pkcs7, certificate, pkey, md, PKCS7_BINARY | PKCS7_DETACHED | PKCS7_STREAM);
PKCS7_add_certificate(pkcs7, cert2);
PKCS7_final(pkcs7, bio, PKCS7_BINARY | PKCS7_DETACHED | PKCS7_STREAM);
BIO_free_all(bio);
//Cleanup..
X509_free(cert2);
EVP_PKEY_free(pkey2);
X509_free(certificate);
EVP_PKEY_free(pkey);
//Save the signature to a file..
bio = BIO_new_file("Signature", "rb");
i2d_PKCS7_bio(bio, pkcs7);
BIO_free_all(bio);
PKCS7_free(pkcs7);
//Cleanup OpenSSL
EVP_cleanup();
CRYPTO_cleanup_all_ex_data();
return 0;
}
它將讀取您的PrivateKey(p12格式),您的簽名者證書,要簽名的文件,簽名並以DER格式輸出。您可以修改它以輸出PEM格式並刪除PKCS7_DETACH
標誌爲「-nodetach」。
這一個標誌使用sha1摘要(Apple需要它)。如果需要,您可以更改摘要。
謝謝!正是我所需要的 –
我一直在閱讀這個文件,不能使事情工作。 感謝您的幫助@jww。 –
@卡洛斯 - 我可能會分裂頭髮,但*「......我不能讓事情成功」*從來不是你的問題的一部分。事實上,你從來沒有說過你嘗試過什麼,或者事情沒有奏效。我引用了你的問題,我回答了。如果你有另一個問題,那麼你應該問一個新的問題 – jww