OpenSSL从控制台命令到功能

时间:2017-07-30 13:58:55

标签: ios c macos openssl

我是使用iOS / macOS实用程序的业余开发人员,而且我正在努力使用某些openssl命令。 我在macos termninal

中执行openssl命令

openssl smime -sign -signer *certificate.cer* -inkey *miPrivateKey* -out *outFile* -in *inFile* -outform PEM -nodetach

我想知道与控制台命令相关的C函数。特别是这一个了。 如何查找从终端命令到执行函数的引用? 有没有办法知道调用哪些函数。 我已经成功加载了所有库和调用方法,但我不知道如何制作这个或调用哪些函数。

2 个答案:

答案 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 smime...

中执行openssl命令

smime称为子命令。 OpenSSL有很多:

  • enc
  • dec
  • s_client
  • s_server
  • smime
  

我想知道与控制台命令相关的C函数。特别是这一个。

子命令的源代码位于<openssl src>/apps目录中。对于smime命令,请参阅smime.c