2016-09-23 9 views
0

PEM_write_X509(x509*)を使用して、SSLサーバーに接続するときに受け取った証明書を書きます。これはシングルスレッド環境では動作しますが、マルチスレッド環境では失敗します。PEM_write_X509(x509 *)とマルチスレッドプロセスでクラッシュする

PEM_write_X509_AUX()PEM_write_X509()の違いは何ですか?

write()コールを使用して証明書をダンプすることはできますか?

証明書ファイルをマルチスレッドアプリケーションに書き込むその他のオプションはありますか?

+0

* "これはシングルスレッド環境では動作しますが、マルチスレッド環境では失敗します。" * - ロックをインストールするコードを表示できます。しかし、私はその質問はそれなしで答えると思う。個人的には、おそらく他の問題があるので、私はマルチスレッドのクラッシュの問題を解決するでしょう。アプリのクラッシュは単なる症状またはインスタンスの問題です。 – jww

+0

*** "write()コールだけを使用して証明書をダンプすることはできますか?" *** - それは大きなNOです。 'X509 *'はインメモリのデータ構造です。その内部表現であり、シリアル化されることを意味しません。試してみると、いくつかのcertデータと多くのポインタが表示されます。 PEMでシリアライズするには 'PEM_write_bio_X509'、ASN.1/DER形式でシリアライズするには' i2d_X509_bio'のようなルーチンが必要です。 – jww

+0

はい。同意します.... – Naga

答えて

0

PEM_write_X509()の代わりに次のコードを使用した後、この問題を解決できます。

X509 *cert = GetPeerCertificate(hostname, port); 
if(cert) 
{ 
    unsigned char *data; 
    unsigned int len = 0; 
    BIO *bio = BIO_new(BIO_s_mem()); 
    PEM_write_bio_X509(bio, cert); 
    len = BIO_get_mem_data(bio, &data); 
    if(0 != Writeile(certificate_file, data, len)) 
    { 
     ret = ERROR; 
    } 
    BIO_free(bio); 
} 
関連する問題