我是使用iOS / macOS实用程序的业余开发人员,而且我正在努力使用某些openssl命令。 我在macos termninal
中执行openssl命令 openssl smime -sign -signer *certificate.cer* -inkey *miPrivateKey* -out *outFile* -in *inFile* -outform PEM -nodetach
我想知道与控制台命令相关的C函数。特别是这一个了。 如何查找从终端命令到执行函数的引用? 有没有办法知道调用哪些函数。 我已经成功加载了所有库和调用方法,但我不知道如何制作这个或调用哪些函数。
答案 0 :(得分:1)
这完全取决于参数,但这是SMIME
签名的要点。例如,我将此用于Apple-Wallet签名(删除错误检查以使其更简单):
#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格式输出,并删除“-nodetach”的PKCS7_DETACH
标记。
这个标志使用sha1摘要(Apple需要它)..如果需要,你可以更改摘要。
答案 1 :(得分:1)
我是使用iOS / macOS实用程序的业余开发者......
Apple发布了一个古老版本的OpenSSL。它的版本0.9.8。它的生命终结,以及它的缺失和好处,如TLS 1.2,服务器名称指示,大多数椭圆曲线设备等。
通常,您使用Homebrew或Macports来安装较新版本。为此,请参阅:
我在macos termninal
中执行openssl命令openssl smime...
smime
称为子命令。 OpenSSL有很多:
enc
dec
s_client
s_server
smime
我想知道与控制台命令相关的C函数。特别是这一个。
子命令的源代码位于<openssl src>/apps
目录中。对于smime
命令,请参阅smime.c
。