それはパラメータに完全に依存しますが、これは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;
}
秘密鍵(p12形式)、署名者証明書、署名するファイル、署名し、DER形式で出力します。これを修正してPEM形式で出力し、 "-nodetach"のフラグとしてPKCS7_DETACH
を削除することができます。
これはsha1ダイジェスト(Appleが要求したもの)を使用して署名しています。必要に応じてダイジェストを変更できます。
ありがとう!!!ちょうど私が必要としたもの –
私はこのファイルを読んでいたので、動作させることはできません。 ご協力ありがとうございます。 –
@Carlos - 私はおそらく髪の毛を分割していますが、 "...私は仕事をすることはできません" *あなたの質問の一部ではありませんでした。実際に、あなたは何を試したのか、何がうまくいかなかったのかは一度も述べていません。私は答えたあなたの質問を引用した。別の質問がある場合は、新しい質問をする必要があります – jww