2017-07-30 49 views
1

我是使用iOS/macOS實用程序的業餘愛好開發人員,而且我正在努力使用一些openssl命令。 我在MacOS的termninal從控制檯命令到功能的OpenSSL

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

我想知道與控制檯命令相關聯的C函數執行openssl指令。特別是這一個。 如何從終端命令找到執行的函數的引用? 有沒有辦法知道哪些函數被調用。 我已經成功加載了所有庫和調用方法,但我不知道如何創建這個庫或調用哪些函數。 非常感謝您的幫助。

回答

1

我使用的iOS/MacOS的公用事業hobbyst開發商...

蘋果分發的OpenSSL古代版。其版本0.9.8。它的生命週期結束,它的缺失很多,例如TLS 1.2,Sever Name Indication,大多數橢圓曲線齒輪等。

通常情況下,您可以使用Homebrew或Macports安裝更新的版本。爲此,請參見:


我在termninal openssl smime...

smime被稱爲子命令的MacOS執行openssl指令。OpenSSL的有很多,其中:

  • enc
  • dec
  • s_client
  • s_server
  • smime

我想知道與控制檯命令關聯的C函數。特別是這一個。

子命令的源代碼位於<openssl src>/apps目錄中。對於smime命令,請參閱smime.c

+0

謝謝!正是我所需要的 –

+0

我一直在閱讀這個文件,不能使事情工作。 感謝您的幫助@jww。 –

+0

@卡洛斯 - 我可能會分裂頭髮,但*「......我不能讓事情成功」*從來不是你的問題的一部分。事實上,你從來沒有說過你嘗試過什麼,或者事情沒有奏效。我引用了你的問題,我回答了。如果你有另一個問題,那麼你應該問一個新的問題 – jww

1

這完全取決於參數,但這是它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需要它)。如果需要,您可以更改摘要。

+0

我會嘗試你的代碼 –

+0

我很苦惱我無法加載私鑰。它採用pkcs10格式。所以,結果是一個NULL指針。 –

+0

感謝您的幫助@Brandon,但我無法讓事情順利進行。 –