OpenSSLを使用してプログラムでX509証明書を作成する
-
05-07-2019 - |
質問
C / C ++アプリケーションがあり、公開鍵と秘密鍵の両方を含むX509 pem証明書を作成する必要があります。証明書は自己署名でも署名なしでも構いません。
コマンドラインからではなく、アプリ内でこれを行いたい。
これを行うOpenSSL関数は何ですか?サンプルコードはボーナスです!
解決
最初に用語とメカニズムを理解する必要があります。
X.509 証明書には、定義により、秘密鍵が含まれていません。代わりに、公開鍵のCA署名バージョンです(CAが署名に入れる属性とともに)。 PEM形式は、キーと証明書の別々のストレージのみを実際にサポートします-ただし、2つを連結できます。
いずれにしても、OpenSSL APIの20以上の異なる機能を呼び出して、キーと自己署名証明書を作成する必要があります。例は、OpenSSLソース自体の demos / x509 / mkcert.c
より詳細な回答については、以下のネイサン・オスマンの説明をご覧ください。
他のヒント
これは非常に遅い(そして長い)答えだと気づきました。しかし、この質問が検索エンジンの結果でどれだけうまくランク付けされているかを考えると、まともな答えを書く価値があるかもしれないと考えました。
以下で読むものの多くは、このデモおよびOpenSSLドキュメント。以下のコードは、CとC ++の両方に適用されます。
実際に証明書を作成する前に、秘密鍵を作成する必要があります。 OpenSSLは、アルゴリズムに依存しない秘密鍵をメモリに保存するための EVP_PKEY
構造を提供します。この構造は openssl / evp.h
で宣言されていますが、 openssl / x509.h
(後で必要になります)に含まれているため、実際に明示的に含める必要はありません。ヘッダー。
EVP_PKEY
構造を割り当てるために、 <を使用しますcode> EVP_PKEY_new :
EVP_PKEY * pkey;
pkey = EVP_PKEY_new();
構造を解放するための対応する関数もあります- EVP_PKEY_free
-単一の引数を受け入れます:上記で初期化された EVP_PKEY
構造。
今、キーを生成する必要があります。この例では、RSAキーを生成します。これは、 RSA_generate_key
関数で宣言されています。 openssl / rsa.h
にあります。この関数は、 RSA
構造体へのポインタを返します。
関数の単純な呼び出しは次のようになります。
RSA * rsa;
rsa = RSA_generate_key(
2048, /* number of bits for the key - 2048 is a sensible value */
RSA_F4, /* exponent - RSA_F4 is defined as 0x10001L */
NULL, /* callback - can be NULL if we aren't displaying progress */
NULL /* callback argument - not needed in this case */
);
RSA_generate_key
の戻り値が NULL
の場合、何かがおかしかった。そうでない場合は、RSAキーがあり、以前の EVP_PKEY
構造に割り当てることができます。
EVP_PKEY_assign_RSA(pkey, rsa);
EVP_PKEY
構造が解放されると、 RSA
構造は自動的に解放されます。
証明書自体の説明
OpenSSLは、 X509
構造を使用して、メモリ内のx509証明書を表します。この構造体の定義は openssl / x509.h
にあります。最初に必要な関数は X509_new
です。 。その使用は比較的簡単です:
X509 * x509;
x509 = X509_new();
EVP_PKEY
の場合と同様に、構造を解放するための対応する関数- X509_free
があります。
ここで、いくつかの X509 _ *
関数を使用して、証明書のいくつかのプロパティを設定する必要があります。
ASN1_INTEGER_set(X509_get_serialNumber(x509), 1);
これにより、証明書のシリアル番号が「1」に設定されます。一部のオープンソースHTTPサーバーは、デフォルトのシリアル番号「0」の証明書の受け入れを拒否します。次のステップでは、証明書が実際に有効な期間を指定します。それには、次の2つの関数呼び出しを使用します。
X509_gmtime_adj(X509_get_notBefore(x509), 0);
X509_gmtime_adj(X509_get_notAfter(x509), 31536000L);
最初の行は、証明書の notBefore
プロパティを現在の時刻に設定します。 ( X509_gmtime_adj
関数は、指定された秒数を現在の時間に加算します-この場合はなしです。)2行目は、証明書の notAfter
プロパティを365日後(60秒* 60分* 24時間* 365日)。
ここで、以前に生成したキーを使用して証明書の公開キーを設定する必要があります。
X509_set_pubkey(x509, pkey);
これは自己署名証明書であるため、発行者の名前をサブジェクトの名前に設定します。そのプロセスの最初のステップは、サブジェクト名を取得することです:
X509_NAME * name;
name = X509_get_subject_name(x509);
以前にコマンドラインで自己署名証明書を作成したことがある場合、おそらく国コードの入力を求められたことを覚えているでしょう。組織( 'O')および共通名( 'CN')とともに提供する場所は次のとおりです。
X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC,
(unsigned char *)"CA", -1, -1, 0);
X509_NAME_add_entry_by_txt(name, "O", MBSTRING_ASC,
(unsigned char *)"MyCompany Inc.", -1, -1, 0);
X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC,
(unsigned char *)"localhost", -1, -1, 0);
(私はカナダ人であり、それが私たちの国であるため、ここでは値「CA」を使用しています
アプリ内からの system
呼び出しを介してこれを行う可能性はありますか?これを行ういくつかの正当な理由:
-
ライセンス:
openssl
実行可能ファイルを呼び出すと、ほぼ間違いなくアプリケーションから分離され、特定の利点が得られる可能性があります。免責事項:これについて弁護士に相談してください。 -
ドキュメント:OpenSSLには、潜在的に複雑なツールを大幅に簡素化する phenomenal コマンドラインドキュメントが付属しています。
-
テスト容易性:証明書の作成方法を正確に理解するまで、コマンドラインからOpenSSLを実行できます。オプションが多数あります。 すべての詳細が正しくなるまで、これに約1日を費やすことを期待してください。その後、コマンドをアプリに組み込むのは簡単です。
APIの使用を選択した場合、www.openssl.orgの openssl-dev
開発者リストを確認してください。
がんばって!
デジタル証明書を作成するための非常に簡単なチュートリアル http://publib.boulder.ibm.com/infocenter/rsthelp/v8r0m0/index.jsp?topic=/com.ibm.rational.test.lt.doc /topics/tcreatecertopenssl.html
これらのコマンドをコードから実行することについてはわかりません。